@interncom/diplomatic 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cli/index.mjs +2 -2
  2. package/dist/cli/shared/auth.d.ts +2 -2
  3. package/dist/cli/shared/bag.d.ts +7 -5
  4. package/dist/cli/shared/client.d.ts +10 -7
  5. package/dist/cli/shared/codec.d.ts +4 -0
  6. package/dist/cli/shared/codecs/kdm.d.ts +1 -0
  7. package/dist/cli/shared/crypto/bagman.d.ts +19 -0
  8. package/dist/cli/shared/crypto/binary.d.ts +1 -0
  9. package/dist/cli/shared/crypto/derivation.d.ts +1 -0
  10. package/dist/cli/shared/crypto/enclave.d.ts +25 -59
  11. package/dist/cli/shared/endpoint.d.ts +3 -4
  12. package/dist/cli/shared/sync.d.ts +2 -4
  13. package/dist/cli/shared/types.d.ts +0 -5
  14. package/dist/cli/src/index.d.ts +1 -1
  15. package/dist/web/client.d.ts +8 -2
  16. package/dist/web/entdb/idb.d.ts +1 -3
  17. package/dist/web/index.d.ts +5 -3
  18. package/dist/web/index.mjs +1 -1
  19. package/dist/web/objEq.d.ts +1 -0
  20. package/dist/web/shared/auth.d.ts +2 -2
  21. package/dist/web/shared/bag.d.ts +7 -5
  22. package/dist/web/shared/blobs.d.ts +25 -0
  23. package/dist/web/shared/client.d.ts +10 -7
  24. package/dist/web/shared/codec.d.ts +4 -0
  25. package/dist/web/shared/codecs/ent.d.ts +5 -0
  26. package/dist/web/shared/codecs/file.d.ts +2 -3
  27. package/dist/web/shared/codecs/fileHead.d.ts +6 -4
  28. package/dist/web/shared/codecs/fileIndexItem.d.ts +0 -1
  29. package/dist/web/shared/codecs/fileRealm.d.ts +9 -0
  30. package/dist/web/shared/codecs/kdm.d.ts +1 -0
  31. package/dist/web/shared/crypto/bagman.d.ts +19 -0
  32. package/dist/web/shared/crypto/binary.d.ts +1 -0
  33. package/dist/web/shared/crypto/derivation.d.ts +1 -0
  34. package/dist/web/shared/crypto/enclave.d.ts +25 -59
  35. package/dist/web/shared/crypto/exim.d.ts +22 -0
  36. package/dist/web/shared/crypto/export.d.ts +5 -0
  37. package/dist/web/shared/crypto/tty.d.ts +1 -1
  38. package/dist/web/shared/endpoint.d.ts +3 -4
  39. package/dist/web/shared/sync.d.ts +2 -4
  40. package/dist/web/shared/types.d.ts +0 -5
  41. package/dist/web/state.d.ts +1 -2
  42. package/dist/web/sync.d.ts +7 -8
  43. package/dist/web/types.d.ts +7 -2
  44. package/dist/web/worker/client.d.ts +6 -2
  45. package/dist/web/worker.mjs +1 -1
  46. package/package.json +1 -2
  47. package/dist/cli/bun/src/codec.d.ts +0 -3
  48. package/dist/web/shared/exim.d.ts +0 -24
@@ -1 +1 @@
1
- var tc=Object.defineProperty;var ec=(t)=>t;function nc(t,e){this[t]=ec.bind(null,e)}var sc=(t,e)=>{for(var n in e)tc(t,n,{get:e[n],enumerable:!0,configurable:!0,set:nc.bind(e,n)})};var v=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ut=64,lt=32,Rr=32,jt=8,Tn=32,Tr=30000,Yr=512,W;var K=v(()=>{((G)=>{G[G.Success=0]="Success";G[G.InvalidSignature=3]="InvalidSignature";G[G.ClockOutOfSync=4]="ClockOutOfSync";G[G.UserNotRegistered=5]="UserNotRegistered";G[G.ServerMisconfigured=6]="ServerMisconfigured";G[G.MissingBody=7]="MissingBody";G[G.ExtraBodyContent=8]="ExtraBodyContent";G[G.MissingParam=9]="MissingParam";G[G.InvalidParam=10]="InvalidParam";G[G.InvalidRequest=11]="InvalidRequest";G[G.InternalError=12]="InternalError";G[G.NotFound=13]="NotFound";G[G.InvalidMessage=14]="InvalidMessage";G[G.NoChange=15]="NoChange";G[G.DatabaseClosed=16]="DatabaseClosed";G[G.StorageError=17]="StorageError";G[G.DatabaseError=18]="DatabaseError";G[G.HashMismatch=19]="HashMismatch";G[G.DecryptionError=20]="DecryptionError";G[G.NotImplemented=21]="NotImplemented";G[G.MissingSeed=22]="MissingSeed";G[G.OutOfBounds=23]="OutOfBounds";G[G.HostError=24]="HostError";G[G.CommunicationError=25]="CommunicationError";G[G.VarLimitExceeded=26]="VarLimitExceeded";G[G.InvalidResponse=27]="InvalidResponse";G[G.ConnectionClosed=28]="ConnectionClosed";G[G.CryptoError=29]="CryptoError";G[G.WebAuthnError=30]="WebAuthnError"})(W||={})});function m(t){return[t,0]}function c(t){return[void 0,t]}var C=v(()=>{K()});function Rc(t){if(t<0)console.info("N",t),console.trace();if(typeof t!=="bigint")t=BigInt(t);if(t<0n)return c(10);let e=[];while(t>0n){let n=Number(t&0x7fn);if(t>>=7n,t>0n)e.push(n|128);else e.push(n)}if(e.length===0)return m(new Uint8Array([0]));if(e.length>8)return c(26);return m(new Uint8Array(e))}function Tc(t,e=0){let n=0n,s=0,i=e;while(!0){if(i>=t.length)return c(14);let r=t[i++];if(r===void 0)return c(14);if(n|=BigInt(r&127)<<BigInt(s),(r&128)===0){if(i-e>8)return c(26);return m({value:n>0x1fffffffffffffn?n:Number(n),bytesRead:i-e})}if(s+=7,s>=56)return c(26)}}class E{data;pos=0;constructor(t){this.data=t}static async fromResponse(t){let e=await t.arrayBuffer(),n=new Uint8Array(e);return new E(n)}readBigInt(){if(this.pos+8>this.data.length)return c(7);let t=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,m(t)}readDate(){let[t,e]=this.readVarInt();if(e!==0)return c(e);return m(new Date(t))}readVarInt(){let[t,e]=Tc(this.data,this.pos);if(e!==0)return c(e);this.pos+=t.bytesRead;let n=t.value;return m(typeof n==="bigint"?Number(n):n)}readVarString(){let[t,e]=this.readVarInt();if(e!==0)return c(e);let[n,s]=this.readBytes(t);if(s!==0)return c(s);let i=new TextDecoder().decode(n);return m(i)}readBytes(t){if(t<0)return c(10);if(this.pos+t>this.data.length)return c(23);let e=this.data.slice(this.pos,this.pos+t);return this.pos+=t,m(e)}readVarBytes(){let[t,e]=this.readVarInt();if(e!==0)return c(e);return this.readBytes(t)}readStruct(t){return t.decode(this)}readStructs(t){let e=[];while(!this.done()){let[n,s]=this.readStruct(t);if(s!==0)return c(s);e.push(n)}return m(e)}readBytesSeq(t){let e=[];while(!this.done()){let[n,s]=this.readBytes(t);if(s!==0)return c(s);e.push(n)}return m(e)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class z{parts=[];writeBigInt(t){let e=new Uint8Array(8);new DataView(e.buffer).setBigUint64(0,t,!1),this.parts.push(e)}writeDate(t){let e=t.getTime();return this.writeVarInt(e)}writeVarInt(t){let[e,n]=Rc(t);if(n!==0)return n;return this.parts.push(e),0}writeVarString(t){let e=new TextEncoder().encode(t),n=this.writeVarInt(e.length);if(n!==0)return n;return this.writeBytes(e),0}prependBytes(t){this.parts.unshift(t.slice())}writeBytes(t){this.parts.push(t.slice())}writeVarBytes(t){let e=this.writeVarInt(t.length);if(e!==0)return e;return this.writeBytes(t),0}writeStruct(t,e){return t.encode(this,e)}writeStructs(t,e){for(let n of e){let s=this.writeStruct(t,n);if(s!==0)return s}return 0}writeBytesSeq(t){for(let e of t)this.writeBytes(e)}result(){let t=this.parts.reduce((s,i)=>s+i.length,0),e=new Uint8Array(t),n=0;for(let s of this.parts)e.set(s,n),n+=s.length;return e}wipe(){for(let t of this.parts)t.fill(0);this.parts.length=0}*scan(){for(let t of this.parts)yield t}}var st=v(()=>{C();K()});var Cr;var Hr=v(()=>{K();C();Cr={encode(t,e){let n=t.writeVarString(e.label);if(n!==0)return n;let s=t.writeVarInt(e.index);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return c(n);let[s,i]=t.readVarInt();if(i!==0)return c(i);return m({label:e,index:s})}}});var ae;var kr=v(()=>{ae=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0});function Yn(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function ws(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function ct(t,...e){if(!ws(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function Us(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function Lr(t,e){ct(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Bs(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}var qe=()=>{};function Hc(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Cn(t){if(typeof t==="string")t=Hc(t);else if(ws(t))t=Hn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function Pr(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function Mr(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s++)n|=t[s]^e[s];return n===0}function Js(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(e.length!==t)throw Error("invalid output length, expected "+t+", got: "+e.length);if(n&&!kc(e))throw Error("invalid output, must be aligned");return e}function kc(t){return t.byteOffset%4===0}function Hn(t){return Uint8Array.from(t)}function kt(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}var Bt=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),Cc,wr=(t,e)=>{function n(s,...i){if(ct(s),t.nonceLength!==void 0){let u=i[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)ct(u);else ct(u,t.nonceLength)}let r=t.tagLength;if(r&&i[1]!==void 0)ct(i[1]);let o=e(s,...i),l=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");ct(p)}},a=!1;return{encrypt(u,p){if(a)throw Error("cannot encrypt() twice with same key + nonce");return a=!0,ct(u),l(o.encrypt.length,p),o.encrypt(u,p)},decrypt(u,p){if(ct(u),r&&u.length<r)throw Error("invalid ciphertext length: smaller than tagLength="+r);return l(o.decrypt.length,p),o.decrypt(u,p)}}}return Object.assign(n,t),n};var kn=v(()=>{qe();/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */Cc=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!Cc)throw Error("Non little-endian hardware is not supported")});function _e(t=32){if(ae&&typeof ae.getRandomValues==="function")return ae.getRandomValues(new Uint8Array(t));if(ae&&typeof ae.randomBytes==="function")return ae.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var Ur=v(()=>{kr()});function x(t,e){return t<<e|t>>>32-e}function zs(t){return t.byteOffset%4===0}function Bc(t,e,n,s,i,r,o,l){let a=i.length,d=new Uint8Array(Ln),u=Bt(d),p=zs(i)&&zs(r),y=p?Bt(i):Br,h=p?Bt(r):Br;for(let b=0;b<a;o++){if(t(e,n,s,u,o,l),o>=zr)throw Error("arx: counter overflow");let Z=Math.min(Ln,a-b);if(p&&Z===Ln){let X=b/4;if(b%4!==0)throw Error("arx: invalid block position");for(let f=0,S;f<Uc;f++)S=X+f,h[S]=y[S]^u[f];b+=Ln;continue}for(let X=0,f;X<Z;X++)f=b+X,r[f]=i[f]^d[X];b+=Z}}function Nr(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:i,counterRight:r,rounds:o}=Pr({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return Yn(i),Yn(o),Bs(r),Bs(n),(l,a,d,u,p=0)=>{ct(l),ct(a),ct(d);let y=d.length;if(u===void 0)u=new Uint8Array(y);if(ct(u),Yn(p),p<0||p>=zr)throw Error("arx: counter overflow");if(u.length<y)throw Error(`arx: output (${u.length}) is shorter than data (${y})`);let h=[],b=l.length,Z,X;if(b===32)h.push(Z=Hn(l)),X=wc;else if(b===16&&n)Z=new Uint8Array(32),Z.set(l),Z.set(l,16),X=Mc,h.push(Z);else throw Error(`arx: invalid 32-byte key, got length=${b}`);if(!zs(a))h.push(a=Hn(a));let f=Bt(Z);if(s){if(a.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(X,f,Bt(a.subarray(0,16)),f),a=a.subarray(16)}let S=16-i;if(S!==a.length)throw Error(`arx: nonce must be ${S} or 16 bytes`);if(S!==12){let V=new Uint8Array(12);V.set(a,r?0:12-a.length),a=V,h.push(a)}let g=Bt(a);return Bc(t,X,f,g,d,u,p,o),kt(...h),u}}var Jr=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),Lc,Pc,Mc,wc,Ln=64,Uc=16,zr=4294967295,Br;var Er=v(()=>{qe();kn();Lc=Jr("expand 16-byte k"),Pc=Jr("expand 32-byte k"),Mc=Bt(Lc),wc=Bt(Pc);Br=new Uint32Array});class Fr{constructor(t){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,t=Cn(t),ct(t,32);let e=pt(t,0),n=pt(t,2),s=pt(t,4),i=pt(t,6),r=pt(t,8),o=pt(t,10),l=pt(t,12),a=pt(t,14);this.r[0]=e&8191,this.r[1]=(e>>>13|n<<3)&8191,this.r[2]=(n>>>10|s<<6)&7939,this.r[3]=(s>>>7|i<<9)&8191,this.r[4]=(i>>>4|r<<12)&255,this.r[5]=r>>>1&8190,this.r[6]=(r>>>14|o<<2)&8191,this.r[7]=(o>>>11|l<<5)&8065,this.r[8]=(l>>>8|a<<8)&8191,this.r[9]=a>>>5&127;for(let d=0;d<8;d++)this.pad[d]=pt(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:i,r}=this,o=r[0],l=r[1],a=r[2],d=r[3],u=r[4],p=r[5],y=r[6],h=r[7],b=r[8],Z=r[9],X=pt(t,e+0),f=pt(t,e+2),S=pt(t,e+4),g=pt(t,e+6),V=pt(t,e+8),R=pt(t,e+10),k=pt(t,e+12),w=pt(t,e+14),I=i[0]+(X&8191),H=i[1]+((X>>>13|f<<3)&8191),P=i[2]+((f>>>10|S<<6)&8191),Y=i[3]+((S>>>7|g<<9)&8191),U=i[4]+((g>>>4|V<<12)&8191),G=i[5]+(V>>>1&8191),M=i[6]+((V>>>14|R<<2)&8191),J=i[7]+((R>>>11|k<<5)&8191),B=i[8]+((k>>>8|w<<8)&8191),Q=i[9]+(w>>>5|s),T=0,tt=T+I*o+H*(5*Z)+P*(5*b)+Y*(5*h)+U*(5*y);T=tt>>>13,tt&=8191,tt+=G*(5*p)+M*(5*u)+J*(5*d)+B*(5*a)+Q*(5*l),T+=tt>>>13,tt&=8191;let O=T+I*l+H*o+P*(5*Z)+Y*(5*b)+U*(5*h);T=O>>>13,O&=8191,O+=G*(5*y)+M*(5*p)+J*(5*u)+B*(5*d)+Q*(5*a),T+=O>>>13,O&=8191;let et=T+I*a+H*l+P*o+Y*(5*Z)+U*(5*b);T=et>>>13,et&=8191,et+=G*(5*h)+M*(5*y)+J*(5*p)+B*(5*u)+Q*(5*d),T+=et>>>13,et&=8191;let j=T+I*d+H*a+P*l+Y*o+U*(5*Z);T=j>>>13,j&=8191,j+=G*(5*b)+M*(5*h)+J*(5*y)+B*(5*p)+Q*(5*u),T+=j>>>13,j&=8191;let It=T+I*u+H*d+P*a+Y*l+U*o;T=It>>>13,It&=8191,It+=G*(5*Z)+M*(5*b)+J*(5*h)+B*(5*y)+Q*(5*p),T+=It>>>13,It&=8191;let Dt=T+I*p+H*u+P*d+Y*a+U*l;T=Dt>>>13,Dt&=8191,Dt+=G*o+M*(5*Z)+J*(5*b)+B*(5*h)+Q*(5*y),T+=Dt>>>13,Dt&=8191;let Ze=T+I*y+H*p+P*u+Y*d+U*a;T=Ze>>>13,Ze&=8191,Ze+=G*l+M*o+J*(5*Z)+B*(5*b)+Q*(5*h),T+=Ze>>>13,Ze&=8191;let Xe=T+I*h+H*y+P*p+Y*u+U*d;T=Xe>>>13,Xe&=8191,Xe+=G*a+M*l+J*o+B*(5*Z)+Q*(5*b),T+=Xe>>>13,Xe&=8191;let Ge=T+I*b+H*h+P*y+Y*p+U*u;T=Ge>>>13,Ge&=8191,Ge+=G*d+M*a+J*l+B*o+Q*(5*Z),T+=Ge>>>13,Ge&=8191;let fe=T+I*Z+H*b+P*h+Y*y+U*p;T=fe>>>13,fe&=8191,fe+=G*u+M*d+J*a+B*l+Q*o,T+=fe>>>13,fe&=8191,T=(T<<2)+T|0,T=T+tt|0,tt=T&8191,T=T>>>13,O+=T,i[0]=tt,i[1]=O,i[2]=et,i[3]=j,i[4]=It,i[5]=Dt,i[6]=Ze,i[7]=Xe,i[8]=Ge,i[9]=fe}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let o=2;o<10;o++)t[o]+=s,s=t[o]>>>13,t[o]&=8191;t[0]+=s*5,s=t[0]>>>13,t[0]&=8191,t[1]+=s,s=t[1]>>>13,t[1]&=8191,t[2]+=s,n[0]=t[0]+5,s=n[0]>>>13,n[0]&=8191;for(let o=1;o<10;o++)n[o]=t[o]+s,s=n[o]>>>13,n[o]&=8191;n[9]-=8192;let i=(s^1)-1;for(let o=0;o<10;o++)n[o]&=i;i=~i;for(let o=0;o<10;o++)t[o]=t[o]&i|n[o];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let r=t[0]+e[0];t[0]=r&65535;for(let o=1;o<8;o++)r=(t[o]+e[o]|0)+(r>>>16)|0,t[o]=r&65535;kt(n)}update(t){Us(this);let{buffer:e,blockLen:n}=this;t=Cn(t);let s=t.length;for(let i=0;i<s;){let r=Math.min(n-this.pos,s-i);if(r===n){for(;n<=s-i;i+=n)this.process(t,i);continue}if(e.set(t.subarray(i,i+r),this.pos),this.pos+=r,i+=r,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){kt(this.h,this.r,this.buffer,this.pad)}digestInto(t){Us(this),Lr(t,this),this.finished=!0;let{buffer:e,h:n}=this,{pos:s}=this;if(s){e[s++]=1;for(;s<16;s++)e[s]=0;this.process(e,0,!0)}this.finalize();let i=0;for(let r=0;r<8;r++)t[i++]=n[r]>>>0,t[i++]=n[r]>>>8;return t}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}}function Jc(t){let e=(s,i)=>t(i).update(Cn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var pt=(t,e)=>t[e++]&255|(t[e++]&255)<<8,Ns;var Qr=v(()=>{qe();kn();Ns=Jc((t)=>new Fr(t))});function zc(t,e,n,s,i,r=20){let o=t[0],l=e[0],a=e[1],d=e[2],u=e[3],p=t[1],y=n[0],h=n[1],b=i,Z=0,X=t[2],f=e[4],S=e[5],g=e[6],V=e[7],R=t[3],k=o,w=l,I=a,H=d,P=u,Y=p,U=y,G=h,M=b,J=Z,B=X,Q=f,T=S,tt=g,O=V,et=R;for(let It=0;It<r;It+=2)P^=x(k+T|0,7),M^=x(P+k|0,9),T^=x(M+P|0,13),k^=x(T+M|0,18),J^=x(Y+w|0,7),tt^=x(J+Y|0,9),w^=x(tt+J|0,13),Y^=x(w+tt|0,18),O^=x(B+U|0,7),I^=x(O+B|0,9),U^=x(I+O|0,13),B^=x(U+I|0,18),H^=x(et+Q|0,7),G^=x(H+et|0,9),Q^=x(G+H|0,13),et^=x(Q+G|0,18),w^=x(k+H|0,7),I^=x(w+k|0,9),H^=x(I+w|0,13),k^=x(H+I|0,18),U^=x(Y+P|0,7),G^=x(U+Y|0,9),P^=x(G+U|0,13),Y^=x(P+G|0,18),Q^=x(B+J|0,7),M^=x(Q+B|0,9),J^=x(M+Q|0,13),B^=x(J+M|0,18),T^=x(et+O|0,7),tt^=x(T+et|0,9),O^=x(tt+T|0,13),et^=x(O+tt|0,18);let j=0;s[j++]=o+k|0,s[j++]=l+w|0,s[j++]=a+I|0,s[j++]=d+H|0,s[j++]=u+P|0,s[j++]=p+Y|0,s[j++]=y+U|0,s[j++]=h+G|0,s[j++]=b+M|0,s[j++]=Z+J|0,s[j++]=X+B|0,s[j++]=f+Q|0,s[j++]=S+T|0,s[j++]=g+tt|0,s[j++]=V+O|0,s[j++]=R+et|0}function Nc(t,e,n,s){let i=t[0],r=e[0],o=e[1],l=e[2],a=e[3],d=t[1],u=n[0],p=n[1],y=n[2],h=n[3],b=t[2],Z=e[4],X=e[5],f=e[6],S=e[7],g=t[3];for(let R=0;R<20;R+=2)a^=x(i+X|0,7),y^=x(a+i|0,9),X^=x(y+a|0,13),i^=x(X+y|0,18),h^=x(d+r|0,7),f^=x(h+d|0,9),r^=x(f+h|0,13),d^=x(r+f|0,18),S^=x(b+u|0,7),o^=x(S+b|0,9),u^=x(o+S|0,13),b^=x(u+o|0,18),l^=x(g+Z|0,7),p^=x(l+g|0,9),Z^=x(p+l|0,13),g^=x(Z+p|0,18),r^=x(i+l|0,7),o^=x(r+i|0,9),l^=x(o+r|0,13),i^=x(l+o|0,18),u^=x(d+a|0,7),p^=x(u+d|0,9),a^=x(p+u|0,13),d^=x(a+p|0,18),Z^=x(b+h|0,7),y^=x(Z+b|0,9),h^=x(y+Z|0,13),b^=x(h+y|0,18),X^=x(g+S|0,7),f^=x(X+g|0,9),S^=x(f+X|0,13),g^=x(S+f|0,18);let V=0;s[V++]=i,s[V++]=d,s[V++]=b,s[V++]=g,s[V++]=u,s[V++]=p,s[V++]=y,s[V++]=h}var Es,Fs;var vr=v(()=>{Er();qe();Qr();kn();Es=Nr(zc,{counterRight:!0,extendNonceFn:Nc}),Fs=wr({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=Js(n.length+32,s,!1);let i=s.subarray(0,32),r=s.subarray(32);s.set(n,32),kt(i),Es(t,e,s,s);let o=Ns(r,i);return s.set(o,16),kt(s.subarray(0,16),o),s.subarray(16)},decrypt(n,s){ct(n),s=Js(n.length+32,s,!1);let i=s.subarray(0,32),r=s.subarray(32,48),o=s.subarray(48);s.set(n,32),kt(i);let l=Es(t,e,i,i),a=Ns(o,l);if(!Mr(r,a))throw Error("invalid tag");return Es(t,e,s.subarray(16),s.subarray(16)),kt(i,r,a),o}}))});function Ec(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function $e(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function de(t,...e){if(!Ec(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function tn(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function Pn(t,e){de(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Dr(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function ge(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function Ke(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function en(t,e){return t<<32-e|t>>>e}function jr(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}function Fc(t){for(let e=0;e<t.length;e++)t[e]=jr(t[e]);return t}function Qc(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function xe(t){if(typeof t==="string")t=Qc(t);return de(t),t}class Qs{}function qr(t){let e=(s,i)=>t(i).update(xe(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var Or,Ar,Zt;var Mn=v(()=>{/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */Or=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();Ar=Or?(t)=>t:(t)=>jr(t);Zt=Or?(t)=>t:Fc});var _r;var $r=v(()=>{_r=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225])});function vs(t,e=!1){if(e)return{h:Number(t&wn),l:Number(t>>to&wn)};return{h:Number(t>>to&wn)|0,l:Number(t&wn)|0}}var wn,to;var eo=v(()=>{wn=BigInt(4294967295),to=BigInt(32)});function Jt(t,e,n,s,i){return t=t+e+i|0,s=en(s^t,16),n=n+s|0,e=en(e^n,12),{a:t,b:e,c:n,d:s}}function zt(t,e,n,s,i){return t=t+e+i|0,s=en(s^t,8),n=n+s|0,e=en(e^n,7),{a:t,b:e,c:n,d:s}}var no=v(()=>{Mn()});function Os(t,e,n,s,i,r,o,l,a,d,u,p,y,h,b,Z,X,f,S,g){let V=0;for(let R=0;R<s;R++)({a:i,b:a,c:y,d:X}=Jt(i,a,y,X,n[e+t[V++]])),{a:i,b:a,c:y,d:X}=zt(i,a,y,X,n[e+t[V++]]),{a:r,b:d,c:h,d:f}=Jt(r,d,h,f,n[e+t[V++]]),{a:r,b:d,c:h,d:f}=zt(r,d,h,f,n[e+t[V++]]),{a:o,b:u,c:b,d:S}=Jt(o,u,b,S,n[e+t[V++]]),{a:o,b:u,c:b,d:S}=zt(o,u,b,S,n[e+t[V++]]),{a:l,b:p,c:Z,d:g}=Jt(l,p,Z,g,n[e+t[V++]]),{a:l,b:p,c:Z,d:g}=zt(l,p,Z,g,n[e+t[V++]]),{a:i,b:d,c:b,d:g}=Jt(i,d,b,g,n[e+t[V++]]),{a:i,b:d,c:b,d:g}=zt(i,d,b,g,n[e+t[V++]]),{a:r,b:u,c:Z,d:X}=Jt(r,u,Z,X,n[e+t[V++]]),{a:r,b:u,c:Z,d:X}=zt(r,u,Z,X,n[e+t[V++]]),{a:o,b:p,c:y,d:f}=Jt(o,p,y,f,n[e+t[V++]]),{a:o,b:p,c:y,d:f}=zt(o,p,y,f,n[e+t[V++]]),{a:l,b:a,c:h,d:S}=Jt(l,a,h,S,n[e+t[V++]]),{a:l,b:a,c:h,d:S}=zt(l,a,h,S,n[e+t[V++]]);return{v0:i,v1:r,v2:o,v3:l,v4:a,v5:d,v6:u,v7:p,v8:y,v9:h,v10:b,v11:Z,v12:X,v13:f,v14:S,v15:g}}var Ds;var so=v(()=>{no();Mn();Ds=class Ds extends Qs{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,$e(t),$e(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=ge(this.buffer)}update(t){tn(this),t=xe(t),de(t);let{blockLen:e,buffer:n,buffer32:s}=this,i=t.length,r=t.byteOffset,o=t.buffer;for(let l=0;l<i;){if(this.pos===e)Zt(s),this.compress(s,0,!1),Zt(s),this.pos=0;let a=Math.min(e-this.pos,i-l),d=r+l;if(a===e&&!(d%4)&&l+a<i){let u=new Uint32Array(o,d,Math.floor((i-l)/4));Zt(u);for(let p=0;l+e<i;p+=s.length,l+=e)this.length+=e,this.compress(u,p,!1);Zt(u);continue}n.set(t.subarray(l,l+a),this.pos),this.pos+=a,this.length+=a,l+=a}return this}digestInto(t){tn(this),Pn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,Ke(this.buffer.subarray(e)),Zt(n),this.compress(n,0,!0),Zt(n);let s=ge(t);this.get().forEach((i,r)=>s[r]=Ar(i))}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}_cloneInto(t){let{buffer:e,length:n,finished:s,destroyed:i,outputLen:r,pos:o}=this;return t||(t=new this.constructor({dkLen:r})),t.set(...this.get()),t.buffer.set(e),t.destroyed=i,t.finished=s,t.length=n,t.pos=o,t.outputLen=r,t}clone(){return this._cloneInto()}}});var Lt,Nt,io,js,As;var ro=v(()=>{$r();eo();so();Mn();Lt={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},Nt=_r.slice(),io=(()=>{let t=Array.from({length:16},(s,i)=>i),e=(s)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((i)=>s[i]),n=[];for(let s=0,i=t;s<7;s++,i=e(i))n.push(...i);return Uint8Array.from(n)})();js=class js extends Ds{constructor(t={},e=0){super(64,t.dkLen===void 0?32:t.dkLen);this.chunkPos=0,this.chunksDone=0,this.flags=0,this.stack=[],this.posOut=0,this.bufferOut32=new Uint32Array(16),this.chunkOut=0,this.enableXOF=!0;let{key:n,context:s}=t,i=s!==void 0;if(n!==void 0){if(i)throw Error('Only "key" or "context" can be specified at same time');let r=xe(n).slice();de(r,32),this.IV=ge(r),Zt(this.IV),this.flags=e|Lt.KEYED_HASH}else if(i){let r=xe(s),o=new js({dkLen:32},Lt.DERIVE_KEY_CONTEXT).update(r).digest();this.IV=ge(o),Zt(this.IV),this.flags=e|Lt.DERIVE_KEY_MATERIAL}else this.IV=Nt.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=Dr(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:i,pos:r}=this,{h:o,l}=vs(BigInt(t),!0),{v0:a,v1:d,v2:u,v3:p,v4:y,v5:h,v6:b,v7:Z,v8:X,v9:f,v10:S,v11:g,v12:V,v13:R,v14:k,v15:w}=Os(io,s,n,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],Nt[0],Nt[1],Nt[2],Nt[3],o,l,r,e);i[0]=a^X,i[1]=d^f,i[2]=u^S,i[3]=p^g,i[4]=y^V,i[5]=h^R,i[6]=b^k,i[7]=Z^w}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=Lt.CHUNK_START;if(this.chunkPos===15||n)s|=Lt.CHUNK_END;if(!n)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,s,t,e),this.chunkPos+=1,this.chunkPos===16||n){let i=this.state;this.state=this.IV.slice();for(let r,o=this.chunksDone+1;n||!(o&1);o>>=1){if(!(r=this.stack.pop()))break;this.buffer32.set(r,0),this.buffer32.set(i,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|Lt.PARENT,this.buffer32,0),i=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(i)}this.pos=0}_cloneInto(t){t=super._cloneInto(t);let{IV:e,flags:n,state:s,chunkPos:i,posOut:r,chunkOut:o,stack:l,chunksDone:a}=this;return t.state.set(s.slice()),t.stack=l.map((d)=>Uint32Array.from(d)),t.IV.set(e),t.flags=n,t.chunkPos=i,t.chunksDone=a,t.posOut=r,t.chunkOut=o,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,Ke(this.state,this.buffer32,this.IV,this.bufferOut32),Ke(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:i}=this,{h:r,l:o}=vs(BigInt(this.chunkOut++));Zt(s);let{v0:l,v1:a,v2:d,v3:u,v4:p,v5:y,v6:h,v7:b,v8:Z,v9:X,v10:f,v11:S,v12:g,v13:V,v14:R,v15:k}=Os(io,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],Nt[0],Nt[1],Nt[2],Nt[3],o,r,e,n);i[0]=l^Z,i[1]=a^X,i[2]=d^f,i[3]=u^S,i[4]=p^g,i[5]=y^V,i[6]=h^R,i[7]=b^k,i[8]=t[0]^Z,i[9]=t[1]^X,i[10]=t[2]^f,i[11]=t[3]^S,i[12]=t[4]^g,i[13]=t[5]^V,i[14]=t[6]^R,i[15]=t[7]^k,Zt(s),Zt(i),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,Ke(this.buffer.subarray(this.pos));let t=this.flags|Lt.ROOT;if(this.stack.length)t|=Lt.PARENT,Zt(this.buffer32),this.compress(this.buffer32,0,!0),Zt(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?Lt.CHUNK_START:0)|Lt.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){tn(this,!1),de(t),this.finish();let{blockLen:e,bufferOut:n}=this;for(let s=0,i=t.length;s<i;){if(this.posOut>=e)this.b2CompressOut();let r=Math.min(e-this.posOut,i-s);t.set(n.subarray(this.posOut,this.posOut+r),s),this.posOut+=r,s+=r}return t}xofInto(t){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(t)}xof(t){return $e(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(Pn(t,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}};As=qr((t)=>new js(t))});function Tt(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function nn(t){if(t.length%2!==0)throw Error("Invalid hex string");let e=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2)e[n/2]=Number.parseInt(t.substr(n,2),16);return e}function D(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;return t.every((n,s)=>n===e[s])}function qs(t){return L(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function _s(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return yt(n)}function ue(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}var L,yt;var it=v(()=>{if(typeof Uint8Array.prototype.toBase64==="function")L=(t)=>t.toBase64();else L=(t)=>btoa(String.fromCharCode(...t));if(typeof Uint8Array.fromBase64==="function")yt=(t)=>Uint8Array.fromBase64(t);else yt=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0))});function oo(t){if(t.byteLength!==vc)return c(10);return m(t)}function co(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function Oc(t){let e=new Uint8Array(32),n=(t%A+A)%A;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function jc(t){let e=t.slice();return e[31]&=127,co(e)}function Ac(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function Un(t,e,n){let s=-t,i=(e^n)&s;return[e^i,n^i]}function qc(t){let e=A-2n,n=(t%A+A)%A,s=1n;while(e>0n){if(e&1n)s=s*n%A;n=n*n%A,e>>=1n}return s}function $s(t,e){let n=Ac(t),s=jc(e),i=1n,r=0n,o=s,l=1n,a=0n,d=co(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;a^=p,[i,o]=Un(a,i,o),[r,l]=Un(a,r,l),a=p;let y=(i+r)%A,h=y*y%A,b=(i-r+A)%A,Z=b*b%A,X=(h-Z+A)%A,f=(o+l)%A,g=(o-l+A)%A*y%A,V=f*b%A,R=(g+V)%A,k=(g-V+A)%A;o=R*R%A,l=s*k*k%A,i=h*Z%A,r=X*(h+Dc*X)%A}return[i,o]=Un(a,i,o),[r,l]=Un(a,r,l),n.fill(0),Oc(i*qc(r)%A)}function ao(t){return $s(t,lo)}var vc=32,lm,A,Dc=121665n,lo;var uo=v(()=>{K();C();lm=Symbol("X25519Sk");A=(1n<<255n)-19n,lo=new Uint8Array(32);lo[0]=9});function po(t){let e=new Uint8Array(ti.length+32);return e.set(ti),e.set(t.subarray(0,32),ti.length),e}function mo(t){let e=new Uint8Array(ei.length+32);return e.set(ei),e.set(t.subarray(0,32),ei.length),e}function yo(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Et(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}async function _c(t){return _e(t)}async function ni(){return _e(32)}async function sn(t,e){let n=_e(24),i=Fs(e,n).encrypt(t);return new Uint8Array([...n,...i])}async function Re(t,e){let n=t.slice(0,24),s=t.slice(24);return Fs(e,n).decrypt(s)}async function si(t){let e=t,n=po(e),s=Et(n),i;try{let d=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!0,["sign"]);i=await globalThis.crypto.subtle.exportKey("jwk",d)}finally{n.fill(0),new Uint8Array(s).fill(0)}if(typeof i.x!=="string")throw Error("Ed25519 JWK missing x");let r=i.x;i.d=void 0;let o=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:r},{name:"Ed25519"},!0,["verify"]),l=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",o)),a=new Uint8Array(64);return a.set(e,0),a.set(l,32),{keyType:"ed25519",privateKey:a,publicKey:l}}async function $c(t){let e=t.subarray(0,32),n=po(e),s=Et(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async function ta(t){return await globalThis.crypto.subtle.importKey("raw",Et(t),{name:"Ed25519"},!1,["verify"])}async function ii(t,e){let n=yo(t),s=await $c(e),i=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Et(n));return new Uint8Array(i)}async function ea(t,e,n){let s=yo(e);try{return await globalThis.crypto.subtle.verify({name:"Ed25519"},n,Et(t),Et(s))}catch{return!1}}async function rn(t,e){if(e===void 0)return As(t);return As(t,e)}async function ri(){let t=await _e(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=oo(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=ao(e),i=mo(e),r=Et(i);try{let o=await globalThis.crypto.subtle.importKey("pkcs8",r,{name:"X25519"},!0,["deriveBits"]),l=await globalThis.crypto.subtle.exportKey("jwk",o);if(typeof l.x!=="string")throw Error("X25519 JWK missing x");let a=_s(l.x);if(l.d=void 0,!D(a,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(o){throw e.fill(0),o}finally{i.fill(0),new Uint8Array(r).fill(0)}}async function ho(t,e){let n=mo(t),s=Et(n);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),r=await globalThis.crypto.subtle.importKey("raw",Et(e),{name:"X25519"},!1,[]),o=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:r},i,256);return new Uint8Array(o)}catch{return $s(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}function na(t){return Object.freeze(t),t}var ti,ei,bo;var on=v(()=>{Ur();vr();ro();it();K();uo();ti=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);ei=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);bo=na({genRandomBytes:_c,gen256BitSecureRandomSeed:ni,encryptXSalsa20Poly1305Combined:sn,decryptXSalsa20Poly1305Combined:Re,deriveEd25519KeyPair:si,signEd25519:ii,importVerifyKey:ta,checkSigEd25519:ea,blake3:rn})});function sa(t,e){return t}function Zo(t){return t}function Ft(t,e){if(t.byteLength!==lt)return c(10);return m(Zo(t))}function Qt(t){return Ft(t,nt.HostRLM)}function ia(t){if(t instanceof Uint8Array)return m(t);let e=new z,n=Cr.encode(e,t);if(n!==0)return c(n);return m(e.result())}async function Xo(t,e){try{return m(await rn(t,e))}catch{return c(29)}}async function ra({parent:t,purpose:e}){let[n,s]=await Xo(t,{context:e});if(s!==0)return c(s);return m(sa(n,e))}async function oa({pdk:t,kdm:e}){let[n,s]=ia(e);if(s!==0)return c(s);let[i,r]=await Xo(n,{key:t});if(r!==0)return c(r);return m(Zo(i))}async function Wt({parent:t,purpose:e,kdm:n}){let[s,i]=await ra({parent:t,purpose:e});if(i!==0)return c(i);try{return await oa({pdk:s,kdm:n})}finally{s.fill(0)}}var nt,Sm,Im,F;var at=v(()=>{st();Hr();K();C();on();nt={Identity:"diplomatic.identity.v1",Cipher:"diplomatic.cipher.v1",Bind:"diplomatic.bind.v1",BindTag:"diplomatic.bindtag.v1",Fingerprint:"diplomatic.fingerprint.v1",Pair:"diplomatic.qrpair.v1",BagKdm:"diplomatic.bagkdm.v1",RealmKey:"diplomatic.realmKey.v1",RealmID:"diplomatic.realmID.v1",HostRLM:"diplomatic.hostRLM.v1"},Sm=Symbol("PurposeDerivedKey"),Im=Symbol("ChildKey"),F=Object.freeze({label:"",index:0})});function $t(t){if(t.byteLength!==bi)return c(10);return m(t)}var ob,lb,gt=32,bi;var He=v(()=>{K();C();ob=Symbol("MasterSeed"),lb=Symbol("SealedMasterKey"),bi=24+gt+16});var rs;var Ti=v(()=>{K();C();rs={encode(t,e){let n=t.writeVarString(e.handle);if(n!==0)return n;let s=t.writeVarString(e.label);if(s!==0)return s;return t.writeVarInt(e.idx??0)},decode(t){let[e,n]=t.readVarString();if(n!==0)return c(n);let[s,i]=t.readVarString();if(i!==0)return c(i);let[r,o]=t.readVarInt();if(o!==0)return c(o);return m({handle:e,label:s,idx:r})}}});var Yi;var jo=v(()=>{K();C();Ti();Ti();Yi={encode(t,e){let n=t.writeVarInt(e.hosts.length);if(n!==0)return n;for(let s of e.hosts){let i=t.writeStruct(rs,s);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return c(n);if(e===void 0||e<0)return c(10);let s=[];for(let i=0;i<e;i++){let[r,o]=t.readStruct(rs);if(o!==0)return c(o);if(r===void 0)return c(14);s.push(r)}return m({hosts:s})}}});function Ci(t){if(t.byteLength!==Je)return c(10);return m(t)}function Hi(t){if(t.byteLength<ga)return c(10);return m(t)}async function Ao(t,e,n,s){if(e.byteLength!==Je)return c(10);let i;try{i=await ho(t,e)}catch{return c(29)}try{if(i.byteLength!==Je||i.every((o)=>o===0))return c(10);let r=ue(n,s);try{let[o,l]=await Wt({parent:i,purpose:nt.Pair,kdm:r});if(l!==0)return c(l);return m(o)}finally{r.fill(0)}}finally{i.fill(0)}}async function qo(t){let e;try{e=await ri()}catch{return c(29)}try{let[n,s]=await Ao(e.priv,t,t,e.pub);if(s!==0)return c(s);return m({key:n,pub:e.pub})}finally{e.priv.fill(0)}}function _o(t){for(let e of Object.getOwnPropertyNames(t)){if(Ka.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}class ze{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await ri();t=e.priv;let[n,s]=Ci(e.pub);if(s!==0)return c(s);let i=new ze(t,n);return t=void 0,m(i)}catch{return c(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}dhkeReq(){let t=this.#e.slice(),[e,n]=Ci(t);if(n!==0)return c(n);return m(e)}async finish(t){let e=t.subarray(0,Je),n=t.subarray(Je),[s,i]=await Ao(this.#t,e,this.#e,e);if(i!==0)return c(i);let r;try{try{r=await Re(n,s)}catch{return c(20)}let{fromSeedHosts:o}=await Promise.resolve().then(() => (Ne(),$o)),l=o(r);if(l[1]===0)this.wipe();return l}finally{s.fill(0),r?.fill(0)}}}var Je=32,ga,z0,N0,Ka;var ki=v(()=>{it();K();C();at();on();ga=Je+24+16,z0=Symbol("DHKEReq"),N0=Symbol("DHKEResp");Ka=new Set(["constructor","prototype","length","name"]);_o(ze);_o(ze.prototype)});function Mt(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}function nl(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function wt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function cs(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function ie(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return c(9);return m(nl(location.hostname))}function Ya(){return Mi}function Ct(t){if(t instanceof Error){Mi=t.message===""?t.name:`${t.name}: ${t.message}`;return}Mi=String(t)}function as(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function tl(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function Ee(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function ds(t=2500){if(tl())return Ee(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(i),document.removeEventListener("visibilitychange",s),Ee(),e()},s=()=>{if(tl())n()},i=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function us(t){await ds();try{return await navigator.credentials.create(t)}catch(e){if(!as(e))throw e;return Ee(),await navigator.credentials.create(t)}}async function ps(t){await ds();try{return await navigator.credentials.get(t)}catch(e){if(!as(e))throw e;return Ee(),await navigator.credentials.get(t)}}function re(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function oe(t){if(t===null||t.type!==Yt||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return c(27);return m(t)}async function ms(t){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!=="function")return!0;let n=await e.call(PublicKeyCredential);if(t in n)return n[t]===!0;return!0}function wi(t){if(t==="platform"||t==="cross-platform")return t;return}function sl(t){if(/iPhone|iPad|iPod/i.test(t))return"ios";if(/Android/i.test(t))return"android";if(/Mac OS X|Macintosh/i.test(t))return"macos";if(/Windows/i.test(t))return"windows";if(/Linux/i.test(t))return"linux";return"other"}function Ui(t){let e=t.response;if(!("getTransports"in e))return;let n=e.getTransports;if(typeof n!=="function")return;let s=n.call(e);if(!Array.isArray(s))return;let i=[];for(let r of s)if(typeof r==="string"&&r.length>0)i.push(r);return i.length===0?void 0:i}function il(t){let e=t.response;if(!("getAuthenticatorData"in e))return;let n=e.getAuthenticatorData;if(typeof n!=="function")return;let s=n.call(e);if(!(s instanceof ArrayBuffer))return;let i=new Uint8Array(s);if(i.byteLength<Pi+el)return;let r=i[Ca];if(r===void 0||(r&Ha)===0)return;return i.slice(Pi,Pi+el)}var se=32,os="DIPLOMATIC",Yt="public-key",xa=-7,Ra=-8,Ta=-257,ls,Mi="",Ca=32,Ha=64,Pi=37,el=16;var le=v(()=>{K();C();ls=[{type:Yt,alg:xa},{type:Yt,alg:Ra},{type:Yt,alg:Ta}]});function ka(){return ms("extension:largeBlob")}async function rl(t){let e=re();if(e!==0)return c(e);let[n,s]=ie(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.userName??t?.rpName??n,r={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)r.authenticatorAttachment=t.authenticatorAttachment;let o={largeBlob:{support:"required"}},l;try{l=await us({publicKey:{challenge:Mt(se),rp:{id:n,name:t?.rpName??os},user:{id:Mt(16),name:i,displayName:i},pubKeyCredParams:ls,authenticatorSelection:r,extensions:o,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Ct(p),c(30)}let[a,d]=oe(l);if(d!==0)return c(d);if(a===void 0)return c(27);if(a.getClientExtensionResults().largeBlob?.supported!==!0)return c(30);return m(new Uint8Array(a.rawId))}async function Bi(t,e,n,s){let i={challenge:Mt(se),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)i.hints=e.hints;if(n!==void 0)i.allowCredentials=[{type:Yt,id:wt(n)}];if(s!==void 0)i.extensions=s;let r;try{r=await ps({publicKey:i})}catch(a){return Ct(a),c(30)}let[o,l]=oe(r);if(l!==0)return c(l);if(o===void 0)return c(27);return m(o)}async function ol(t,e){let n=re();if(n!==0)return c(n);let[s,i]=ie(e);if(i!==0)return c(i);if(s===void 0)return c(9);let r=t;if(r===void 0){let[p,y]=await Bi(s,e);if(y!==0&&e?.hints!==void 0)[p,y]=await Bi(s,{rpId:e.rpId,rpName:e.rpName});if(y!==0)return c(y);if(p===void 0)return c(27);r=new Uint8Array(p.rawId)}let[o,l]=await Bi(s,e,r,{largeBlob:{read:!0}});if(l!==0)return c(l);if(o===void 0)return c(27);let d=o.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return c(7);let u=cs(d.blob);if(u.byteLength===0)return c(7);return m({blob:u,credId:new Uint8Array(o.rawId)})}var ys=v(()=>{K();C();le()});var hs="dmFyIERhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgQmE9KGUpPT5lO2Z1bmN0aW9uIFVhKGUsdCl7dGhpc1tlXT1CYS5iaW5kKG51bGwsdCl9dmFyIHZhPShlLHQpPT57Zm9yKHZhciByIGluIHQpRGEoZSxyLHtnZXQ6dFtyXSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxzZXQ6VWEuYmluZCh0LHIpfSl9O3ZhciBxPShlLHQpPT4oKT0+KGUmJih0PWUoZT0wKSksdCk7dmFyIFJlPTY0LG9lPTMyLEhzPTMyLE5lPTgscnI9MzIsS3M9MzAwMDAsTHM9NTEyLFA7dmFyIEI9cSgoKT0+eygoYik9PntiW2IuU3VjY2Vzcz0wXT0iU3VjY2VzcyI7YltiLkludmFsaWRTaWduYXR1cmU9M109IkludmFsaWRTaWduYXR1cmUiO2JbYi5DbG9ja091dE9mU3luYz00XT0iQ2xvY2tPdXRPZlN5bmMiO2JbYi5Vc2VyTm90UmVnaXN0ZXJlZD01XT0iVXNlck5vdFJlZ2lzdGVyZWQiO2JbYi5TZXJ2ZXJNaXNjb25maWd1cmVkPTZdPSJTZXJ2ZXJNaXNjb25maWd1cmVkIjtiW2IuTWlzc2luZ0JvZHk9N109Ik1pc3NpbmdCb2R5IjtiW2IuRXh0cmFCb2R5Q29udGVudD04XT0iRXh0cmFCb2R5Q29udGVudCI7YltiLk1pc3NpbmdQYXJhbT05XT0iTWlzc2luZ1BhcmFtIjtiW2IuSW52YWxpZFBhcmFtPTEwXT0iSW52YWxpZFBhcmFtIjtiW2IuSW52YWxpZFJlcXVlc3Q9MTFdPSJJbnZhbGlkUmVxdWVzdCI7YltiLkludGVybmFsRXJyb3I9MTJdPSJJbnRlcm5hbEVycm9yIjtiW2IuTm90Rm91bmQ9MTNdPSJOb3RGb3VuZCI7YltiLkludmFsaWRNZXNzYWdlPTE0XT0iSW52YWxpZE1lc3NhZ2UiO2JbYi5Ob0NoYW5nZT0xNV09Ik5vQ2hhbmdlIjtiW2IuRGF0YWJhc2VDbG9zZWQ9MTZdPSJEYXRhYmFzZUNsb3NlZCI7YltiLlN0b3JhZ2VFcnJvcj0xN109IlN0b3JhZ2VFcnJvciI7YltiLkRhdGFiYXNlRXJyb3I9MThdPSJEYXRhYmFzZUVycm9yIjtiW2IuSGFzaE1pc21hdGNoPTE5XT0iSGFzaE1pc21hdGNoIjtiW2IuRGVjcnlwdGlvbkVycm9yPTIwXT0iRGVjcnlwdGlvbkVycm9yIjtiW2IuTm90SW1wbGVtZW50ZWQ9MjFdPSJOb3RJbXBsZW1lbnRlZCI7YltiLk1pc3NpbmdTZWVkPTIyXT0iTWlzc2luZ1NlZWQiO2JbYi5PdXRPZkJvdW5kcz0yM109Ik91dE9mQm91bmRzIjtiW2IuSG9zdEVycm9yPTI0XT0iSG9zdEVycm9yIjtiW2IuQ29tbXVuaWNhdGlvbkVycm9yPTI1XT0iQ29tbXVuaWNhdGlvbkVycm9yIjtiW2IuVmFyTGltaXRFeGNlZWRlZD0yNl09IlZhckxpbWl0RXhjZWVkZWQiO2JbYi5JbnZhbGlkUmVzcG9uc2U9MjddPSJJbnZhbGlkUmVzcG9uc2UiO2JbYi5Db25uZWN0aW9uQ2xvc2VkPTI4XT0iQ29ubmVjdGlvbkNsb3NlZCI7YltiLkNyeXB0b0Vycm9yPTI5XT0iQ3J5cHRvRXJyb3IiO2JbYi5XZWJBdXRobkVycm9yPTMwXT0iV2ViQXV0aG5FcnJvciJ9KShQfHw9e30pfSk7ZnVuY3Rpb24gZihlKXtyZXR1cm5bZSwwXX1mdW5jdGlvbiBjKGUpe3JldHVyblt2b2lkIDAsZV19dmFyIE09cSgoKT0+e0IoKX0pO2Z1bmN0aW9uIHRjKGUpe2lmKGU8MCljb25zb2xlLmluZm8oIk4iLGUpLGNvbnNvbGUudHJhY2UoKTtpZih0eXBlb2YgZSE9PSJiaWdpbnQiKWU9QmlnSW50KGUpO2lmKGU8MG4pcmV0dXJuIGMoMTApO2xldCB0PVtdO3doaWxlKGU+MG4pe2xldCByPU51bWJlcihlJjB4N2ZuKTtpZihlPj49N24sZT4wbil0LnB1c2gocnwxMjgpO2Vsc2UgdC5wdXNoKHIpfWlmKHQubGVuZ3RoPT09MClyZXR1cm4gZihuZXcgVWludDhBcnJheShbMF0pKTtpZih0Lmxlbmd0aD44KXJldHVybiBjKDI2KTtyZXR1cm4gZihuZXcgVWludDhBcnJheSh0KSl9ZnVuY3Rpb24gcmMoZSx0PTApe2xldCByPTBuLG49MCxzPXQ7d2hpbGUoITApe2lmKHM+PWUubGVuZ3RoKXJldHVybiBjKDE0KTtsZXQgaT1lW3MrK107aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7aWYocnw9QmlnSW50KGkmMTI3KTw8QmlnSW50KG4pLChpJjEyOCk9PT0wKXtpZihzLXQ+OClyZXR1cm4gYygyNik7cmV0dXJuIGYoe3ZhbHVlOnI+MHgxZmZmZmZmZmZmZmZmZm4/cjpOdW1iZXIociksYnl0ZXNSZWFkOnMtdH0pfWlmKG4rPTcsbj49NTYpcmV0dXJuIGMoMjYpfX1jbGFzcyBXe2RhdGE7cG9zPTA7Y29uc3RydWN0b3IoZSl7dGhpcy5kYXRhPWV9c3RhdGljIGFzeW5jIGZyb21SZXNwb25zZShlKXtsZXQgdD1hd2FpdCBlLmFycmF5QnVmZmVyKCkscj1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gbmV3IFcocil9cmVhZEJpZ0ludCgpe2lmKHRoaXMucG9zKzg+dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gYyg3KTtsZXQgZT1uZXcgRGF0YVZpZXcodGhpcy5kYXRhLmJ1ZmZlcix0aGlzLmRhdGEuYnl0ZU9mZnNldCt0aGlzLnBvcykuZ2V0QmlnVWludDY0KDAsITEpO3JldHVybiB0aGlzLnBvcys9OCxmKGUpfXJlYWREYXRlKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIGYobmV3IERhdGUoZSkpfXJlYWRWYXJJbnQoKXtsZXRbZSx0XT1yYyh0aGlzLmRhdGEsdGhpcy5wb3MpO2lmKHQhPT0wKXJldHVybiBjKHQpO3RoaXMucG9zKz1lLmJ5dGVzUmVhZDtsZXQgcj1lLnZhbHVlO3JldHVybiBmKHR5cGVvZiByPT09ImJpZ2ludCI/TnVtYmVyKHIpOnIpfXJlYWRWYXJTdHJpbmcoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz1uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7cmV0dXJuIGYocyl9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gYygxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBjKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLGYodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3QucHVzaChyKX1yZXR1cm4gZih0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTt0LnB1c2gocil9cmV0dXJuIGYodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgRntwYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09dGMoZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH1wcmVwZW5kQnl0ZXMoZSl7dGhpcy5wYXJ0cy51bnNoaWZ0KGUuc2xpY2UoKSl9d3JpdGVCeXRlcyhlKXt0aGlzLnBhcnRzLnB1c2goZS5zbGljZSgpKX13cml0ZVZhckJ5dGVzKGUpe2xldCB0PXRoaXMud3JpdGVWYXJJbnQoZS5sZW5ndGgpO2lmKHQhPT0wKXJldHVybiB0O3JldHVybiB0aGlzLndyaXRlQnl0ZXMoZSksMH13cml0ZVN0cnVjdChlLHQpe3JldHVybiBlLmVuY29kZSh0aGlzLHQpfXdyaXRlU3RydWN0cyhlLHQpe2ZvcihsZXQgciBvZiB0KXtsZXQgbj10aGlzLndyaXRlU3RydWN0KGUscik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9d3JpdGVCeXRlc1NlcShlKXtmb3IobGV0IHQgb2YgZSl0aGlzLndyaXRlQnl0ZXModCl9cmVzdWx0KCl7bGV0IGU9dGhpcy5wYXJ0cy5yZWR1Y2UoKG4scyk9Pm4rcy5sZW5ndGgsMCksdD1uZXcgVWludDhBcnJheShlKSxyPTA7Zm9yKGxldCBuIG9mIHRoaXMucGFydHMpdC5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gdH13aXBlKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpZS5maWxsKDApO3RoaXMucGFydHMubGVuZ3RoPTB9KnNjYW4oKXtmb3IobGV0IGUgb2YgdGhpcy5wYXJ0cyl5aWVsZCBlfX12YXIgc2U9cSgoKT0+e00oKTtCKCl9KTt2YXIgJHM7dmFyIEdzPXEoKCk9PntCKCk7TSgpOyRzPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGFiZWwpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5pbmRleCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gYyhzKTtyZXR1cm4gZih7bGFiZWw6dCxpbmRleDpufSl9fX0pO3ZhciBaZTt2YXIgUXM9cSgoKT0+e1plPXR5cGVvZiBnbG9iYWxUaGlzPT09Im9iamVjdCImJiJjcnlwdG8iaW4gZ2xvYmFsVGhpcz9nbG9iYWxUaGlzLmNyeXB0bzp2b2lkIDB9KTtmdW5jdGlvbiB1cihlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBhZShlLC4uLnQpe2lmKCFhbihlKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCIpO2lmKHQubGVuZ3RoPjAmJiF0LmluY2x1ZGVzKGUubGVuZ3RoKSl0aHJvdyBFcnJvcigiVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggIit0KyIsIGdvdCBsZW5ndGg9IitlLmxlbmd0aCl9ZnVuY3Rpb24gY24oZSx0PSEwKXtpZihlLmRlc3Ryb3llZCl0aHJvdyBFcnJvcigiSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQiKTtpZih0JiZlLmZpbmlzaGVkKXRocm93IEVycm9yKCJIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIil9ZnVuY3Rpb24gWXMoZSx0KXthZShlKTtsZXQgcj10Lm91dHB1dExlbjtpZihlLmxlbmd0aDxyKXRocm93IEVycm9yKCJkaWdlc3RJbnRvKCkgZXhwZWN0cyBvdXRwdXQgYnVmZmVyIG9mIGxlbmd0aCBhdCBsZWFzdCAiK3IpfWZ1bmN0aW9uIHVuKGUpe2lmKHR5cGVvZiBlIT09ImJvb2xlYW4iKXRocm93IEVycm9yKGBib29sZWFuIGV4cGVjdGVkLCBub3QgJHtlfWApfXZhciBIdD0oKT0+e307ZnVuY3Rpb24gc2MoZSl7aWYodHlwZW9mIGUhPT0ic3RyaW5nIil0aHJvdyBFcnJvcigic3RyaW5nIGV4cGVjdGVkIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSl9ZnVuY3Rpb24gZHIoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIillPXNjKGUpO2Vsc2UgaWYoYW4oZSkpZT1scihlKTtlbHNlIHRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkLCBnb3QgIit0eXBlb2YgZSk7cmV0dXJuIGV9ZnVuY3Rpb24gSnMoZSx0KXtpZih0PT1udWxsfHx0eXBlb2YgdCE9PSJvYmplY3QiKXRocm93IEVycm9yKCJvcHRpb25zIG11c3QgYmUgZGVmaW5lZCIpO3JldHVybiBPYmplY3QuYXNzaWduKGUsdCl9ZnVuY3Rpb24gWnMoZSx0KXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspcnw9ZVtuXV50W25dO3JldHVybiByPT09MH1mdW5jdGlvbiBkbihlLHQscj0hMCl7aWYodD09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodC5sZW5ndGghPT1lKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC5sZW5ndGgpO2lmKHImJiFpYyh0KSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiB0fWZ1bmN0aW9uIGljKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gbHIoZSl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShlKX1mdW5jdGlvbiB2ZSguLi5lKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmZpbGwoMCl9dmFyIEhlPShlKT0+bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxNYXRoLmZsb29yKGUuYnl0ZUxlbmd0aC80KSksbmMsZWk9KGUsdCk9PntmdW5jdGlvbiByKG4sLi4ucyl7aWYoYWUobiksZS5ub25jZUxlbmd0aCE9PXZvaWQgMCl7bGV0IGw9c1swXTtpZighbCl0aHJvdyBFcnJvcigibm9uY2UgLyBpdiByZXF1aXJlZCIpO2lmKGUudmFyU2l6ZU5vbmNlKWFlKGwpO2Vsc2UgYWUobCxlLm5vbmNlTGVuZ3RoKX1sZXQgaT1lLnRhZ0xlbmd0aDtpZihpJiZzWzFdIT09dm9pZCAwKWFlKHNbMV0pO2xldCBvPXQobiwuLi5zKSxhPShsLHApPT57aWYocCE9PXZvaWQgMCl7aWYobCE9PTIpdGhyb3cgRXJyb3IoImNpcGhlciBvdXRwdXQgbm90IHN1cHBvcnRlZCIpO2FlKHApfX0sdT0hMTtyZXR1cm57ZW5jcnlwdChsLHApe2lmKHUpdGhyb3cgRXJyb3IoImNhbm5vdCBlbmNyeXB0KCkgdHdpY2Ugd2l0aCBzYW1lIGtleSArIG5vbmNlIik7cmV0dXJuIHU9ITAsYWUobCksYShvLmVuY3J5cHQubGVuZ3RoLHApLG8uZW5jcnlwdChsLHApfSxkZWNyeXB0KGwscCl7aWYoYWUobCksaSYmbC5sZW5ndGg8aSl0aHJvdyBFcnJvcigiaW52YWxpZCBjaXBoZXJ0ZXh0IGxlbmd0aDogc21hbGxlciB0aGFuIHRhZ0xlbmd0aD0iK2kpO3JldHVybiBhKG8uZGVjcnlwdC5sZW5ndGgscCksby5kZWNyeXB0KGwscCl9fX1yZXR1cm4gT2JqZWN0LmFzc2lnbihyLGUpLHJ9O3ZhciBmcj1xKCgpPT57SHQoKTsvKiEgbm9ibGUtY2lwaGVycyAtIE1JVCBMaWNlbnNlIChjKSAyMDIzIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL25jPW5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4O2lmKCFuYyl0aHJvdyBFcnJvcigiTm9uIGxpdHRsZS1lbmRpYW4gaGFyZHdhcmUgaXMgbm90IHN1cHBvcnRlZCIpfSk7ZnVuY3Rpb24gS3QoZT0zMil7aWYoWmUmJnR5cGVvZiBaZS5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBaZS5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZSkpO2lmKFplJiZ0eXBlb2YgWmUucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBaZS5yYW5kb21CeXRlcyhlKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgdGk9cSgoKT0+e1FzKCl9KTtmdW5jdGlvbiBrKGUsdCl7cmV0dXJuIGU8PHR8ZT4+PjMyLXR9ZnVuY3Rpb24gbG4oZSl7cmV0dXJuIGUuYnl0ZU9mZnNldCU0PT09MH1mdW5jdGlvbiBsYyhlLHQscixuLHMsaSxvLGEpe2xldCB1PXMubGVuZ3RoLGQ9bmV3IFVpbnQ4QXJyYXkocHIpLGw9SGUoZCkscD1sbihzKSYmbG4oaSksaD1wP0hlKHMpOnJpLHk9cD9IZShpKTpyaTtmb3IobGV0IG09MDttPHU7bysrKXtpZihlKHQscixuLGwsbyxhKSxvPj1zaSl0aHJvdyBFcnJvcigiYXJ4OiBjb3VudGVyIG92ZXJmbG93Iik7bGV0IGc9TWF0aC5taW4ocHIsdS1tKTtpZihwJiZnPT09cHIpe2xldCBTPW0vNDtpZihtJTQhPT0wKXRocm93IEVycm9yKCJhcng6IGludmFsaWQgYmxvY2sgcG9zaXRpb24iKTtmb3IobGV0IEk9MCx3O0k8ZGM7SSsrKXc9UytJLHlbd109aFt3XV5sW0ldO20rPXByO2NvbnRpbnVlfWZvcihsZXQgUz0wLEk7UzxnO1MrKylJPW0rUyxpW0ldPXNbSV1eZFtTXTttKz1nfX1mdW5jdGlvbiBpaShlLHQpe2xldHthbGxvd1Nob3J0S2V5czpyLGV4dGVuZE5vbmNlRm46bixjb3VudGVyTGVuZ3RoOnMsY291bnRlclJpZ2h0Omkscm91bmRzOm99PUpzKHthbGxvd1Nob3J0S2V5czohMSxjb3VudGVyTGVuZ3RoOjgsY291bnRlclJpZ2h0OiExLHJvdW5kczoyMH0sdCk7aWYodHlwZW9mIGUhPT0iZnVuY3Rpb24iKXRocm93IEVycm9yKCJjb3JlIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiB1cihzKSx1cihvKSx1bihpKSx1bihyKSwoYSx1LGQsbCxwPTApPT57YWUoYSksYWUodSksYWUoZCk7bGV0IGg9ZC5sZW5ndGg7aWYobD09PXZvaWQgMClsPW5ldyBVaW50OEFycmF5KGgpO2lmKGFlKGwpLHVyKHApLHA8MHx8cD49c2kpdGhyb3cgRXJyb3IoImFyeDogY291bnRlciBvdmVyZmxvdyIpO2lmKGwubGVuZ3RoPGgpdGhyb3cgRXJyb3IoYGFyeDogb3V0cHV0ICgke2wubGVuZ3RofSkgaXMgc2hvcnRlciB0aGFuIGRhdGEgKCR7aH0pYCk7bGV0IHk9W10sbT1hLmxlbmd0aCxnLFM7aWYobT09PTMyKXkucHVzaChnPWxyKGEpKSxTPXVjO2Vsc2UgaWYobT09PTE2JiZyKWc9bmV3IFVpbnQ4QXJyYXkoMzIpLGcuc2V0KGEpLGcuc2V0KGEsMTYpLFM9Y2MseS5wdXNoKGcpO2Vsc2UgdGhyb3cgRXJyb3IoYGFyeDogaW52YWxpZCAzMi1ieXRlIGtleSwgZ290IGxlbmd0aD0ke219YCk7aWYoIWxuKHUpKXkucHVzaCh1PWxyKHUpKTtsZXQgST1IZShnKTtpZihuKXtpZih1Lmxlbmd0aCE9PTI0KXRocm93IEVycm9yKCJhcng6IGV4dGVuZGVkIG5vbmNlIG11c3QgYmUgMjQgYnl0ZXMiKTtuKFMsSSxIZSh1LnN1YmFycmF5KDAsMTYpKSxJKSx1PXUuc3ViYXJyYXkoMTYpfWxldCB3PTE2LXM7aWYodyE9PXUubGVuZ3RoKXRocm93IEVycm9yKGBhcng6IG5vbmNlIG11c3QgYmUgJHt3fSBvciAxNiBieXRlc2ApO2lmKHchPT0xMil7bGV0IEU9bmV3IFVpbnQ4QXJyYXkoMTIpO0Uuc2V0KHUsaT8wOjEyLXUubGVuZ3RoKSx1PUUseS5wdXNoKHUpfWxldCBBPUhlKHUpO3JldHVybiBsYyhlLFMsSSxBLGQsbCxwLG8pLHZlKC4uLnkpLGx9fXZhciBuaT0oZSk9PlVpbnQ4QXJyYXkuZnJvbShlLnNwbGl0KCIiKS5tYXAoKHQpPT50LmNoYXJDb2RlQXQoMCkpKSxvYyxhYyxjYyx1Yyxwcj02NCxkYz0xNixzaT00Mjk0OTY3Mjk1LHJpO3ZhciBvaT1xKCgpPT57SHQoKTtmcigpO29jPW5pKCJleHBhbmQgMTYtYnl0ZSBrIiksYWM9bmkoImV4cGFuZCAzMi1ieXRlIGsiKSxjYz1IZShvYyksdWM9SGUoYWMpO3JpPW5ldyBVaW50MzJBcnJheX0pO2NsYXNzIGFpe2NvbnN0cnVjdG9yKGUpe3RoaXMuYmxvY2tMZW49MTYsdGhpcy5vdXRwdXRMZW49MTYsdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTYpLHRoaXMucj1uZXcgVWludDE2QXJyYXkoMTApLHRoaXMuaD1uZXcgVWludDE2QXJyYXkoMTApLHRoaXMucGFkPW5ldyBVaW50MTZBcnJheSg4KSx0aGlzLnBvcz0wLHRoaXMuZmluaXNoZWQ9ITEsZT1kcihlKSxhZShlLDMyKTtsZXQgdD1kZShlLDApLHI9ZGUoZSwyKSxuPWRlKGUsNCkscz1kZShlLDYpLGk9ZGUoZSw4KSxvPWRlKGUsMTApLGE9ZGUoZSwxMiksdT1kZShlLDE0KTt0aGlzLnJbMF09dCY4MTkxLHRoaXMuclsxXT0odD4+PjEzfHI8PDMpJjgxOTEsdGhpcy5yWzJdPShyPj4+MTB8bjw8NikmNzkzOSx0aGlzLnJbM109KG4+Pj43fHM8PDkpJjgxOTEsdGhpcy5yWzRdPShzPj4+NHxpPDwxMikmMjU1LHRoaXMucls1XT1pPj4+MSY4MTkwLHRoaXMucls2XT0oaT4+PjE0fG88PDIpJjgxOTEsdGhpcy5yWzddPShvPj4+MTF8YTw8NSkmODA2NSx0aGlzLnJbOF09KGE+Pj44fHU8PDgpJjgxOTEsdGhpcy5yWzldPXU+Pj41JjEyNztmb3IobGV0IGQ9MDtkPDg7ZCsrKXRoaXMucGFkW2RdPWRlKGUsMTYrMipkKX1wcm9jZXNzKGUsdCxyPSExKXtsZXQgbj1yPzA6MjA0OCx7aDpzLHI6aX09dGhpcyxvPWlbMF0sYT1pWzFdLHU9aVsyXSxkPWlbM10sbD1pWzRdLHA9aVs1XSxoPWlbNl0seT1pWzddLG09aVs4XSxnPWlbOV0sUz1kZShlLHQrMCksST1kZShlLHQrMiksdz1kZShlLHQrNCksQT1kZShlLHQrNiksRT1kZShlLHQrOCksRD1kZShlLHQrMTApLFQ9ZGUoZSx0KzEyKSxMPWRlKGUsdCsxNCkseD1zWzBdKyhTJjgxOTEpLEM9c1sxXSsoKFM+Pj4xM3xJPDwzKSY4MTkxKSxSPXNbMl0rKChJPj4+MTB8dzw8NikmODE5MSksdj1zWzNdKygodz4+Pjd8QTw8OSkmODE5MSksVj1zWzRdKygoQT4+PjR8RTw8MTIpJjgxOTEpLGI9c1s1XSsoRT4+PjEmODE5MSksSD1zWzZdKygoRT4+PjE0fEQ8PDIpJjgxOTEpLF89c1s3XSsoKEQ+Pj4xMXxUPDw1KSY4MTkxKSxPPXNbOF0rKChUPj4+OHxMPDw4KSY4MTkxKSxOPXNbOV0rKEw+Pj41fG4pLFU9MCxlZT1VK3gqbytDKig1KmcpK1IqKDUqbSkrdiooNSp5KStWKig1KmgpO1U9ZWU+Pj4xMyxlZSY9ODE5MSxlZSs9YiooNSpwKStIKig1KmwpK18qKDUqZCkrTyooNSp1KStOKig1KmEpLFUrPWVlPj4+MTMsZWUmPTgxOTE7bGV0IGo9VSt4KmErQypvK1IqKDUqZykrdiooNSptKStWKig1KnkpO1U9aj4+PjEzLGomPTgxOTEsais9YiooNSpoKStIKig1KnApK18qKDUqbCkrTyooNSpkKStOKig1KnUpLFUrPWo+Pj4xMyxqJj04MTkxO2xldCB0ZT1VK3gqdStDKmErUipvK3YqKDUqZykrViooNSptKTtVPXRlPj4+MTMsdGUmPTgxOTEsdGUrPWIqKDUqeSkrSCooNSpoKStfKig1KnApK08qKDUqbCkrTiooNSpkKSxVKz10ZT4+PjEzLHRlJj04MTkxO2xldCBHPVUreCpkK0MqdStSKmErdipvK1YqKDUqZyk7VT1HPj4+MTMsRyY9ODE5MSxHKz1iKig1Km0pK0gqKDUqeSkrXyooNSpoKStPKig1KnApK04qKDUqbCksVSs9Rz4+PjEzLEcmPTgxOTE7bGV0IEllPVUreCpsK0MqZCtSKnUrdiphK1YqbztVPUllPj4+MTMsSWUmPTgxOTEsSWUrPWIqKDUqZykrSCooNSptKStfKig1KnkpK08qKDUqaCkrTiooNSpwKSxVKz1JZT4+PjEzLEllJj04MTkxO2xldCBfZT1VK3gqcCtDKmwrUipkK3YqdStWKmE7VT1fZT4+PjEzLF9lJj04MTkxLF9lKz1iKm8rSCooNSpnKStfKig1Km0pK08qKDUqeSkrTiooNSpoKSxVKz1fZT4+PjEzLF9lJj04MTkxO2xldCBpdD1VK3gqaCtDKnArUipsK3YqZCtWKnU7VT1pdD4+PjEzLGl0Jj04MTkxLGl0Kz1iKmErSCpvK18qKDUqZykrTyooNSptKStOKig1KnkpLFUrPWl0Pj4+MTMsaXQmPTgxOTE7bGV0IG90PVUreCp5K0MqaCtSKnArdipsK1YqZDtVPW90Pj4+MTMsb3QmPTgxOTEsb3QrPWIqdStIKmErXypvK08qKDUqZykrTiooNSptKSxVKz1vdD4+PjEzLG90Jj04MTkxO2xldCBhdD1VK3gqbStDKnkrUipoK3YqcCtWKmw7VT1hdD4+PjEzLGF0Jj04MTkxLGF0Kz1iKmQrSCp1K18qYStPKm8rTiooNSpnKSxVKz1hdD4+PjEzLGF0Jj04MTkxO2xldCBjdD1VK3gqZytDKm0rUip5K3YqaCtWKnA7VT1jdD4+PjEzLGN0Jj04MTkxLGN0Kz1iKmwrSCpkK18qdStPKmErTipvLFUrPWN0Pj4+MTMsY3QmPTgxOTEsVT0oVTw8MikrVXwwLFU9VStlZXwwLGVlPVUmODE5MSxVPVU+Pj4xMyxqKz1VLHNbMF09ZWUsc1sxXT1qLHNbMl09dGUsc1szXT1HLHNbNF09SWUsc1s1XT1fZSxzWzZdPWl0LHNbN109b3Qsc1s4XT1hdCxzWzldPWN0fWZpbmFsaXplKCl7bGV0e2g6ZSxwYWQ6dH09dGhpcyxyPW5ldyBVaW50MTZBcnJheSgxMCksbj1lWzFdPj4+MTM7ZVsxXSY9ODE5MTtmb3IobGV0IG89MjtvPDEwO28rKyllW29dKz1uLG49ZVtvXT4+PjEzLGVbb10mPTgxOTE7ZVswXSs9bio1LG49ZVswXT4+PjEzLGVbMF0mPTgxOTEsZVsxXSs9bixuPWVbMV0+Pj4xMyxlWzFdJj04MTkxLGVbMl0rPW4sclswXT1lWzBdKzUsbj1yWzBdPj4+MTMsclswXSY9ODE5MTtmb3IobGV0IG89MTtvPDEwO28rKylyW29dPWVbb10rbixuPXJbb10+Pj4xMyxyW29dJj04MTkxO3JbOV0tPTgxOTI7bGV0IHM9KG5eMSktMTtmb3IobGV0IG89MDtvPDEwO28rKylyW29dJj1zO3M9fnM7Zm9yKGxldCBvPTA7bzwxMDtvKyspZVtvXT1lW29dJnN8cltvXTtlWzBdPShlWzBdfGVbMV08PDEzKSY2NTUzNSxlWzFdPShlWzFdPj4+M3xlWzJdPDwxMCkmNjU1MzUsZVsyXT0oZVsyXT4+PjZ8ZVszXTw8NykmNjU1MzUsZVszXT0oZVszXT4+Pjl8ZVs0XTw8NCkmNjU1MzUsZVs0XT0oZVs0XT4+PjEyfGVbNV08PDF8ZVs2XTw8MTQpJjY1NTM1LGVbNV09KGVbNl0+Pj4yfGVbN108PDExKSY2NTUzNSxlWzZdPShlWzddPj4+NXxlWzhdPDw4KSY2NTUzNSxlWzddPShlWzhdPj4+OHxlWzldPDw1KSY2NTUzNTtsZXQgaT1lWzBdK3RbMF07ZVswXT1pJjY1NTM1O2ZvcihsZXQgbz0xO288ODtvKyspaT0oZVtvXSt0W29dfDApKyhpPj4+MTYpfDAsZVtvXT1pJjY1NTM1O3ZlKHIpfXVwZGF0ZShlKXtjbih0aGlzKTtsZXR7YnVmZmVyOnQsYmxvY2tMZW46cn09dGhpcztlPWRyKGUpO2xldCBuPWUubGVuZ3RoO2ZvcihsZXQgcz0wO3M8bjspe2xldCBpPU1hdGgubWluKHItdGhpcy5wb3Msbi1zKTtpZihpPT09cil7Zm9yKDtyPD1uLXM7cys9cil0aGlzLnByb2Nlc3MoZSxzKTtjb250aW51ZX1pZih0LnNldChlLnN1YmFycmF5KHMscytpKSx0aGlzLnBvcyksdGhpcy5wb3MrPWkscys9aSx0aGlzLnBvcz09PXIpdGhpcy5wcm9jZXNzKHQsMCwhMSksdGhpcy5wb3M9MH1yZXR1cm4gdGhpc31kZXN0cm95KCl7dmUodGhpcy5oLHRoaXMucix0aGlzLmJ1ZmZlcix0aGlzLnBhZCl9ZGlnZXN0SW50byhlKXtjbih0aGlzKSxZcyhlLHRoaXMpLHRoaXMuZmluaXNoZWQ9ITA7bGV0e2J1ZmZlcjp0LGg6cn09dGhpcyx7cG9zOm59PXRoaXM7aWYobil7dFtuKytdPTE7Zm9yKDtuPDE2O24rKyl0W25dPTA7dGhpcy5wcm9jZXNzKHQsMCwhMCl9dGhpcy5maW5hbGl6ZSgpO2xldCBzPTA7Zm9yKGxldCBpPTA7aTw4O2krKyllW3MrK109cltpXT4+PjAsZVtzKytdPXJbaV0+Pj44O3JldHVybiBlfWRpZ2VzdCgpe2xldHtidWZmZXI6ZSxvdXRwdXRMZW46dH09dGhpczt0aGlzLmRpZ2VzdEludG8oZSk7bGV0IHI9ZS5zbGljZSgwLHQpO3JldHVybiB0aGlzLmRlc3Ryb3koKSxyfX1mdW5jdGlvbiBmYyhlKXtsZXQgdD0obixzKT0+ZShzKS51cGRhdGUoZHIobikpLmRpZ2VzdCgpLHI9ZShuZXcgVWludDhBcnJheSgzMikpO3JldHVybiB0Lm91dHB1dExlbj1yLm91dHB1dExlbix0LmJsb2NrTGVuPXIuYmxvY2tMZW4sdC5jcmVhdGU9KG4pPT5lKG4pLHR9dmFyIGRlPShlLHQpPT5lW3QrK10mMjU1fChlW3QrK10mMjU1KTw8OCxmbjt2YXIgY2k9cSgoKT0+e0h0KCk7ZnIoKTtmbj1mYygoZSk9Pm5ldyBhaShlKSl9KTtmdW5jdGlvbiBwYyhlLHQscixuLHMsaT0yMCl7bGV0IG89ZVswXSxhPXRbMF0sdT10WzFdLGQ9dFsyXSxsPXRbM10scD1lWzFdLGg9clswXSx5PXJbMV0sbT1zLGc9MCxTPWVbMl0sST10WzRdLHc9dFs1XSxBPXRbNl0sRT10WzddLEQ9ZVszXSxUPW8sTD1hLHg9dSxDPWQsUj1sLHY9cCxWPWgsYj15LEg9bSxfPWcsTz1TLE49SSxVPXcsZWU9QSxqPUUsdGU9RDtmb3IobGV0IEllPTA7SWU8aTtJZSs9MilSXj1rKFQrVXwwLDcpLEhePWsoUitUfDAsOSksVV49ayhIK1J8MCwxMyksVF49ayhVK0h8MCwxOCksX149ayh2K0x8MCw3KSxlZV49ayhfK3Z8MCw5KSxMXj1rKGVlK198MCwxMyksdl49ayhMK2VlfDAsMTgpLGpePWsoTytWfDAsNykseF49ayhqK098MCw5KSxWXj1rKHgranwwLDEzKSxPXj1rKFYreHwwLDE4KSxDXj1rKHRlK058MCw3KSxiXj1rKEMrdGV8MCw5KSxOXj1rKGIrQ3wwLDEzKSx0ZV49ayhOK2J8MCwxOCksTF49ayhUK0N8MCw3KSx4Xj1rKEwrVHwwLDkpLENePWsoeCtMfDAsMTMpLFRePWsoQyt4fDAsMTgpLFZePWsoditSfDAsNyksYl49ayhWK3Z8MCw5KSxSXj1rKGIrVnwwLDEzKSx2Xj1rKFIrYnwwLDE4KSxOXj1rKE8rX3wwLDcpLEhePWsoTitPfDAsOSksX149ayhIK058MCwxMyksT149ayhfK0h8MCwxOCksVV49ayh0ZStqfDAsNyksZWVePWsoVSt0ZXwwLDkpLGpePWsoZWUrVXwwLDEzKSx0ZV49ayhqK2VlfDAsMTgpO2xldCBHPTA7bltHKytdPW8rVHwwLG5bRysrXT1hK0x8MCxuW0crK109dSt4fDAsbltHKytdPWQrQ3wwLG5bRysrXT1sK1J8MCxuW0crK109cCt2fDAsbltHKytdPWgrVnwwLG5bRysrXT15K2J8MCxuW0crK109bStIfDAsbltHKytdPWcrX3wwLG5bRysrXT1TK098MCxuW0crK109SStOfDAsbltHKytdPXcrVXwwLG5bRysrXT1BK2VlfDAsbltHKytdPUUranwwLG5bRysrXT1EK3RlfDB9ZnVuY3Rpb24gaGMoZSx0LHIsbil7bGV0IHM9ZVswXSxpPXRbMF0sbz10WzFdLGE9dFsyXSx1PXRbM10sZD1lWzFdLGw9clswXSxwPXJbMV0saD1yWzJdLHk9clszXSxtPWVbMl0sZz10WzRdLFM9dFs1XSxJPXRbNl0sdz10WzddLEE9ZVszXTtmb3IobGV0IEQ9MDtEPDIwO0QrPTIpdV49ayhzK1N8MCw3KSxoXj1rKHUrc3wwLDkpLFNePWsoaCt1fDAsMTMpLHNePWsoUytofDAsMTgpLHlePWsoZCtpfDAsNyksSV49ayh5K2R8MCw5KSxpXj1rKEkreXwwLDEzKSxkXj1rKGkrSXwwLDE4KSx3Xj1rKG0rbHwwLDcpLG9ePWsodyttfDAsOSksbF49ayhvK3d8MCwxMyksbV49ayhsK298MCwxOCksYV49ayhBK2d8MCw3KSxwXj1rKGErQXwwLDkpLGdePWsocCthfDAsMTMpLEFePWsoZytwfDAsMTgpLGlePWsocythfDAsNyksb149ayhpK3N8MCw5KSxhXj1rKG8raXwwLDEzKSxzXj1rKGErb3wwLDE4KSxsXj1rKGQrdXwwLDcpLHBePWsobCtkfDAsOSksdV49ayhwK2x8MCwxMyksZF49ayh1K3B8MCwxOCksZ149ayhtK3l8MCw3KSxoXj1rKGcrbXwwLDkpLHlePWsoaCtnfDAsMTMpLG1ePWsoeStofDAsMTgpLFNePWsoQSt3fDAsNyksSV49ayhTK0F8MCw5KSx3Xj1rKEkrU3wwLDEzKSxBXj1rKHcrSXwwLDE4KTtsZXQgRT0wO25bRSsrXT1zLG5bRSsrXT1kLG5bRSsrXT1tLG5bRSsrXT1BLG5bRSsrXT1sLG5bRSsrXT1wLG5bRSsrXT1oLG5bRSsrXT15fXZhciBwbixobjt2YXIgdWk9cSgoKT0+e29pKCk7SHQoKTtjaSgpO2ZyKCk7cG49aWkocGMse2NvdW50ZXJSaWdodDohMCxleHRlbmROb25jZUZuOmhjfSksaG49ZWkoe2Jsb2NrU2l6ZTo2NCxub25jZUxlbmd0aDoyNCx0YWdMZW5ndGg6MTZ9LChlLHQpPT4oe2VuY3J5cHQocixuKXtuPWRuKHIubGVuZ3RoKzMyLG4sITEpO2xldCBzPW4uc3ViYXJyYXkoMCwzMiksaT1uLnN1YmFycmF5KDMyKTtuLnNldChyLDMyKSx2ZShzKSxwbihlLHQsbixuKTtsZXQgbz1mbihpLHMpO3JldHVybiBuLnNldChvLDE2KSx2ZShuLnN1YmFycmF5KDAsMTYpLG8pLG4uc3ViYXJyYXkoMTYpfSxkZWNyeXB0KHIsbil7YWUociksbj1kbihyLmxlbmd0aCszMixuLCExKTtsZXQgcz1uLnN1YmFycmF5KDAsMzIpLGk9bi5zdWJhcnJheSgzMiw0OCksbz1uLnN1YmFycmF5KDQ4KTtuLnNldChyLDMyKSx2ZShzKTtsZXQgYT1wbihlLHQscyxzKSx1PWZuKG8sYSk7aWYoIVpzKGksdSkpdGhyb3cgRXJyb3IoImludmFsaWQgdGFnIik7cmV0dXJuIHBuKGUsdCxuLnN1YmFycmF5KDE2KSxuLnN1YmFycmF5KDE2KSksdmUocyxpLHUpLG99fSkpfSk7ZnVuY3Rpb24geWMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBMdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gZXQoZSwuLi50KXtpZigheWMoZSkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aD4wJiYhdC5pbmNsdWRlcyhlLmxlbmd0aCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoICIrdCsiLCBnb3QgbGVuZ3RoPSIrZS5sZW5ndGgpfWZ1bmN0aW9uIFZ0KGUsdD0hMCl7aWYoZS5kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkIik7aWYodCYmZS5maW5pc2hlZCl0aHJvdyBFcnJvcigiSGFzaCNkaWdlc3QoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpfWZ1bmN0aW9uIGhyKGUsdCl7ZXQoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBkaShlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIG5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpfWZ1bmN0aW9uIHB0KC4uLmUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmlsbCgwKX1mdW5jdGlvbiBPdChlLHQpe3JldHVybiBlPDwzMi10fGU+Pj50fWZ1bmN0aW9uIGZpKGUpe3JldHVybiBlPDwyNCY0Mjc4MTkwMDgwfGU8PDgmMTY3MTE2ODB8ZT4+PjgmNjUyODB8ZT4+PjI0JjI1NX1mdW5jdGlvbiBtYyhlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdPWZpKGVbdF0pO3JldHVybiBlfWZ1bmN0aW9uIGdjKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIGh0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1nYyhlKTtyZXR1cm4gZXQoZSksZX1jbGFzcyB5bnt9ZnVuY3Rpb24gaGkoZSl7bGV0IHQ9KG4scyk9PmUocykudXBkYXRlKGh0KG4pKS5kaWdlc3QoKSxyPWUoe30pO3JldHVybiB0Lm91dHB1dExlbj1yLm91dHB1dExlbix0LmJsb2NrTGVuPXIuYmxvY2tMZW4sdC5jcmVhdGU9KG4pPT5lKG4pLHR9dmFyIGxpLHBpLHllO3ZhciB5cj1xKCgpPT57LyohIG5vYmxlLWhhc2hlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL2xpPSgoKT0+bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KFsyODc0NTQwMjBdKS5idWZmZXIpWzBdPT09NjgpKCk7cGk9bGk/KGUpPT5lOihlKT0+ZmkoZSk7eWU9bGk/KGUpPT5lOm1jfSk7dmFyIHlpO3ZhciBtaT1xKCgpPT57eWk9VWludDMyQXJyYXkuZnJvbShbMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdKX0pO2Z1bmN0aW9uIG1uKGUsdD0hMSl7aWYodClyZXR1cm57aDpOdW1iZXIoZSZtciksbDpOdW1iZXIoZT4+Z2kmbXIpfTtyZXR1cm57aDpOdW1iZXIoZT4+Z2kmbXIpfDAsbDpOdW1iZXIoZSZtcil8MH19dmFyIG1yLGdpO3ZhciBTaT1xKCgpPT57bXI9QmlnSW50KDQyOTQ5NjcyOTUpLGdpPUJpZ0ludCgzMil9KTtmdW5jdGlvbiBLZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj1PdChuXmUsMTYpLHI9citufDAsdD1PdCh0XnIsMTIpLHthOmUsYjp0LGM6cixkOm59fWZ1bmN0aW9uIExlKGUsdCxyLG4scyl7cmV0dXJuIGU9ZSt0K3N8MCxuPU90KG5eZSw4KSxyPXIrbnwwLHQ9T3QodF5yLDcpLHthOmUsYjp0LGM6cixkOm59fXZhciBiaT1xKCgpPT57eXIoKX0pO2Z1bmN0aW9uIFNuKGUsdCxyLG4scyxpLG8sYSx1LGQsbCxwLGgseSxtLGcsUyxJLHcsQSl7bGV0IEU9MDtmb3IobGV0IEQ9MDtEPG47RCsrKSh7YTpzLGI6dSxjOmgsZDpTfT1LZShzLHUsaCxTLHJbdCtlW0UrK11dKSkse2E6cyxiOnUsYzpoLGQ6U309TGUocyx1LGgsUyxyW3QrZVtFKytdXSkse2E6aSxiOmQsYzp5LGQ6SX09S2UoaSxkLHksSSxyW3QrZVtFKytdXSkse2E6aSxiOmQsYzp5LGQ6SX09TGUoaSxkLHksSSxyW3QrZVtFKytdXSkse2E6byxiOmwsYzptLGQ6d309S2UobyxsLG0sdyxyW3QrZVtFKytdXSkse2E6byxiOmwsYzptLGQ6d309TGUobyxsLG0sdyxyW3QrZVtFKytdXSkse2EsYjpwLGM6ZyxkOkF9PUtlKGEscCxnLEEsclt0K2VbRSsrXV0pLHthLGI6cCxjOmcsZDpBfT1MZShhLHAsZyxBLHJbdCtlW0UrK11dKSx7YTpzLGI6ZCxjOm0sZDpBfT1LZShzLGQsbSxBLHJbdCtlW0UrK11dKSx7YTpzLGI6ZCxjOm0sZDpBfT1MZShzLGQsbSxBLHJbdCtlW0UrK11dKSx7YTppLGI6bCxjOmcsZDpTfT1LZShpLGwsZyxTLHJbdCtlW0UrK11dKSx7YTppLGI6bCxjOmcsZDpTfT1MZShpLGwsZyxTLHJbdCtlW0UrK11dKSx7YTpvLGI6cCxjOmgsZDpJfT1LZShvLHAsaCxJLHJbdCtlW0UrK11dKSx7YTpvLGI6cCxjOmgsZDpJfT1MZShvLHAsaCxJLHJbdCtlW0UrK11dKSx7YSxiOnUsYzp5LGQ6d309S2UoYSx1LHksdyxyW3QrZVtFKytdXSkse2EsYjp1LGM6eSxkOnd9PUxlKGEsdSx5LHcsclt0K2VbRSsrXV0pO3JldHVybnt2MDpzLHYxOmksdjI6byx2MzphLHY0OnUsdjU6ZCx2NjpsLHY3OnAsdjg6aCx2OTp5LHYxMDptLHYxMTpnLHYxMjpTLHYxMzpJLHYxNDp3LHYxNTpBfX12YXIgZ247dmFyIElpPXEoKCk9PntiaSgpO3lyKCk7Z249Y2xhc3MgZ24gZXh0ZW5kcyB5bntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCk7dGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmxlbmd0aD0wLHRoaXMucG9zPTAsTHQoZSksTHQodCksdGhpcy5ibG9ja0xlbj1lLHRoaXMub3V0cHV0TGVuPXQsdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoZSksdGhpcy5idWZmZXIzMj1mdCh0aGlzLmJ1ZmZlcil9dXBkYXRlKGUpe1Z0KHRoaXMpLGU9aHQoZSksZXQoZSk7bGV0e2Jsb2NrTGVuOnQsYnVmZmVyOnIsYnVmZmVyMzI6bn09dGhpcyxzPWUubGVuZ3RoLGk9ZS5ieXRlT2Zmc2V0LG89ZS5idWZmZXI7Zm9yKGxldCBhPTA7YTxzOyl7aWYodGhpcy5wb3M9PT10KXllKG4pLHRoaXMuY29tcHJlc3MobiwwLCExKSx5ZShuKSx0aGlzLnBvcz0wO2xldCB1PU1hdGgubWluKHQtdGhpcy5wb3Mscy1hKSxkPWkrYTtpZih1PT09dCYmIShkJTQpJiZhK3U8cyl7bGV0IGw9bmV3IFVpbnQzMkFycmF5KG8sZCxNYXRoLmZsb29yKChzLWEpLzQpKTt5ZShsKTtmb3IobGV0IHA9MDthK3Q8cztwKz1uLmxlbmd0aCxhKz10KXRoaXMubGVuZ3RoKz10LHRoaXMuY29tcHJlc3MobCxwLCExKTt5ZShsKTtjb250aW51ZX1yLnNldChlLnN1YmFycmF5KGEsYSt1KSx0aGlzLnBvcyksdGhpcy5wb3MrPXUsdGhpcy5sZW5ndGgrPXUsYSs9dX1yZXR1cm4gdGhpc31kaWdlc3RJbnRvKGUpe1Z0KHRoaXMpLGhyKGUsdGhpcyk7bGV0e3Bvczp0LGJ1ZmZlcjMyOnJ9PXRoaXM7dGhpcy5maW5pc2hlZD0hMCxwdCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0KSkseWUociksdGhpcy5jb21wcmVzcyhyLDAsITApLHllKHIpO2xldCBuPWZ0KGUpO3RoaXMuZ2V0KCkuZm9yRWFjaCgocyxpKT0+bltpXT1waShzKSl9ZGlnZXN0KCl7bGV0e2J1ZmZlcjplLG91dHB1dExlbjp0fT10aGlzO3RoaXMuZGlnZXN0SW50byhlKTtsZXQgcj1lLnNsaWNlKDAsdCk7cmV0dXJuIHRoaXMuZGVzdHJveSgpLHJ9X2Nsb25lSW50byhlKXtsZXR7YnVmZmVyOnQsbGVuZ3RoOnIsZmluaXNoZWQ6bixkZXN0cm95ZWQ6cyxvdXRwdXRMZW46aSxwb3M6b309dGhpcztyZXR1cm4gZXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3Ioe2RrTGVuOml9KSksZS5zZXQoLi4udGhpcy5nZXQoKSksZS5idWZmZXIuc2V0KHQpLGUuZGVzdHJveWVkPXMsZS5maW5pc2hlZD1uLGUubGVuZ3RoPXIsZS5wb3M9byxlLm91dHB1dExlbj1pLGV9Y2xvbmUoKXtyZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCl9fX0pO3ZhciBDZSxWZSx3aSxibixJbjt2YXIgeGk9cSgoKT0+e21pKCk7U2koKTtJaSgpO3lyKCk7Q2U9e0NIVU5LX1NUQVJUOjEsQ0hVTktfRU5EOjIsUEFSRU5UOjQsUk9PVDo4LEtFWUVEX0hBU0g6MTYsREVSSVZFX0tFWV9DT05URVhUOjMyLERFUklWRV9LRVlfTUFURVJJQUw6NjR9LFZlPXlpLnNsaWNlKCksd2k9KCgpPT57bGV0IGU9QXJyYXkuZnJvbSh7bGVuZ3RoOjE2fSwobixzKT0+cyksdD0obik9PlsyLDYsMywxMCw3LDAsNCwxMywxLDExLDEyLDUsOSwxNCwxNSw4XS5tYXAoKHMpPT5uW3NdKSxyPVtdO2ZvcihsZXQgbj0wLHM9ZTtuPDc7bisrLHM9dChzKSlyLnB1c2goLi4ucyk7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShyKX0pKCk7Ym49Y2xhc3MgYm4gZXh0ZW5kcyBnbntjb25zdHJ1Y3RvcihlPXt9LHQ9MCl7c3VwZXIoNjQsZS5ka0xlbj09PXZvaWQgMD8zMjplLmRrTGVuKTt0aGlzLmNodW5rUG9zPTAsdGhpcy5jaHVua3NEb25lPTAsdGhpcy5mbGFncz0wLHRoaXMuc3RhY2s9W10sdGhpcy5wb3NPdXQ9MCx0aGlzLmJ1ZmZlck91dDMyPW5ldyBVaW50MzJBcnJheSgxNiksdGhpcy5jaHVua091dD0wLHRoaXMuZW5hYmxlWE9GPSEwO2xldHtrZXk6cixjb250ZXh0Om59PWUscz1uIT09dm9pZCAwO2lmKHIhPT12b2lkIDApe2lmKHMpdGhyb3cgRXJyb3IoJ09ubHkgImtleSIgb3IgImNvbnRleHQiIGNhbiBiZSBzcGVjaWZpZWQgYXQgc2FtZSB0aW1lJyk7bGV0IGk9aHQocikuc2xpY2UoKTtldChpLDMyKSx0aGlzLklWPWZ0KGkpLHllKHRoaXMuSVYpLHRoaXMuZmxhZ3M9dHxDZS5LRVlFRF9IQVNIfWVsc2UgaWYocyl7bGV0IGk9aHQobiksbz1uZXcgYm4oe2RrTGVuOjMyfSxDZS5ERVJJVkVfS0VZX0NPTlRFWFQpLnVwZGF0ZShpKS5kaWdlc3QoKTt0aGlzLklWPWZ0KG8pLHllKHRoaXMuSVYpLHRoaXMuZmxhZ3M9dHxDZS5ERVJJVkVfS0VZX01BVEVSSUFMfWVsc2UgdGhpcy5JVj1WZS5zbGljZSgpLHRoaXMuZmxhZ3M9dDt0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKSx0aGlzLmJ1ZmZlck91dD1kaSh0aGlzLmJ1ZmZlck91dDMyKX1nZXQoKXtyZXR1cm5bXX1zZXQoKXt9YjJDb21wcmVzcyhlLHQscixuPTApe2xldHtzdGF0ZTpzLHBvczppfT10aGlzLHtoOm8sbDphfT1tbihCaWdJbnQoZSksITApLHt2MDp1LHYxOmQsdjI6bCx2MzpwLHY0OmgsdjU6eSx2NjptLHY3Omcsdjg6Uyx2OTpJLHYxMDp3LHYxMTpBLHYxMjpFLHYxMzpELHYxNDpULHYxNTpMfT1Tbih3aSxuLHIsNyxzWzBdLHNbMV0sc1syXSxzWzNdLHNbNF0sc1s1XSxzWzZdLHNbN10sVmVbMF0sVmVbMV0sVmVbMl0sVmVbM10sbyxhLGksdCk7c1swXT11XlMsc1sxXT1kXkksc1syXT1sXncsc1szXT1wXkEsc1s0XT1oXkUsc1s1XT15XkQsc1s2XT1tXlQsc1s3XT1nXkx9Y29tcHJlc3MoZSx0PTAscj0hMSl7bGV0IG49dGhpcy5mbGFncztpZighdGhpcy5jaHVua1BvcylufD1DZS5DSFVOS19TVEFSVDtpZih0aGlzLmNodW5rUG9zPT09MTV8fHIpbnw9Q2UuQ0hVTktfRU5EO2lmKCFyKXRoaXMucG9zPXRoaXMuYmxvY2tMZW47aWYodGhpcy5iMkNvbXByZXNzKHRoaXMuY2h1bmtzRG9uZSxuLGUsdCksdGhpcy5jaHVua1Bvcys9MSx0aGlzLmNodW5rUG9zPT09MTZ8fHIpe2xldCBzPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT10aGlzLklWLnNsaWNlKCk7Zm9yKGxldCBpLG89dGhpcy5jaHVua3NEb25lKzE7cnx8IShvJjEpO28+Pj0xKXtpZighKGk9dGhpcy5zdGFjay5wb3AoKSkpYnJlYWs7dGhpcy5idWZmZXIzMi5zZXQoaSwwKSx0aGlzLmJ1ZmZlcjMyLnNldChzLDgpLHRoaXMucG9zPXRoaXMuYmxvY2tMZW4sdGhpcy5iMkNvbXByZXNzKDAsdGhpcy5mbGFnc3xDZS5QQVJFTlQsdGhpcy5idWZmZXIzMiwwKSxzPXRoaXMuc3RhdGUsdGhpcy5zdGF0ZT10aGlzLklWLnNsaWNlKCl9dGhpcy5jaHVua3NEb25lKyssdGhpcy5jaHVua1Bvcz0wLHRoaXMuc3RhY2sucHVzaChzKX10aGlzLnBvcz0wfV9jbG9uZUludG8oZSl7ZT1zdXBlci5fY2xvbmVJbnRvKGUpO2xldHtJVjp0LGZsYWdzOnIsc3RhdGU6bixjaHVua1BvczpzLHBvc091dDppLGNodW5rT3V0Om8sc3RhY2s6YSxjaHVua3NEb25lOnV9PXRoaXM7cmV0dXJuIGUuc3RhdGUuc2V0KG4uc2xpY2UoKSksZS5zdGFjaz1hLm1hcCgoZCk9PlVpbnQzMkFycmF5LmZyb20oZCkpLGUuSVYuc2V0KHQpLGUuZmxhZ3M9cixlLmNodW5rUG9zPXMsZS5jaHVua3NEb25lPXUsZS5wb3NPdXQ9aSxlLmNodW5rT3V0PW8sZS5lbmFibGVYT0Y9dGhpcy5lbmFibGVYT0YsZS5idWZmZXJPdXQzMi5zZXQodGhpcy5idWZmZXJPdXQzMiksZX1kZXN0cm95KCl7dGhpcy5kZXN0cm95ZWQ9ITAscHQodGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlcjMyLHRoaXMuSVYsdGhpcy5idWZmZXJPdXQzMikscHQoLi4udGhpcy5zdGFjayl9YjJDb21wcmVzc091dCgpe2xldHtzdGF0ZTplLHBvczp0LGZsYWdzOnIsYnVmZmVyMzI6bixidWZmZXJPdXQzMjpzfT10aGlzLHtoOmksbDpvfT1tbihCaWdJbnQodGhpcy5jaHVua091dCsrKSk7eWUobik7bGV0e3YwOmEsdjE6dSx2MjpkLHYzOmwsdjQ6cCx2NTpoLHY2Onksdjc6bSx2ODpnLHY5OlMsdjEwOkksdjExOncsdjEyOkEsdjEzOkUsdjE0OkQsdjE1OlR9PVNuKHdpLDAsbiw3LGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxWZVswXSxWZVsxXSxWZVsyXSxWZVszXSxvLGksdCxyKTtzWzBdPWFeZyxzWzFdPXVeUyxzWzJdPWReSSxzWzNdPWxedyxzWzRdPXBeQSxzWzVdPWheRSxzWzZdPXleRCxzWzddPW1eVCxzWzhdPWVbMF1eZyxzWzldPWVbMV1eUyxzWzEwXT1lWzJdXkksc1sxMV09ZVszXV53LHNbMTJdPWVbNF1eQSxzWzEzXT1lWzVdXkUsc1sxNF09ZVs2XV5ELHNbMTVdPWVbN11eVCx5ZShuKSx5ZShzKSx0aGlzLnBvc091dD0wfWZpbmlzaCgpe2lmKHRoaXMuZmluaXNoZWQpcmV0dXJuO3RoaXMuZmluaXNoZWQ9ITAscHQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3MpKTtsZXQgZT10aGlzLmZsYWdzfENlLlJPT1Q7aWYodGhpcy5zdGFjay5sZW5ndGgpZXw9Q2UuUEFSRU5ULHllKHRoaXMuYnVmZmVyMzIpLHRoaXMuY29tcHJlc3ModGhpcy5idWZmZXIzMiwwLCEwKSx5ZSh0aGlzLmJ1ZmZlcjMyKSx0aGlzLmNodW5rc0RvbmU9MCx0aGlzLnBvcz10aGlzLmJsb2NrTGVuO2Vsc2UgZXw9KCF0aGlzLmNodW5rUG9zP0NlLkNIVU5LX1NUQVJUOjApfENlLkNIVU5LX0VORDt0aGlzLmZsYWdzPWUsdGhpcy5iMkNvbXByZXNzT3V0KCl9d3JpdGVJbnRvKGUpe1Z0KHRoaXMsITEpLGV0KGUpLHRoaXMuZmluaXNoKCk7bGV0e2Jsb2NrTGVuOnQsYnVmZmVyT3V0OnJ9PXRoaXM7Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7KXtpZih0aGlzLnBvc091dD49dCl0aGlzLmIyQ29tcHJlc3NPdXQoKTtsZXQgaT1NYXRoLm1pbih0LXRoaXMucG9zT3V0LHMtbik7ZS5zZXQoci5zdWJhcnJheSh0aGlzLnBvc091dCx0aGlzLnBvc091dCtpKSxuKSx0aGlzLnBvc091dCs9aSxuKz1pfXJldHVybiBlfXhvZkludG8oZSl7aWYoIXRoaXMuZW5hYmxlWE9GKXRocm93IEVycm9yKCJYT0YgaXMgbm90IHBvc3NpYmxlIGFmdGVyIGRpZ2VzdCBjYWxsIik7cmV0dXJuIHRoaXMud3JpdGVJbnRvKGUpfXhvZihlKXtyZXR1cm4gTHQoZSksdGhpcy54b2ZJbnRvKG5ldyBVaW50OEFycmF5KGUpKX1kaWdlc3RJbnRvKGUpe2lmKGhyKGUsdGhpcyksdGhpcy5maW5pc2hlZCl0aHJvdyBFcnJvcigiZGlnZXN0KCkgd2FzIGFscmVhZHkgY2FsbGVkIik7cmV0dXJuIHRoaXMuZW5hYmxlWE9GPSExLHRoaXMud3JpdGVJbnRvKGUpLHRoaXMuZGVzdHJveSgpLGV9ZGlnZXN0KCl7cmV0dXJuIHRoaXMuZGlnZXN0SW50byhuZXcgVWludDhBcnJheSh0aGlzLm91dHB1dExlbikpfX07SW49aGkoKGUpPT5uZXcgYm4oZSkpfSk7ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIEFycmF5LmZyb20oZSkubWFwKChyKT0+ci50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKS5qb2luKCIiKX1mdW5jdGlvbiBFaShlKXtpZihlLmxlbmd0aCUyIT09MCl0aHJvdyBFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgvMik7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKz0yKXRbci8yXT1OdW1iZXIucGFyc2VJbnQoZS5zdWJzdHIociwyKSwxNik7cmV0dXJuIHR9ZnVuY3Rpb24gWShlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtyZXR1cm4gZS5ldmVyeSgocixuKT0+cj09PXRbbl0pfWZ1bmN0aW9uIEFpKGUpe3JldHVybiBLKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPSskLywiIil9ZnVuY3Rpb24gUGkoZSl7bGV0IHQ9ZS5sZW5ndGglND09PTA/IiI6Ij0iLnJlcGVhdCg0LWUubGVuZ3RoJTQpLHI9ZS5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKSt0O3JldHVybiBrZShyKX1mdW5jdGlvbiBydChlLHQpe2xldCByPW5ldyBVaW50OEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoKTtyZXR1cm4gci5zZXQoZSwwKSxyLnNldCh0LGUubGVuZ3RoKSxyfXZhciBLLGtlO3ZhciBjZT1xKCgpPT57aWYodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvQmFzZTY0PT09ImZ1bmN0aW9uIilLPShlKT0+ZS50b0Jhc2U2NCgpO2Vsc2UgSz0oZSk9PmJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5lKSk7aWYodHlwZW9mIFVpbnQ4QXJyYXkuZnJvbUJhc2U2ND09PSJmdW5jdGlvbiIpa2U9KGUpPT5VaW50OEFycmF5LmZyb21CYXNlNjQoZSk7ZWxzZSBrZT0oZSk9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKGUpLCh0KT0+dC5jaGFyQ29kZUF0KDApKX0pO2Z1bmN0aW9uIGtpKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PVNjKXJldHVybiBjKDEwKTtyZXR1cm4gZihlKX1mdW5jdGlvbiBCaShlKXtsZXQgdD0wbjtmb3IobGV0IHI9ZS5sZW5ndGgtMTtyPj0wO3ItLSl0PXQ8PDhufEJpZ0ludChlW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiBJYyhlKXtsZXQgdD1uZXcgVWludDhBcnJheSgzMikscj0oZSVRK1EpJVE7Zm9yKGxldCBuPTA7bjwzMjtuKyspdFtuXT1OdW1iZXIociYweGZmbikscj4+PThuO3JldHVybiB0fWZ1bmN0aW9uIHdjKGUpe2xldCB0PWUuc2xpY2UoKTtyZXR1cm4gdFszMV0mPTEyNyxCaSh0KX1mdW5jdGlvbiB4YyhlKXtsZXQgdD1lLnNsaWNlKCk7cmV0dXJuIHRbMF0mPTI0OCx0WzMxXSY9MTI3LHRbMzFdfD02NCx0fWZ1bmN0aW9uIGdyKGUsdCxyKXtsZXQgbj0tZSxzPSh0XnIpJm47cmV0dXJuW3RecyxyXnNdfWZ1bmN0aW9uIEVjKGUpe2xldCB0PVEtMm4scj0oZSVRK1EpJVEsbj0xbjt3aGlsZSh0PjBuKXtpZih0JjFuKW49bipyJVE7cj1yKnIlUSx0Pj49MW59cmV0dXJuIG59ZnVuY3Rpb24gd24oZSx0KXtsZXQgcj14YyhlKSxuPXdjKHQpLHM9MW4saT0wbixvPW4sYT0xbix1PTBuLGQ9Qmkocik7Zm9yKGxldCBsPTI1NDtsPj0wO2wtLSl7bGV0IHA9ZD4+QmlnSW50KGwpJjFuO3VePXAsW3Msb109Z3IodSxzLG8pLFtpLGFdPWdyKHUsaSxhKSx1PXA7bGV0IGg9KHMraSklUSx5PWgqaCVRLG09KHMtaStRKSVRLGc9bSptJVEsUz0oeS1nK1EpJVEsST0obythKSVRLEE9KG8tYStRKSVRKmglUSxFPUkqbSVRLEQ9KEErRSklUSxUPShBLUUrUSklUTtvPUQqRCVRLGE9bipUKlQlUSxzPXkqZyVRLGk9UyooeStiYypTKSVRfXJldHVybltzLG9dPWdyKHUscyxvKSxbaSxhXT1ncih1LGksYSksci5maWxsKDApLEljKHMqRWMoaSklUSl9ZnVuY3Rpb24gVWkoZSl7cmV0dXJuIHduKGUsRGkpfXZhciBTYz0zMix5ZixRLGJjPTEyMTY2NW4sRGk7dmFyIHZpPXEoKCk9PntCKCk7TSgpO3lmPVN5bWJvbCgiWDI1NTE5U2siKTtRPSgxbjw8MjU1biktMTluLERpPW5ldyBVaW50OEFycmF5KDMyKTtEaVswXT05fSk7ZnVuY3Rpb24gQ2koZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoeG4ubGVuZ3RoKzMyKTtyZXR1cm4gdC5zZXQoeG4pLHQuc2V0KGUuc3ViYXJyYXkoMCwzMikseG4ubGVuZ3RoKSx0fWZ1bmN0aW9uIFRpKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KEVuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KEVuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLEVuLmxlbmd0aCksdH1mdW5jdGlvbiBNaShlKXtyZXR1cm4gdHlwZW9mIGU9PT0ic3RyaW5nIj9uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSk6ZX1mdW5jdGlvbiBPZShlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodCkuc2V0KGUpLHR9YXN5bmMgZnVuY3Rpb24gQWMoZSl7cmV0dXJuIEt0KGUpfWFzeW5jIGZ1bmN0aW9uIEFuKCl7cmV0dXJuIEt0KDMyKX1hc3luYyBmdW5jdGlvbiBfdChlLHQpe2xldCByPUt0KDI0KSxzPWhuKHQscikuZW5jcnlwdChlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWy4uLnIsLi4uc10pfWFzeW5jIGZ1bmN0aW9uIHl0KGUsdCl7bGV0IHI9ZS5zbGljZSgwLDI0KSxuPWUuc2xpY2UoMjQpO3JldHVybiBobih0LHIpLmRlY3J5cHQobil9YXN5bmMgZnVuY3Rpb24gUG4oZSl7bGV0IHQ9ZSxyPUNpKHQpLG49T2Uociksczt0cnl7bGV0IGQ9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IkVkMjU1MTkifSwhMCxbInNpZ24iXSk7cz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLGQpfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9aWYodHlwZW9mIHMueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJFZDI1NTE5IEpXSyBtaXNzaW5nIHgiKTtsZXQgaT1zLng7cy5kPXZvaWQgMDtsZXQgbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLHtrdHk6Ik9LUCIsY3J2OiJFZDI1NTE5Iix4Oml9LHtuYW1lOiJFZDI1NTE5In0sITAsWyJ2ZXJpZnkiXSksYT1uZXcgVWludDhBcnJheShhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJyYXciLG8pKSx1PW5ldyBVaW50OEFycmF5KDY0KTtyZXR1cm4gdS5zZXQodCwwKSx1LnNldChhLDMyKSx7a2V5VHlwZToiZWQyNTUxOSIscHJpdmF0ZUtleTp1LHB1YmxpY0tleTphfX1hc3luYyBmdW5jdGlvbiBQYyhlKXtsZXQgdD1lLnN1YmFycmF5KDAsMzIpLHI9Q2kodCksbj1PZShyKTt0cnl7cmV0dXJuIGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITEsWyJzaWduIl0pfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9fWFzeW5jIGZ1bmN0aW9uIGtjKGUpe3JldHVybiBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLE9lKGUpLHtuYW1lOiJFZDI1NTE5In0sITEsWyJ2ZXJpZnkiXSl9YXN5bmMgZnVuY3Rpb24ga24oZSx0KXtsZXQgcj1NaShlKSxuPWF3YWl0IFBjKHQpLHM9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLnNpZ24oe25hbWU6IkVkMjU1MTkifSxuLE9lKHIpKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocyl9YXN5bmMgZnVuY3Rpb24gRGMoZSx0LHIpe2xldCBuPU1pKHQpO3RyeXtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLnZlcmlmeSh7bmFtZToiRWQyNTUxOSJ9LHIsT2UoZSksT2UobikpfWNhdGNoe3JldHVybiExfX1hc3luYyBmdW5jdGlvbiBOdChlLHQpe2lmKHQ9PT12b2lkIDApcmV0dXJuIEluKGUpO3JldHVybiBJbihlLHQpfWFzeW5jIGZ1bmN0aW9uIERuKCl7bGV0IGU9YXdhaXQgS3QoMzIpO2VbMF0mPTI0OCxlWzMxXSY9MTI3LGVbMzFdfD02NDtsZXRbdCxyXT1raShlKTtpZihyIT09MHx8dD09PXZvaWQgMCl0aHJvdyBlLmZpbGwoMCksRXJyb3IoIlgyNTUxOSBzY2FsYXIgYnJhbmQgZmFpbGVkIik7bGV0IG49VWkodCkscz1UaSh0KSxpPU9lKHMpO3RyeXtsZXQgbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJwa2NzOCIsaSx7bmFtZToiWDI1NTE5In0sITAsWyJkZXJpdmVCaXRzIl0pLGE9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIixvKTtpZih0eXBlb2YgYS54IT09InN0cmluZyIpdGhyb3cgRXJyb3IoIlgyNTUxOSBKV0sgbWlzc2luZyB4Iik7bGV0IHU9UGkoYS54KTtpZihhLmQ9dm9pZCAwLCFZKHUsbikpdGhyb3cgRXJyb3IoIlgyNTUxOSBXZWJDcnlwdG8gcHViICE9IFJGQyA3NzQ4Iik7cmV0dXJue3ByaXY6dCxwdWI6bn19Y2F0Y2gobyl7dGhyb3cgdC5maWxsKDApLG99ZmluYWxseXtzLmZpbGwoMCksbmV3IFVpbnQ4QXJyYXkoaSkuZmlsbCgwKX19YXN5bmMgZnVuY3Rpb24gUmkoZSx0KXtsZXQgcj1UaShlKSxuPU9lKHIpO3RyeXtsZXQgcz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJwa2NzOCIsbix7bmFtZToiWDI1NTE5In0sITEsWyJkZXJpdmVCaXRzIl0pLGk9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixPZSh0KSx7bmFtZToiWDI1NTE5In0sITEsW10pLG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoe25hbWU6IlgyNTUxOSIscHVibGljOml9LHMsMjU2KTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobyl9Y2F0Y2h7cmV0dXJuIHduKGUsdCl9ZmluYWxseXtyLmZpbGwoMCksbmV3IFVpbnQ4QXJyYXkobikuZmlsbCgwKX19ZnVuY3Rpb24gQmMoZSl7cmV0dXJuIE9iamVjdC5mcmVlemUoZSksZX12YXIgeG4sRW4sSGk7dmFyIHF0PXEoKCk9Pnt0aSgpO3VpKCk7eGkoKTtjZSgpO0IoKTt2aSgpO3huPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEyLDQsMzQsNCwzMl0pO0VuPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEwLDQsMzQsNCwzMl0pO0hpPUJjKHtnZW5SYW5kb21CeXRlczpBYyxnZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkOkFuLGVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQ6X3QsZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZDp5dCxkZXJpdmVFZDI1NTE5S2V5UGFpcjpQbixzaWduRWQyNTUxOTprbixpbXBvcnRWZXJpZnlLZXk6a2MsY2hlY2tTaWdFZDI1NTE5OkRjLGJsYWtlMzpOdH0pfSk7ZnVuY3Rpb24gVWMoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBLaShlKXtyZXR1cm4gZX1mdW5jdGlvbiBGZShlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PW9lKXJldHVybiBjKDEwKTtyZXR1cm4gZihLaShlKSl9ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIEZlKGUscmUuSG9zdFJMTSl9ZnVuY3Rpb24gdmMoZSl7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIGYoZSk7bGV0IHQ9bmV3IEYscj0kcy5lbmNvZGUodCxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtyZXR1cm4gZih0LnJlc3VsdCgpKX1hc3luYyBmdW5jdGlvbiBMaShlLHQpe3RyeXtyZXR1cm4gZihhd2FpdCBOdChlLHQpKX1jYXRjaHtyZXR1cm4gYygyOSl9fWFzeW5jIGZ1bmN0aW9uIENjKHtwYXJlbnQ6ZSxwdXJwb3NlOnR9KXtsZXRbcixuXT1hd2FpdCBMaShlLHtjb250ZXh0OnR9KTtpZihuIT09MClyZXR1cm4gYyhuKTtyZXR1cm4gZihVYyhyLHQpKX1hc3luYyBmdW5jdGlvbiBUYyh7cGRrOmUsa2RtOnR9KXtsZXRbcixuXT12Yyh0KTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXRbcyxpXT1hd2FpdCBMaShyLHtrZXk6ZX0pO2lmKGkhPT0wKXJldHVybiBjKGkpO3JldHVybiBmKEtpKHMpKX1hc3luYyBmdW5jdGlvbiB4ZSh7cGFyZW50OmUscHVycG9zZTp0LGtkbTpyfSl7bGV0W24sc109YXdhaXQgQ2Moe3BhcmVudDplLHB1cnBvc2U6dH0pO2lmKHMhPT0wKXJldHVybiBjKHMpO3RyeXtyZXR1cm4gYXdhaXQgVGMoe3BkazpuLGtkbTpyfSl9ZmluYWxseXtuLmZpbGwoMCl9fXZhciByZSxVZix2Zix6O3ZhciBmZT1xKCgpPT57c2UoKTtHcygpO0IoKTtNKCk7cXQoKTtyZT17SWRlbnRpdHk6ImRpcGxvbWF0aWMuaWRlbnRpdHkudjEiLENpcGhlcjoiZGlwbG9tYXRpYy5jaXBoZXIudjEiLEJpbmQ6ImRpcGxvbWF0aWMuYmluZC52MSIsQmluZFRhZzoiZGlwbG9tYXRpYy5iaW5kdGFnLnYxIixGaW5nZXJwcmludDoiZGlwbG9tYXRpYy5maW5nZXJwcmludC52MSIsUGFpcjoiZGlwbG9tYXRpYy5xcnBhaXIudjEiLEJhZ0tkbToiZGlwbG9tYXRpYy5iYWdrZG0udjEiLFJlYWxtS2V5OiJkaXBsb21hdGljLnJlYWxtS2V5LnYxIixSZWFsbUlEOiJkaXBsb21hdGljLnJlYWxtSUQudjEiLEhvc3RSTE06ImRpcGxvbWF0aWMuaG9zdFJMTS52MSJ9LFVmPVN5bWJvbCgiUHVycG9zZURlcml2ZWRLZXkiKSx2Zj1TeW1ib2woIkNoaWxkS2V5Iiksej1PYmplY3QuZnJlZXplKHtsYWJlbDoiIixpbmRleDowfSl9KTtmdW5jdGlvbiBudChlKXtpZihlLmJ5dGVMZW5ndGghPT1ubylyZXR1cm4gYygxMCk7cmV0dXJuIGYoZSl9dmFyIGh5LHl5LERlPTMyLG5vO3ZhciBYdD1xKCgpPT57QigpO00oKTtoeT1TeW1ib2woIk1hc3RlclNlZWQiKSx5eT1TeW1ib2woIlNlYWxlZE1hc3RlcktleSIpLG5vPTI0K0RlKzE2fSk7dmFyIExyO3ZhciBKbj1xKCgpPT57QigpO00oKTtMcj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhclN0cmluZyh0LmhhbmRsZSk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhclN0cmluZyh0LmxhYmVsKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gZS53cml0ZVZhckludCh0LmlkeD8/MCl9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtyZXR1cm4gZih7aGFuZGxlOnQsbGFiZWw6bixpZHg6aX0pfX19KTt2YXIgWm47dmFyIEVvPXEoKCk9PntCKCk7TSgpO0puKCk7Sm4oKTtabj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckludCh0Lmhvc3RzLmxlbmd0aCk7aWYociE9PTApcmV0dXJuIHI7Zm9yKGxldCBuIG9mIHQuaG9zdHMpe2xldCBzPWUud3JpdGVTdHJ1Y3QoTHIsbik7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHx0PDApcmV0dXJuIGMoMTApO2xldCBuPVtdO2ZvcihsZXQgcz0wO3M8dDtzKyspe2xldFtpLG9dPWUucmVhZFN0cnVjdChMcik7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7bi5wdXNoKGkpfXJldHVybiBmKHtob3N0czpufSl9fX0pO2Z1bmN0aW9uIEFvKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PUF0KXJldHVybiBjKDEwKTtyZXR1cm4gZihlKX1mdW5jdGlvbiBQbyhlKXtpZihlLmJ5dGVMZW5ndGg8UWMpcmV0dXJuIGMoMTApO3JldHVybiBmKGUpfWFzeW5jIGZ1bmN0aW9uIGtvKGUsdCxyLG4pe2lmKHQuYnl0ZUxlbmd0aCE9PUF0KXJldHVybiBjKDEwKTtsZXQgczt0cnl7cz1hd2FpdCBSaShlLHQpfWNhdGNoe3JldHVybiBjKDI5KX10cnl7aWYocy5ieXRlTGVuZ3RoIT09QXR8fHMuZXZlcnkoKG8pPT5vPT09MCkpcmV0dXJuIGMoMTApO2xldCBpPXJ0KHIsbik7dHJ5e2xldFtvLGFdPWF3YWl0IHhlKHtwYXJlbnQ6cyxwdXJwb3NlOnJlLlBhaXIsa2RtOml9KTtpZihhIT09MClyZXR1cm4gYyhhKTtyZXR1cm4gZihvKX1maW5hbGx5e2kuZmlsbCgwKX19ZmluYWxseXtzLmZpbGwoMCl9fWFzeW5jIGZ1bmN0aW9uIERvKGUpe2xldCB0O3RyeXt0PWF3YWl0IERuKCl9Y2F0Y2h7cmV0dXJuIGMoMjkpfXRyeXtsZXRbcixuXT1hd2FpdCBrbyh0LnByaXYsZSxlLHQucHViKTtpZihuIT09MClyZXR1cm4gYyhuKTtyZXR1cm4gZih7a2V5OnIscHViOnQucHVifSl9ZmluYWxseXt0LnByaXYuZmlsbCgwKX19ZnVuY3Rpb24gQm8oZSl7Zm9yKGxldCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKXtpZihZYy5oYXModCkpY29udGludWU7bGV0IHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHI9PT12b2lkIDB8fHR5cGVvZiByLnZhbHVlIT09ImZ1bmN0aW9uIiljb250aW51ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLnZhbHVlLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMX0pfX1jbGFzcyBQdHsjZTsjdDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuI2U9ZSx0aGlzLiN0PXR9c3RhdGljIGFzeW5jIGNyZWF0ZSgpe2xldCBlO3RyeXtsZXQgdD1hd2FpdCBEbigpO2U9dC5wcml2O2xldFtyLG5dPUFvKHQucHViKTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz1uZXcgUHQoZSxyKTtyZXR1cm4gZT12b2lkIDAsZihzKX1jYXRjaHtyZXR1cm4gYygyOSl9ZmluYWxseXtlPy5maWxsKDApfX13aXBlKCl7dGhpcy4jZS5maWxsKDApfWRoa2VSZXEoKXtsZXQgZT10aGlzLiN0LnNsaWNlKCksW3Qscl09QW8oZSk7aWYociE9PTApcmV0dXJuIGMocik7cmV0dXJuIGYodCl9YXN5bmMgZmluaXNoKGUpe2xldCB0PWUuc3ViYXJyYXkoMCxBdCkscj1lLnN1YmFycmF5KEF0KSxbbixzXT1hd2FpdCBrbyh0aGlzLiNlLHQsdGhpcy4jdCx0KTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXQgaTt0cnl7dHJ5e2k9YXdhaXQgeXQocixuKX1jYXRjaHtyZXR1cm4gYygyMCl9bGV0e2Zyb21TZWVkSG9zdHM6b309YXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiAoWXQoKSx2bykpLGE9byhpKTtpZihhWzFdPT09MCl0aGlzLndpcGUoKTtyZXR1cm4gYX1maW5hbGx5e24uZmlsbCgwKSxpPy5maWxsKDApfX19dmFyIEF0PTMyLFFjLFFnLFlnLFljO3ZhciBVbz1xKCgpPT57Y2UoKTtCKCk7TSgpO2ZlKCk7cXQoKTtRYz1BdCsyNCsxNixRZz1TeW1ib2woIkRIS0VSZXEiKSxZZz1TeW1ib2woIkRIS0VSZXNwIik7WWM9bmV3IFNldChbImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwibGVuZ3RoIiwibmFtZSJdKTtCbyhQdCk7Qm8oUHQucHJvdG90eXBlKX0pO2Z1bmN0aW9uIFRlKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGUpO2lmKGU+MCljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO3JldHVybiB0fWZ1bmN0aW9uIHR1KGUpe3JldHVybiBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1wuJC8sIiIpfHwibG9jYWxob3N0In1mdW5jdGlvbiBNZShlKXtsZXQgdD1uZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpO3JldHVybiB0LnNldChlKSx0LmJ1ZmZlcn1mdW5jdGlvbiBfcihlKXtpZihlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpLnNsaWNlKCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpLnNsaWNlKCl9ZnVuY3Rpb24gWGUoZSl7aWYoZT8ucnBJZCE9PXZvaWQgMClyZXR1cm4gZihlLnJwSWQpO2lmKHR5cGVvZiBsb2NhdGlvbj4idSIpcmV0dXJuIGMoOSk7cmV0dXJuIGYodHUobG9jYXRpb24uaG9zdG5hbWUpKX1mdW5jdGlvbiBVZShlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe0NvPWUubWVzc2FnZT09PSIiP2UubmFtZTpgJHtlLm5hbWV9OiAke2UubWVzc2FnZX1gO3JldHVybn1Dbz1TdHJpbmcoZSl9ZnVuY3Rpb24gTnIoZSl7aWYoIShlIGluc3RhbmNlb2YgRXJyb3IpKXJldHVybiExO3JldHVybiBlLm5hbWU9PT0iTm90QWxsb3dlZEVycm9yIiYmZS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImRvZXMgbm90IGhhdmUgZm9jdXMiKX1mdW5jdGlvbiBUbygpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuITA7cmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSE9PSJoaWRkZW4ifWZ1bmN0aW9uIGt0KCl7aWYodHlwZW9mIGdsb2JhbFRoaXMuZm9jdXMhPT0iZnVuY3Rpb24iKXJldHVybjt0cnl7Z2xvYmFsVGhpcy5mb2N1cygpfWNhdGNoe319ZnVuY3Rpb24gcXIoZT0yNTAwKXtpZihUbygpKXJldHVybiBrdCgpLFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBuZXcgUHJvbWlzZSgodCk9PntsZXQgcj0oKT0+e2NsZWFyVGltZW91dChzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSxrdCgpLHQoKX0sbj0oKT0+e2lmKFRvKCkpcigpfSxzPXNldFRpbWVvdXQocixlKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKSxuKCl9KX1hc3luYyBmdW5jdGlvbiBGcihlKXthd2FpdCBxcigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShlKX1jYXRjaCh0KXtpZighTnIodCkpdGhyb3cgdDtyZXR1cm4ga3QoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKGUpfX1hc3luYyBmdW5jdGlvbiBXcihlKXthd2FpdCBxcigpO3RyeXtyZXR1cm4gYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChlKX1jYXRjaCh0KXtpZighTnIodCkpdGhyb3cgdDtyZXR1cm4ga3QoKSxhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KGUpfX1mdW5jdGlvbiAkZSgpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUifHwhbmF2aWdhdG9yLmNyZWRlbnRpYWxzfHx0eXBlb2YgUHVibGljS2V5Q3JlZGVudGlhbD4idSIpcmV0dXJuIDI0O3JldHVybiAwfWZ1bmN0aW9uIEdlKGUpe2lmKGU9PT1udWxsfHxlLnR5cGUhPT1CZXx8ISgicmF3SWQiaW4gZSl8fHR5cGVvZiBlLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMhPT0iZnVuY3Rpb24iKXJldHVybiBjKDI3KTtyZXR1cm4gZihlKX1mdW5jdGlvbiBycyhlKXtpZihlPT09InBsYXRmb3JtInx8ZT09PSJjcm9zcy1wbGF0Zm9ybSIpcmV0dXJuIGU7cmV0dXJufWZ1bmN0aW9uIFJvKGUpe2lmKC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChlKSlyZXR1cm4iaW9zIjtpZigvQW5kcm9pZC9pLnRlc3QoZSkpcmV0dXJuImFuZHJvaWQiO2lmKC9NYWMgT1MgWHxNYWNpbnRvc2gvaS50ZXN0KGUpKXJldHVybiJtYWNvcyI7aWYoL1dpbmRvd3MvaS50ZXN0KGUpKXJldHVybiJ3aW5kb3dzIjtpZigvTGludXgvaS50ZXN0KGUpKXJldHVybiJsaW51eCI7cmV0dXJuIm90aGVyIn1mdW5jdGlvbiBucyhlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldFRyYW5zcG9ydHMiaW4gdCkpcmV0dXJuO2xldCByPXQuZ2V0VHJhbnNwb3J0cztpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm47bGV0IHM9W107Zm9yKGxldCBpIG9mIG4paWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmaS5sZW5ndGg+MClzLnB1c2goaSk7cmV0dXJuIHMubGVuZ3RoPT09MD92b2lkIDA6c31mdW5jdGlvbiBIbyhlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldEF1dGhlbnRpY2F0b3JEYXRhImluIHQpKXJldHVybjtsZXQgcj10LmdldEF1dGhlbnRpY2F0b3JEYXRhO2lmKHR5cGVvZiByIT09ImZ1bmN0aW9uIilyZXR1cm47bGV0IG49ci5jYWxsKHQpO2lmKCEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm47bGV0IHM9bmV3IFVpbnQ4QXJyYXkobik7aWYocy5ieXRlTGVuZ3RoPHRzK01vKXJldHVybjtsZXQgaT1zW3J1XTtpZihpPT09dm9pZCAwfHwoaSZudSk9PT0wKXJldHVybjtyZXR1cm4gcy5zbGljZSh0cyx0cytNbyl9dmFyIGplPTMyLFZyPSJESVBMT01BVElDIixCZT0icHVibGljLWtleSIsSmM9LTcsWmM9LTgsZXU9LTI1NyxPcixDbz0iIixydT0zMixudT02NCx0cz0zNyxNbz0xNjt2YXIgRHQ9cSgoKT0+e0IoKTtNKCk7T3I9W3t0eXBlOkJlLGFsZzpKY30se3R5cGU6QmUsYWxnOlpjfSx7dHlwZTpCZSxhbGc6ZXV9XX0pO2FzeW5jIGZ1bmN0aW9uIEtvKGUpe2xldCB0PSRlKCk7aWYodCE9PTApcmV0dXJuIGModCk7bGV0W3Isbl09WGUoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgcz1lPy51c2VyTmFtZT8/ZT8ucnBOYW1lPz9yLGk9e3Jlc2lkZW50S2V5OiJyZXF1aXJlZCIscmVxdWlyZVJlc2lkZW50S2V5OiEwLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIn07aWYoZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQhPT12b2lkIDApaS5hdXRoZW50aWNhdG9yQXR0YWNobWVudD1lLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50O2xldCBvPXtsYXJnZUJsb2I6e3N1cHBvcnQ6InJlcXVpcmVkIn19LGE7dHJ5e2E9YXdhaXQgRnIoe3B1YmxpY0tleTp7Y2hhbGxlbmdlOlRlKGplKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/VnJ9LHVzZXI6e2lkOlRlKDE2KSxuYW1lOnMsZGlzcGxheU5hbWU6c30scHViS2V5Q3JlZFBhcmFtczpPcixhdXRoZW50aWNhdG9yU2VsZWN0aW9uOmksZXh0ZW5zaW9uczpvLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fX19KX1jYXRjaChwKXtyZXR1cm4gVWUocCksYygzMCl9bGV0W3UsZF09R2UoYSk7aWYoZCE9PTApcmV0dXJuIGMoZCk7aWYodT09PXZvaWQgMClyZXR1cm4gYygyNyk7aWYodS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iPy5zdXBwb3J0ZWQhPT0hMClyZXR1cm4gYygzMCk7cmV0dXJuIGYobmV3IFVpbnQ4QXJyYXkodS5yYXdJZCkpfWFzeW5jIGZ1bmN0aW9uIHNzKGUsdCxyLG4pe2xldCBzPXtjaGFsbGVuZ2U6VGUoamUpLHJwSWQ6ZSx1c2VyVmVyaWZpY2F0aW9uOiJwcmVmZXJyZWQifTtpZih0Py5oaW50cyE9PXZvaWQgMClzLmhpbnRzPXQuaGludHM7aWYociE9PXZvaWQgMClzLmFsbG93Q3JlZGVudGlhbHM9W3t0eXBlOkJlLGlkOk1lKHIpfV07aWYobiE9PXZvaWQgMClzLmV4dGVuc2lvbnM9bjtsZXQgaTt0cnl7aT1hd2FpdCBXcih7cHVibGljS2V5OnN9KX1jYXRjaCh1KXtyZXR1cm4gVWUodSksYygzMCl9bGV0W28sYV09R2UoaSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gYygyNyk7cmV0dXJuIGYobyl9YXN5bmMgZnVuY3Rpb24gTG8oZSx0KXtsZXQgcj0kZSgpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPVhlKHQpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoOSk7bGV0IGk9ZTtpZihpPT09dm9pZCAwKXtsZXRbcCxoXT1hd2FpdCBzcyhuLHQpO2lmKGghPT0wJiZ0Py5oaW50cyE9PXZvaWQgMClbcCxoXT1hd2FpdCBzcyhuLHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWV9KTtpZihoIT09MClyZXR1cm4gYyhoKTtpZihwPT09dm9pZCAwKXJldHVybiBjKDI3KTtpPW5ldyBVaW50OEFycmF5KHAucmF3SWQpfWxldFtvLGFdPWF3YWl0IHNzKG4sdCxpLHtsYXJnZUJsb2I6e3JlYWQ6ITB9fSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gYygyNyk7bGV0IGQ9by5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iO2lmKGQ9PT12b2lkIDB8fGQuYmxvYj09PXZvaWQgMClyZXR1cm4gYyg3KTtsZXQgbD1fcihkLmJsb2IpO2lmKGwuYnl0ZUxlbmd0aD09PTApcmV0dXJuIGMoNyk7cmV0dXJuIGYoe2Jsb2I6bCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkoby5yYXdJZCl9KX12YXIgaXM9cSgoKT0+e0IoKTtNKCk7RHQoKX0pO3ZhciB6cj0iIjtmdW5jdGlvbiBpdSgpe2lmKHR5cGVvZiB6ciE9PSJzdHJpbmcifHx6ci5sZW5ndGg9PT0wKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gd29ya2VyIHNvdXJjZSBub3QgZW1iZWRkZWQ7IHJ1biBwa2cgYnVpbGQgYmVmb3JlIHNwYXduIik7cmV0dXJuIGF0b2IoenIpfWZ1bmN0aW9uIG91KCl7aWYoanIhPT12b2lkIDApcmV0dXJuIGpyO2xldCBlPW5ldyBCbG9iKFtpdSgpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pO3JldHVybiBqcj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLGpyfWZ1bmN0aW9uIFZvKCl7aWYoWHI9PT12b2lkIDApdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBXb3JrZXIgQVBJIHVuYXZhaWxhYmxlOyBjYW5ub3Qgc3Bhd24gc3luYyB3b3JrZXIiKTtyZXR1cm4gbmV3IFhyKG91KCkse3R5cGU6Im1vZHVsZSJ9KX1mdW5jdGlvbiBPbyhlLHQscil7aWYob3M9PT12b2lkIDApdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBXb3JrZXIgQVBJIHVuYXZhaWxhYmxlOyBjYW5ub3QgcG9zdCB0byBzeW5jIHdvcmtlciIpO2lmKHIhPT12b2lkIDAmJnIubGVuZ3RoPjApb3MuY2FsbChlLHQse3RyYW5zZmVyOnJ9KTtlbHNlIG9zLmNhbGwoZSx0KX12YXIgWHIsb3MsanI7dmFyIF9vPXEoKCk9PntYcj10eXBlb2YgZ2xvYmFsVGhpcy5Xb3JrZXI9PT0iZnVuY3Rpb24iP2dsb2JhbFRoaXMuV29ya2VyOnZvaWQgMCxvcz1Ycj09PXZvaWQgMD92b2lkIDA6WHIucHJvdG90eXBlLnBvc3RNZXNzYWdlfSk7YXN5bmMgZnVuY3Rpb24gTm8oZSl7aWYoZT8uY3JlZElkIT09dm9pZCAwKXJldHVybiBmKGUuY3JlZElkKTtyZXR1cm4gS28oZSl9YXN5bmMgZnVuY3Rpb24gYXMoZSx0LHIpe2xldCBuPSRlKCk7aWYobiE9PTApcmV0dXJuIG47bGV0W3MsaV09WGUocik7aWYoaSE9PTApcmV0dXJuIGk7aWYocz09PXZvaWQgMClyZXR1cm4gOTthd2FpdCBxcigpO2xldCBvPW5ldyBVaW50OEFycmF5KHQuYnl0ZUxlbmd0aCk7by5zZXQodCk7bGV0IGE9e2xhcmdlQmxvYjp7d3JpdGU6by5idWZmZXJ9fSx1PXtwdWJsaWNLZXk6e2NoYWxsZW5nZTpUZShqZSkscnBJZDpzLGFsbG93Q3JlZGVudGlhbHM6W3t0eXBlOkJlLGlkOk1lKGUpfV0sdXNlclZlcmlmaWNhdGlvbjoicmVxdWlyZWQiLGV4dGVuc2lvbnM6YSwuLi5yPy5oaW50cyE9PXZvaWQgMD97aGludHM6ci5oaW50c306e319fSxkO3RyeXt0cnl7ZD1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KHUpfWNhdGNoKHkpe2lmKCFOcih5KSlyZXR1cm4gVWUoeSksMzA7a3QoKTt0cnl7ZD1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KHUpfWNhdGNoKG0pe3JldHVybiBVZShtKSwzMH19fWNhdGNoKHkpe3JldHVybiBVZSh5KSwzMH1maW5hbGx5e28uZmlsbCgwKX1sZXRbbCxwXT1HZShkKTtpZihwIT09MClyZXR1cm4gcDtpZihsPT09dm9pZCAwKXJldHVybiAyNztpZihsLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I/LndyaXR0ZW4hPT0hMClyZXR1cm4gMzA7cmV0dXJuIDB9ZnVuY3Rpb24gcW8oZSx0KXtyZXR1cm4gYXMoZSxuZXcgVWludDhBcnJheShEZSksdCl9dmFyIEZvPXEoKCk9PntCKCk7WHQoKTtNKCk7RHQoKTtpcygpfSk7dmFyIGNzLEp0PSJkaXBsb21hdGljLXByZiI7dmFyIHVzPXEoKCk9PntEdCgpO2NzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5wcmYudjEiKX0pO2Z1bmN0aW9uIGF1KGUpe2lmKGU9PT12b2lkIDApcmV0dXJuW107aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuW2VdO3JldHVybiBlLmZpbHRlcigodCk9PnQuYnl0ZUxlbmd0aD4wKX1mdW5jdGlvbiBjdShlKXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpcmV0dXJuITE7cmV0dXJuIGUubmFtZT09PSJOb3RTdXBwb3J0ZWRFcnJvciJ8fGUubmFtZT09PSJUeXBlRXJyb3IifWZ1bmN0aW9uIFdvKGUpe2lmKGU9PT12b2lkIDApcmV0dXJuO2xldCB0PV9yKGUpO2lmKHQuYnl0ZUxlbmd0aDxkcyl7dC5maWxsKDApO3JldHVybn1pZih0LmJ5dGVMZW5ndGg9PT1kcylyZXR1cm4gdDtsZXQgcj10LnNsaWNlKDAsZHMpO3JldHVybiB0LmZpbGwoMCkscn1hc3luYyBmdW5jdGlvbiB1dShlKXtsZXQgdD0kZSgpO2lmKHQhPT0wKXJldHVybiBjKHQpO2xldFtyLG5dPVhlKGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO2xldCBzPWU/LnVzZXJOYW1lPz9KdCxpPWU/LmRpc3BsYXlOYW1lPz9zLG89VGUoMTYpLGE9ZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9PT0iY3Jvc3MtcGxhdGZvcm0iLHU9e3Jlc2lkZW50S2V5OmE/ImRpc2NvdXJhZ2VkIjoicmVxdWlyZWQiLHJlcXVpcmVSZXNpZGVudEtleTohYSx1c2VyVmVyaWZpY2F0aW9uOmE/InByZWZlcnJlZCI6InJlcXVpcmVkIn07aWYoZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQhPT12b2lkIDApdS5hdXRoZW50aWNhdG9yQXR0YWNobWVudD1lLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50O2xldCBkPXtjaGFsbGVuZ2U6VGUoamUpLHJwOntpZDpyLG5hbWU6ZT8ucnBOYW1lPz9Wcn0sdXNlcjp7aWQ6byxuYW1lOnMsZGlzcGxheU5hbWU6aX0scHViS2V5Q3JlZFBhcmFtczpPcixhdXRoZW50aWNhdG9yU2VsZWN0aW9uOnUsLi4uZT8uaGludHMhPT12b2lkIDA/e2hpbnRzOmUuaGludHN9Ont9LC4uLmU/LmV4Y2x1ZGVDcmVkZW50aWFscyE9PXZvaWQgMCYmZS5leGNsdWRlQ3JlZGVudGlhbHMubGVuZ3RoPjA/e2V4Y2x1ZGVDcmVkZW50aWFsczplLmV4Y2x1ZGVDcmVkZW50aWFscy5tYXAoKHcpPT4oe3R5cGU6QmUsaWQ6TWUodyl9KSl9Ont9fSxsPWU/LnNhbHQhPT12b2lkIDA/TWUoZS5zYWx0KTp2b2lkIDAscD0odyk9PkZyKHtwdWJsaWNLZXk6ey4uLmQsZXh0ZW5zaW9uczp3JiZsIT09dm9pZCAwP3twcmY6e2V2YWw6e2ZpcnN0Omx9fX06e3ByZjp7fX19fSksaDt0cnl7aD1hd2FpdCBwKGwhPT12b2lkIDApfWNhdGNoKHcpe2lmKGw9PT12b2lkIDB8fCFjdSh3KSlyZXR1cm4gVWUodyksYygzMCk7dHJ5e2g9YXdhaXQgcCghMSl9Y2F0Y2goQSl7cmV0dXJuIFVlKEEpLGMoMzApfX1sZXRbeSxtXT1HZShoKTtpZihtIT09MClyZXR1cm4gYyhtKTtsZXQgZz15LmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKSxTPVdvKGcucHJmPy5yZXN1bHRzPy5maXJzdCksST1nLnByZj8uZW5hYmxlZD09PSEwfHxTIT09dm9pZCAwO2lmKGEmJlMhPT12b2lkIDApUy5maWxsKDApO3JldHVybiBmKHtjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkoeS5yYXdJZCksdXNlcklkOm5ldyBVaW50OEFycmF5KG8pLHByZkVuYWJsZWQ6SSxwcmY6YT92b2lkIDA6UyxhdHRhY2htZW50OnJzKHkuYXV0aGVudGljYXRvckF0dGFjaG1lbnQpLHRyYW5zcG9ydHM6bnMoeSksYWFndWlkOkhvKHkpfSl9YXN5bmMgZnVuY3Rpb24gem8oZSl7bGV0IHQ9JGUoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT1YZShlKTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz1lPy5zYWx0Pz9jcyxvPXtldmFsOntmaXJzdDpNZShzKX19LGE9ZT8uc2FsdHM7aWYoYSE9PXZvaWQgMCYmYS5sZW5ndGg+MCl7bGV0IGc9e307Zm9yKGxldCBTIG9mIGEpe2lmKFMuY3JlZElkLmJ5dGVMZW5ndGg9PT0wKWNvbnRpbnVlO2dbQWkoUy5jcmVkSWQpXT17Zmlyc3Q6TWUoUy5zYWx0KX19by5ldmFsQnlDcmVkZW50aWFsPWd9bGV0IHU9e2NoYWxsZW5nZTpUZShqZSkscnBJZDpyLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCIsZXh0ZW5zaW9uczp7cHJmOm99fTtpZihlPy5oaW50cyE9PXZvaWQgMCl1LmhpbnRzPWUuaGludHM7bGV0IGQ9YXUoZT8uY3JlZElkKTtpZihkLmxlbmd0aD4wKXUuYWxsb3dDcmVkZW50aWFscz1kLm1hcCgoZyk9Pih7dHlwZTpCZSxpZDpNZShnKX0pKTtsZXQgbDt0cnl7bD1hd2FpdCBXcih7cHVibGljS2V5OnV9KX1jYXRjaChnKXtyZXR1cm4gVWUoZyksYygzMCl9bGV0W3AsaF09R2UobCk7aWYoaCE9PTApcmV0dXJuIGMoaCk7bGV0IHk9cC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkucHJmPy5yZXN1bHRzO2lmKHk/LmZpcnN0PT09dm9pZCAwKXJldHVybiBjKDcpO2xldCBtPVdvKHkuZmlyc3QpO2lmKG09PT12b2lkIDApcmV0dXJuIGMoMjcpO3JldHVybiBmKHtwcmY6bSxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkocC5yYXdJZCksYXR0YWNobWVudDpycyhwLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOm5zKHApfSl9YXN5bmMgZnVuY3Rpb24gam8oZSl7bGV0IHQ9ZT8uc2FsdD8/Y3Mscj1lPy5jcmVkSWQsbj1yLHM9ZT8uY3JlYXRlQ3JlZElmTmVlZGVkPT09ITAmJihyPT09dm9pZCAwfHwhKHIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSYmci5sZW5ndGg9PT0wKSxpLG87aWYocyl7bGV0W2wscF09YXdhaXQgdXUoe3JwSWQ6ZT8ucnBJZCxycE5hbWU6ZT8ucnBOYW1lLHVzZXJOYW1lOmU/LnVzZXJOYW1lPz9KdCxkaXNwbGF5TmFtZTplPy5kaXNwbGF5TmFtZSxhdXRoZW50aWNhdG9yQXR0YWNobWVudDplPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxoaW50czplPy5oaW50cyxleGNsdWRlQ3JlZGVudGlhbHM6ZT8uZXhjbHVkZUNyZWRlbnRpYWxzLHNhbHQ6dH0pO2lmKHAhPT0wKXJldHVybiBjKHApO2lmKCFsLnByZkVuYWJsZWQpcmV0dXJuIGMoMzApO249bC5jcmVkSWQsaT1sLG89bC5wcmZ9bGV0IGE9KGwscCxoLHkpPT5mKHtwcmY6bCxzYWx0OnQuc2xpY2UoKSxjcmVkSWQ6cC5zbGljZSgpLHVzZXJJZDppPy51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmkudXNlcklkLnNsaWNlKCksYXR0YWNobWVudDpoPz9pPy5hdHRhY2htZW50LHRyYW5zcG9ydHM6eT8/aT8udHJhbnNwb3J0cyxhYWd1aWQ6aT8uYWFndWlkPT09dm9pZCAwP3ZvaWQgMDppLmFhZ3VpZC5zbGljZSgpfSk7aWYobyE9PXZvaWQgMCYmaSE9PXZvaWQgMClyZXR1cm4gYShvLGkuY3JlZElkLGkuYXR0YWNobWVudCxpLnRyYW5zcG9ydHMpO2xldFt1LGRdPWF3YWl0IHpvKHtycElkOmU/LnJwSWQscnBOYW1lOmU/LnJwTmFtZSxjcmVkSWQ6bixzYWx0OnQsaGludHM6ZT8uaGludHN9KTtpZihkIT09MClyZXR1cm4gYyhkKTtyZXR1cm4gYSh1LnByZix1LmNyZWRJZCx1LmF0dGFjaG1lbnQsdS50cmFuc3BvcnRzKX1hc3luYyBmdW5jdGlvbiBYbyhlLHQpe2xldCByPVtdLG49W10scz0hMTtmb3IobGV0IGQgb2YgZSl7aWYoZC5jcmVkSWQuYnl0ZUxlbmd0aD09PTApY29udGludWU7ci5wdXNoKGQuY3JlZElkKTtsZXQgbD1kLnNhbHQ/P3Quc2FsdDtpZighWShsLHQuc2FsdCkpcz0hMDtuLnB1c2goe2NyZWRJZDpkLmNyZWRJZCxzYWx0Omx9KX1sZXRbaSxvXT1hd2FpdCB6byh7cnBJZDp0LnJwSWQscnBOYW1lOnQucnBOYW1lLGhpbnRzOnQuaGludHMsY3JlZElkOnIubGVuZ3RoPjA/cjp2b2lkIDAsc2FsdDp0LnNhbHQsc2FsdHM6cz9uOnZvaWQgMH0pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhPWUuZmluZCgoZCk9PlkoZC5jcmVkSWQsaS5jcmVkSWQpKSx1PWE9PT12b2lkIDA/ZTpbYSwuLi5lLmZpbHRlcigoZCk9PmQhPT1hKV07cmV0dXJuIGYoe3ByZjppLnByZixjcmVkSWQ6aS5jcmVkSWQuc2xpY2UoKSxvcmRlcjp1fSl9dmFyIGRzPTMyO3ZhciAkbz1xKCgpPT57Y2UoKTtCKCk7TSgpO0R0KCk7dXMoKX0pO2FzeW5jIGZ1bmN0aW9uIEdvKGUsdCl7cmV0dXJuIHhlKHtwYXJlbnQ6ZSxwdXJwb3NlOnJlLlJlYWxtS2V5LGtkbTp0fSl9YXN5bmMgZnVuY3Rpb24gUW8oZSx0KXtyZXR1cm4geGUoe3BhcmVudDplLHB1cnBvc2U6cmUuUmVhbG1JRCxrZG06dH0pfWFzeW5jIGZ1bmN0aW9uIFlvKGUsdCl7cmV0dXJuIHhlKHtwYXJlbnQ6ZSxwdXJwb3NlOnJlLkhvc3RSTE0sa2RtOnR9KX12YXIgSm89cSgoKT0+e2ZlKCl9KTt2YXIgdm89e307dmEodm8se0VuY2xhdmU6KCk9PmllLE1VU0VDX01JTl9MRU46KCk9PkdyLGFzTWFzdGVyU2VlZDooKT0+JHIsZnJvbVNlZWRIb3N0czooKT0+Wm99KTtmdW5jdGlvbiBmdShlKXtyZXR1cm4gZS5tYXAoKHQpPT4oe2hhbmRsZTp0LmhhbmRsZSxsYWJlbDp0LmxhYmVsLGlkeDp0LmlkeD8/MH0pKX1mdW5jdGlvbiBabyhlKXtpZihlLmJ5dGVMZW5ndGg9PT0wfHxlLmV2ZXJ5KChhKT0+YT09PTApKXJldHVybiBjKDIyKTtpZihlLmJ5dGVMZW5ndGg8RGUrMSlyZXR1cm4gYygxNCk7bGV0IHQ9ZS5zdWJhcnJheSgwLERlKTtpZih0LmV2ZXJ5KChhKT0+YT09PTApKXJldHVybiBjKDIyKTtsZXQgcj1uZXcgVyhlLnN1YmFycmF5KERlKSksW24sc109ci5yZWFkU3RydWN0KFpuKTtpZihzIT09MClyZXR1cm4gYyhzKTtpZihuPT09dm9pZCAwKXJldHVybiBjKDE0KTtpZighci5kb25lKCkpcmV0dXJuIGMoMTQpO2xldFtpLG9dPWllLmZyb21CeXRlcyh0KTtpZihvIT09MClyZXR1cm4gYyhvKTtyZXR1cm4gZih7ZW5jbGF2ZTppLGhvc3RzOm4uaG9zdHMubWFwKChhKT0+KHsuLi5hfSkpfSl9ZnVuY3Rpb24gJHIoZSl7aWYoZS5ieXRlTGVuZ3RoIT09RGUpcmV0dXJuIGMoMTApO3JldHVybltlLDBdfWZ1bmN0aW9uIHB1KGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmJ5dGVMZW5ndGg7bisrKXtsZXQgcz1lW25dLGk9dFtuXTtpZihzPT09dm9pZCAwfHxpPT09dm9pZCAwKXJldHVybiExO3J8PXNeaX1yZXR1cm4gcj09PTB9Y2xhc3MgaWV7I2U7Y29uc3RydWN0b3IoZSl7dGhpcy4jZT1lfXN0YXRpYyBhc3luYyBmcm9tUmFuZG9tKGUpe2lmKGUuYnl0ZUxlbmd0aDxHcilyZXR1cm4gYygxMCk7bGV0IHQ9YXdhaXQgQW4oKSxyPXJ0KHQsZSk7dHJ5e2xldCBuPWF3YWl0IE50KHIpLFtzLGldPSRyKG4pO2lmKGkhPT0wKXJldHVybiBjKGkpO3JldHVybiBmKG5ldyBpZShzKSl9ZmluYWxseXt0LmZpbGwoMCksci5maWxsKDApLGUuZmlsbCgwKX19c3RhdGljIGZyb21CeXRlcyhlKXtsZXRbdCxyXT0kcihlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT0kcih0LnNsaWNlKCkpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKG5ldyBpZShuKSl9YXN5bmMgc2VhbFdpdGhQYXNza2V5KGUpe2xldFt0LHJdPWF3YWl0IGpvKGUpO2lmKHIhPT0wKXJldHVybiBjKHIpO3RyeXtsZXRbbixzXT1hd2FpdCB0aGlzLiNyKHQucHJmKTtpZihzIT09MClyZXR1cm4gYyhzKTtyZXR1cm4gZih7c2VhbGVkTWFzdGVyOm4sc2FsdDp0LnNhbHQsY3JlZElkOnQuY3JlZElkLHVzZXJJZDp0LnVzZXJJZCxhdHRhY2htZW50OnQuYXR0YWNobWVudCx0cmFuc3BvcnRzOnQudHJhbnNwb3J0cyxhYWd1aWQ6dC5hYWd1aWR9KX1maW5hbGx5e3QucHJmLmZpbGwoMCl9fWFzeW5jIGJpbmQoZSx0KXtpZih0IT09dm9pZCAwKXtmb3IobGV0IG8gb2YgdClpZighYXdhaXQgdGhpcy4jcyhvLmNyZWRJZCxvLnRhZykpcmV0dXJuIGMoMTApfWxldFtyLG5dPWF3YWl0IHRoaXMuc2VhbFdpdGhQYXNza2V5KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO2xldFtzLGldPWF3YWl0IHRoaXMuI3Qoci5jcmVkSWQpO2lmKGkhPT0wKXJldHVybiBjKGkpO3JldHVybiBmKHsuLi5yLHRhZzpzfSl9c3RhdGljIGFzeW5jIHVuc2VhbFdpdGhQYXNza2V5KGUsdCl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBjKDIyKTtsZXRbcixuXT1hd2FpdCBYbyhlLHQpO2lmKG4hPT0wKXJldHVybiBjKG4pO3RyeXtmb3IobGV0IHMgb2Ygci5vcmRlcil7bGV0W2ldPWF3YWl0IGllLiNpKHMuc2VhbGVkTWFzdGVyLHIucHJmKTtpZihpIT09dm9pZCAwKXJldHVybiBmKHtlbmNsYXZlOmksY3JlZElkOnIuY3JlZElkfSl9cmV0dXJuIGMoMjApfWZpbmFsbHl7ci5wcmYuZmlsbCgwKX19YXN5bmMgc2VhbFdpdGhJa20oZSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLiNyKGUpfWZpbmFsbHl7ZS5maWxsKDApfX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aElrbShlLHQpe3RyeXtyZXR1cm4gYXdhaXQgaWUuI2koZSx0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGU9W10sdCl7bGV0W3Isbl09YXdhaXQgTm8odCk7aWYobiE9PTApcmV0dXJuIGMobik7bGV0W3MsaV09dGhpcy4jbyhlKTtpZihpIT09MClyZXR1cm4gYyhpKTt0cnl7bGV0IG89YXdhaXQgYXMocixzLHQpO2lmKG8hPT0wKXJldHVybiBjKG8pO3JldHVybiBmKHIpfWZpbmFsbHl7cy5maWxsKDApfX1zdGF0aWMgYXN5bmMgZnJvbUxhcmdlQmxvYihlKXtsZXRbdCxyXT1hd2FpdCBMbyhlPy5jcmVkSWQsZSk7aWYociE9PTApcmV0dXJuIGMocik7dHJ5e2xldFtuLHNdPVpvKHQuYmxvYik7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIGYoey4uLm4sY3JlZElkOnQuY3JlZElkfSl9ZmluYWxseXt0LmJsb2IuZmlsbCgwKX19c3RhdGljIGNsZWFyTGFyZ2VCbG9iKGUsdCl7cmV0dXJuIHFvKGUsdCl9YXN5bmMgZHVtcFRvVHR5KCl7cmV0dXJuIDIxfXN0YXRpYyBwYWlyUmVxdWVzdCgpe3JldHVybiBQdC5jcmVhdGUoKX1hc3luYyBwYWlyQWNjZXB0KGUsdCxyKXtpZihyLnVzZXJDb250cm9sc0JvdGhTaWRlc09mUGFpciE9PSEwKXJldHVybiBjKDEwKTtsZXRbbixzXT1hd2FpdCBEbyhlKTtpZihzIT09MClyZXR1cm4gYyhzKTt0cnl7bGV0W2ksb109dGhpcy4jbyh0KTtpZihvIT09MClyZXR1cm4gYyhvKTt0cnl7dHJ5e2xldCBhPWF3YWl0IF90KGksbi5rZXkpO3JldHVybiBQbyhydChuLnB1YixhKSl9Y2F0Y2h7cmV0dXJuIGMoMTIpfX1maW5hbGx5e2kuZmlsbCgwKX19ZmluYWxseXtuLmtleS5maWxsKDApfX1zcGF3blN5bmNXb3JrZXIoZSl7bGV0IHQ9Vm8oKSxyPXRoaXMuI2Uuc2xpY2UoKTtyZXR1cm4gT28odCx7aWQ6ZS5pZCxvcDoic2V0U2VlZCIsc2VlZDpyLHBlcnNpc3Q6ZS5wZXJzaXN0fSxbci5idWZmZXJdKSx0fWFzeW5jIHJlYWxtSUQoZSl7cmV0dXJuIFFvKHRoaXMuI2UsZSl9YXN5bmMgaG9zdFJsbShlLHQpe2xldFtyLG5dPWF3YWl0IHRoaXMucmVhbG1JRChlKTtpZihuIT09MClyZXR1cm4gYyhuKTt0cnl7cmV0dXJuIGF3YWl0IFlvKHIsdCl9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jIHJlYWxtRm9yUmxtKGUsdCxyKXtmb3IobGV0IG4gb2Ygcil7bGV0W3MsaV09YXdhaXQgdGhpcy5ob3N0UmxtKG4sZSk7aWYoaSE9PTApcmV0dXJuIGMoaSk7bGV0IG89cHUocyx0KTtpZihzLmZpbGwoMCksbylyZXR1cm4gZih7bGFiZWw6bi5sYWJlbCxpbmRleDpuLmluZGV4fSl9cmV0dXJuIGMoMTMpfWRlcml2ZUNpcGhlcihlLHQscj16KXtsZXQgbj1lLnNsaWNlKCkscz17bGFiZWw6ci5sYWJlbCxpbmRleDpyLmluZGV4fSxpPSh1KT0+dGhpcy4jZChuLHUscyksbz0odSk9PnRoaXMuI2wobix1LHMpO3JldHVybntlbmNyeXB0Ok9iamVjdC5mcmVlemUoe2VuY3J5cHQ6aX0pLGRlY3J5cHQ6T2JqZWN0LmZyZWV6ZSh7ZGVjcnlwdDpvfSksYm90aDpPYmplY3QuZnJlZXplKHtlbmNyeXB0OmksZGVjcnlwdDpvfSl9W3RdfWFzeW5jIGRlcml2ZUlkZW50aXR5KGUpe2xldCB0PXtsYWJlbDplLmxhYmVsLGluZGV4OmUuaW5kZXh9LFtyLG5dPWF3YWl0IHRoaXMuI3UodCk7aWYobiE9PTApcmV0dXJuIGMobik7bGV0IHM9ci5wdWJsaWNLZXk7cmV0dXJuIHIucHJpdmF0ZUtleS5maWxsKDApLGYoT2JqZWN0LmZyZWV6ZSh7cHVibGljS2V5OnMsc2lnbjooaSk9PnRoaXMuI3AodCxpKSxrZG1Gb3I6KGkpPT50aGlzLiNoKHQsaSl9KSl9YXN5bmMgZmluZ2VycHJpbnQoZT16KXtyZXR1cm4gYXdhaXQgeGUoe3BhcmVudDp0aGlzLiNlLHB1cnBvc2U6cmUuRmluZ2VycHJpbnQsa2RtOmV9KX1hc3luYyN0KGUpe3JldHVybiBhd2FpdCB4ZSh7cGFyZW50OnRoaXMuI2UscHVycG9zZTpyZS5CaW5kVGFnLGtkbTplfSl9YXN5bmMjcyhlLHQpe2lmKHQuYnl0ZUxlbmd0aCE9PWR1KXJldHVybiExO2xldFtyLG5dPWF3YWl0IHRoaXMuI3QoZSk7aWYobiE9PTApcmV0dXJuITE7dHJ5e2lmKHIuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtsZXQgcz0wO2ZvcihsZXQgaT0wO2k8ci5ieXRlTGVuZ3RoO2krKyl7bGV0IG89cltpXSxhPXRbaV07aWYobz09PXZvaWQgMHx8YT09PXZvaWQgMClyZXR1cm4hMTtzfD1vXmF9cmV0dXJuIHM9PT0wfWZpbmFsbHl7ci5maWxsKDApfX1zdGF0aWMgYXN5bmMjbihlKXtpZihlLmJ5dGVMZW5ndGg8bHUpcmV0dXJuIGMoMTApO3JldHVybiB4ZSh7cGFyZW50OmUscHVycG9zZTpyZS5CaW5kLGtkbTp6fSl9YXN5bmMjcihlKXtsZXRbdCxyXT1hd2FpdCBpZS4jbihlKTtpZihyIT09MClyZXR1cm4gYyhyKTt0cnl7bGV0IG49YXdhaXQgX3QodGhpcy4jZSx0KTtyZXR1cm4gbnQobil9Y2F0Y2h7cmV0dXJuIGMoMTIpfWZpbmFsbHl7dC5maWxsKDApfX1zdGF0aWMgYXN5bmMjaShlLHQpe2xldFsscl09bnQoZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109YXdhaXQgaWUuI24odCk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0IGk7dHJ5e3RyeXtpPWF3YWl0IHl0KGUsbil9Y2F0Y2h7cmV0dXJuIGMoMjApfXJldHVybiBpZS5mcm9tQnl0ZXMoaSl9ZmluYWxseXtuLmZpbGwoMCksaT8uZmlsbCgwKX19I28oZSl7bGV0IHQ9bmV3IEYscj10LndyaXRlU3RydWN0KFpuLHtob3N0czpmdShlKX0pO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXQucmVzdWx0KCkscz1uZXcgVWludDhBcnJheShEZStuLmJ5dGVMZW5ndGgpO3JldHVybiBzLnNldCh0aGlzLiNlLDApLHMuc2V0KG4sRGUpLFtzLDBdfWFzeW5jI2QoZSx0LHIpe2xldFtuLHNdPWF3YWl0IHRoaXMuI2EoZSxyKTtpZihzIT09MClyZXR1cm4gYyhzKTt0cnl7dHJ5e3JldHVybiBmKGF3YWl0IF90KHQsbikpfWNhdGNoe3JldHVybiBjKDI5KX19ZmluYWxseXtuLmZpbGwoMCl9fWFzeW5jI2woZSx0LHIpe2xldFtuLHNdPWF3YWl0IHRoaXMuI2EoZSxyKTtpZihzIT09MClyZXR1cm4gYyhzKTt0cnl7dHJ5e3JldHVybiBmKGF3YWl0IHl0KHQsbikpfWNhdGNoe3JldHVybiBjKDIwKX19ZmluYWxseXtuLmZpbGwoMCl9fWFzeW5jI2EoZSx0KXtsZXRbcixuXT1hd2FpdCB0aGlzLiNmKHQpO2lmKG4hPT0wKXJldHVybiBjKG4pO3RyeXtyZXR1cm4gYXdhaXQgeGUoe3BhcmVudDpyLHB1cnBvc2U6cmUuQ2lwaGVyLGtkbTplfSl9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI2YoZSl7cmV0dXJuIEdvKHRoaXMuI2UsZSl9YXN5bmMjYyhlKXtyZXR1cm4gYXdhaXQgeGUoe3BhcmVudDp0aGlzLiNlLHB1cnBvc2U6cmUuSWRlbnRpdHksa2RtOmV9KX1hc3luYyN1KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuI2MoZSk7aWYociE9PTApcmV0dXJuIGMocik7dHJ5e3RyeXtyZXR1cm4gZihhd2FpdCBQbihodSh0KSkpfWNhdGNoe3JldHVybiBjKDI5KX19ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jI3AoZSx0KXtsZXRbcixuXT1hd2FpdCB0aGlzLiN1KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3RyeXt0cnl7cmV0dXJuIGYoYXdhaXQga24odCxyLnByaXZhdGVLZXkpKX1jYXRjaHtyZXR1cm4gYygyOSl9fWZpbmFsbHl7ci5wcml2YXRlS2V5LmZpbGwoMCl9fWFzeW5jI2goZSx0KXtsZXRbcixuXT1hd2FpdCB0aGlzLiNjKGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3RyeXtsZXRbcyxpXT1hd2FpdCB4ZSh7cGFyZW50OnIscHVycG9zZTpyZS5CYWdLZG0sa2RtOnR9KTtpZihpIT09MClyZXR1cm4gYyhpKTt0cnl7cmV0dXJuIGYocy5zbGljZSgwLE5lKSl9ZmluYWxseXtzLmZpbGwoMCl9fWZpbmFsbHl7ci5maWxsKDApfX19ZnVuY3Rpb24gaHUoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoZSl7Zm9yKGxldCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKXtpZih5dS5oYXModCkpY29udGludWU7bGV0IHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHI9PT12b2lkIDB8fHR5cGVvZiByLnZhbHVlIT09ImZ1bmN0aW9uIiljb250aW51ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLnZhbHVlLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMX0pfX12YXIgZHU9MzIsbHU9MTYsR3I9MzIseXU7dmFyIFl0PXEoKCk9PntjZSgpO3NlKCk7RW8oKTtCKCk7WHQoKTtNKCk7ZmUoKTtxdCgpO1VvKCk7aXMoKTtfbygpO0ZvKCk7JG8oKTtKbygpO3l1PW5ldyBTZXQoWyJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImxlbmd0aCIsIm5hbWUiXSk7ZWEoaWUpO2VhKGllLnByb3RvdHlwZSl9KTtCKCk7ZnVuY3Rpb24gVnMoZSl7aWYoIWV8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gZSl8fCEoImlkImluIGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5vcD09PSJzdHJpbmciJiZ0eXBlb2YgZS5pZD09PSJudW1iZXIifWZ1bmN0aW9uIE9zKGUpe2xldCB0PWUubGVuZ3RoLHI9MCxuPTA7d2hpbGUobjx0KXtsZXQgcz1lLmNoYXJDb2RlQXQobisrKTtpZigocyY0Mjk0OTY3MTY4KT09PTApe3IrKztjb250aW51ZX1lbHNlIGlmKChzJjQyOTQ5NjUyNDgpPT09MClyKz0yO2Vsc2V7aWYocz49NTUyOTYmJnM8PTU2MzE5KXtpZihuPHQpe2xldCBpPWUuY2hhckNvZGVBdChuKTtpZigoaSY2NDUxMik9PT01NjMyMCkrK24scz0oKHMmMTAyMyk8PDEwKSsoaSYxMDIzKSs2NTUzNn19aWYoKHMmNDI5NDkwMTc2MCk9PT0wKXIrPTM7ZWxzZSByKz00fX1yZXR1cm4gcn1mdW5jdGlvbiBDYShlLHQscil7bGV0IG49ZS5sZW5ndGgscz1yLGk9MDt3aGlsZShpPG4pe2xldCBvPWUuY2hhckNvZGVBdChpKyspO2lmKChvJjQyOTQ5NjcxNjgpPT09MCl7dFtzKytdPW87Y29udGludWV9ZWxzZSBpZigobyY0Mjk0OTY1MjQ4KT09PTApdFtzKytdPW8+PjYmMzF8MTkyO2Vsc2V7aWYobz49NTUyOTYmJm88PTU2MzE5KXtpZihpPG4pe2xldCBhPWUuY2hhckNvZGVBdChpKTtpZigoYSY2NDUxMik9PT01NjMyMCkrK2ksbz0oKG8mMTAyMyk8PDEwKSsoYSYxMDIzKSs2NTUzNn19aWYoKG8mNDI5NDkwMTc2MCk9PT0wKXRbcysrXT1vPj4xMiYxNXwyMjQsdFtzKytdPW8+PjYmNjN8MTI4O2Vsc2UgdFtzKytdPW8+PjE4Jjd8MjQwLHRbcysrXT1vPj4xMiY2M3wxMjgsdFtzKytdPW8+PjYmNjN8MTI4fXRbcysrXT1vJjYzfDEyOH19dmFyIFRhPW5ldyBUZXh0RW5jb2RlcixNYT01MDtmdW5jdGlvbiBSYShlLHQscil7VGEuZW5jb2RlSW50byhlLHQuc3ViYXJyYXkocikpfWZ1bmN0aW9uIF9zKGUsdCxyKXtpZihlLmxlbmd0aD5NYSlSYShlLHQscik7ZWxzZSBDYShlLHQscil9dmFyIEhhPTQwOTY7ZnVuY3Rpb24gZW4oZSx0LHIpe2xldCBuPXQscz1uK3IsaT1bXSxvPSIiO3doaWxlKG48cyl7bGV0IGE9ZVtuKytdO2lmKChhJjEyOCk9PT0wKWkucHVzaChhKTtlbHNlIGlmKChhJjIyNCk9PT0xOTIpe2xldCB1PWVbbisrXSY2MztpLnB1c2goKGEmMzEpPDw2fHUpfWVsc2UgaWYoKGEmMjQwKT09PTIyNCl7bGV0IHU9ZVtuKytdJjYzLGQ9ZVtuKytdJjYzO2kucHVzaCgoYSYzMSk8PDEyfHU8PDZ8ZCl9ZWxzZSBpZigoYSYyNDgpPT09MjQwKXtsZXQgdT1lW24rK10mNjMsZD1lW24rK10mNjMsbD1lW24rK10mNjMscD0oYSY3KTw8MTh8dTw8MTJ8ZDw8NnxsO2lmKHA+NjU1MzUpcC09NjU1MzYsaS5wdXNoKHA+Pj4xMCYxMDIzfDU1Mjk2KSxwPTU2MzIwfHAmMTAyMztpLnB1c2gocCl9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGg+PUhhKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSksaS5sZW5ndGg9MH1pZihpLmxlbmd0aD4wKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSk7cmV0dXJuIG99dmFyIEthPW5ldyBUZXh0RGVjb2RlcixMYT0yMDA7ZnVuY3Rpb24gVmEoZSx0LHIpe2xldCBuPWUuc3ViYXJyYXkodCx0K3IpO3JldHVybiBLYS5kZWNvZGUobil9ZnVuY3Rpb24gTnMoZSx0LHIpe2lmKHI+TGEpcmV0dXJuIFZhKGUsdCxyKTtlbHNlIHJldHVybiBlbihlLHQscil9Y2xhc3MgdXR7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIGhlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9T2JqZWN0LmNyZWF0ZShoZS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6aGUubmFtZX0pfX12YXIgZHQ9NDI5NDk2NzI5NTtmdW5jdGlvbiBxcyhlLHQscil7bGV0IG49ci80Mjk0OTY3Mjk2LHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBucihlLHQscil7bGV0IG49TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBzcihlLHQpe2xldCByPWUuZ2V0SW50MzIodCksbj1lLmdldFVpbnQzMih0KzQpO3JldHVybiByKjQyOTQ5NjcyOTYrbn1mdW5jdGlvbiBGcyhlLHQpe2xldCByPWUuZ2V0VWludDMyKHQpLG49ZS5nZXRVaW50MzIodCs0KTtyZXR1cm4gcio0Mjk0OTY3Mjk2K259dmFyIE9hPS0xLF9hPTQyOTQ5NjcyOTUsTmE9MTcxNzk4NjkxODM7ZnVuY3Rpb24gcWEoe3NlYzplLG5zZWM6dH0pe2lmKGU+PTAmJnQ+PTAmJmU8PU5hKWlmKHQ9PT0wJiZlPD1fYSl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLmJ1ZmZlcikuc2V0VWludDMyKDAsZSkscn1lbHNle2xldCByPWUvNDI5NDk2NzI5NixuPWUmNDI5NDk2NzI5NSxzPW5ldyBVaW50OEFycmF5KDgpLGk9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtyZXR1cm4gaS5zZXRVaW50MzIoMCx0PDwyfHImMyksaS5zZXRVaW50MzIoNCxuKSxzfWVsc2V7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMTIpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyKTtyZXR1cm4gbi5zZXRVaW50MzIoMCx0KSxucihuLDQsZSkscn19ZnVuY3Rpb24gRmEoZSl7bGV0IHQ9ZS5nZXRUaW1lKCkscj1NYXRoLmZsb29yKHQvMTAwMCksbj0odC1yKjEwMDApKjFlNixzPU1hdGguZmxvb3Iobi8xZTkpO3JldHVybntzZWM6citzLG5zZWM6bi1zKjFlOX19ZnVuY3Rpb24gV2EoZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCB0PUZhKGUpO3JldHVybiBxYSh0KX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIHphKGUpe2xldCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCByPXQuZ2V0VWludDMyKDApLG49MDtyZXR1cm57c2VjOnIsbnNlYzowfX1jYXNlIDg6e2xldCByPXQuZ2V0VWludDMyKDApLG49dC5nZXRVaW50MzIoNCkscz0ociYzKSo0Mjk0OTY3Mjk2K24saT1yPj4+MjtyZXR1cm57c2VjOnMsbnNlYzppfX1jYXNlIDEyOntsZXQgcj1zcih0LDQpLG49dC5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpyLG5zZWM6bn19ZGVmYXVsdDp0aHJvdyBuZXcgaGUoYFVucmVjb2duaXplZCBkYXRhIHNpemUgZm9yIHRpbWVzdGFtcCAoZXhwZWN0ZWQgNCwgOCwgb3IgMTIpOiAke2UubGVuZ3RofWApfX1mdW5jdGlvbiBqYShlKXtsZXQgdD16YShlKTtyZXR1cm4gbmV3IERhdGUodC5zZWMqMTAwMCt0Lm5zZWMvMWU2KX12YXIgV3M9e3R5cGU6T2EsZW5jb2RlOldhLGRlY29kZTpqYX07Y2xhc3MgbHR7c3RhdGljIGRlZmF1bHRDb2RlYz1uZXcgbHQ7X19icmFuZDtidWlsdEluRW5jb2RlcnM9W107YnVpbHRJbkRlY29kZXJzPVtdO2VuY29kZXJzPVtdO2RlY29kZXJzPVtdO2NvbnN0cnVjdG9yKCl7dGhpcy5yZWdpc3RlcihXcyl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6cn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09cjtlbHNle2xldCBuPS0xLWU7dGhpcy5idWlsdEluRW5jb2RlcnNbbl09dCx0aGlzLmJ1aWx0SW5EZWNvZGVyc1tuXT1yfX10cnlUb0VuY29kZShlLHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5idWlsdEluRW5jb2RlcnMubGVuZ3RoO3IrKyl7bGV0IG49dGhpcy5idWlsdEluRW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpe2xldCBpPS0xLXI7cmV0dXJuIG5ldyB1dChpLHMpfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuZW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpcmV0dXJuIG5ldyB1dChyLHMpfX1pZihlIGluc3RhbmNlb2YgdXQpcmV0dXJuIGU7cmV0dXJuIG51bGx9ZGVjb2RlKGUsdCxyKXtsZXQgbj10PDA/dGhpcy5idWlsdEluRGVjb2RlcnNbLTEtdF06dGhpcy5kZWNvZGVyc1t0XTtpZihuKXJldHVybiBuKGUsdCxyKTtlbHNlIHJldHVybiBuZXcgdXQodCxlKX19ZnVuY3Rpb24gWGEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyfWZ1bmN0aW9uIEN0KGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtlbHNlIGlmKFhhKGUpKXJldHVybiBuZXcgVWludDhBcnJheShlKTtlbHNlIHJldHVybiBVaW50OEFycmF5LmZyb20oZSl9dmFyICRhPTEwMCxHYT0yMDQ4O2NsYXNzIGlye2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7bWF4RGVwdGg7aW5pdGlhbEJ1ZmZlclNpemU7c29ydEtleXM7Zm9yY2VGbG9hdDMyO2lnbm9yZVVuZGVmaW5lZDtmb3JjZUludGVnZXJUb0Zsb2F0O3Bvczt2aWV3O2J5dGVzO2VudGVyZWQ9ITE7Y29uc3RydWN0b3IoZSl7dGhpcy5leHRlbnNpb25Db2RlYz1lPy5leHRlbnNpb25Db2RlYz8/bHQuZGVmYXVsdENvZGVjLHRoaXMuY29udGV4dD1lPy5jb250ZXh0LHRoaXMudXNlQmlnSW50NjQ9ZT8udXNlQmlnSW50NjQ/PyExLHRoaXMubWF4RGVwdGg9ZT8ubWF4RGVwdGg/PyRhLHRoaXMuaW5pdGlhbEJ1ZmZlclNpemU9ZT8uaW5pdGlhbEJ1ZmZlclNpemU/P0dhLHRoaXMuc29ydEtleXM9ZT8uc29ydEtleXM/PyExLHRoaXMuZm9yY2VGbG9hdDMyPWU/LmZvcmNlRmxvYXQzMj8/ITEsdGhpcy5pZ25vcmVVbmRlZmluZWQ9ZT8uaWdub3JlVW5kZWZpbmVkPz8hMSx0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQ9ZT8uZm9yY2VJbnRlZ2VyVG9GbG9hdD8/ITEsdGhpcy5wb3M9MCx0aGlzLnZpZXc9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSksdGhpcy5ieXRlcz1uZXcgVWludDhBcnJheSh0aGlzLnZpZXcuYnVmZmVyKX1jbG9uZSgpe3JldHVybiBuZXcgaXIoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGVTaGFyZWRSZWYoZSk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnN1YmFycmF5KDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1lbmNvZGUoZSl7aWYodGhpcy5lbnRlcmVkKXJldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlKGUpO3RyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zbGljZSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9FbmNvZGUoZSx0KXtpZih0PnRoaXMubWF4RGVwdGgpdGhyb3cgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO2lmKGU9PW51bGwpdGhpcy5lbmNvZGVOaWwoKTtlbHNlIGlmKHR5cGVvZiBlPT09ImJvb2xlYW4iKXRoaXMuZW5jb2RlQm9vbGVhbihlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im51bWJlciIpaWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCl0aGlzLmVuY29kZU51bWJlcihlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIGlmKHR5cGVvZiBlPT09InN0cmluZyIpdGhpcy5lbmNvZGVTdHJpbmcoZSk7ZWxzZSBpZih0aGlzLnVzZUJpZ0ludDY0JiZ0eXBlb2YgZT09PSJiaWdpbnQiKXRoaXMuZW5jb2RlQmlnSW50NjQoZSk7ZWxzZSB0aGlzLmVuY29kZU9iamVjdChlLHQpfWVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKGUpe2xldCB0PXRoaXMucG9zK2U7aWYodGhpcy52aWV3LmJ5dGVMZW5ndGg8dCl0aGlzLnJlc2l6ZUJ1ZmZlcih0KjIpfXJlc2l6ZUJ1ZmZlcihlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZSkscj1uZXcgVWludDhBcnJheSh0KSxuPW5ldyBEYXRhVmlldyh0KTtyLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9bix0aGlzLmJ5dGVzPXJ9ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXtpZihlPT09ITEpdGhpcy53cml0ZVU4KDE5NCk7ZWxzZSB0aGlzLndyaXRlVTgoMTk1KX1lbmNvZGVOdW1iZXIoZSl7aWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCYmTnVtYmVyLmlzU2FmZUludGVnZXIoZSkpaWYoZT49MClpZihlPDEyOCl0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZSBpZihlPDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKTtlbHNlIGlmKCF0aGlzLnVzZUJpZ0ludDY0KXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSk7ZWxzZSB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk7ZWxzZSBpZihlPj0tMzIpdGhpcy53cml0ZVU4KDIyNHxlKzMyKTtlbHNlIGlmKGU+PS0xMjgpdGhpcy53cml0ZVU4KDIwOCksdGhpcy53cml0ZUk4KGUpO2Vsc2UgaWYoZT49LTMyNzY4KXRoaXMud3JpdGVVOCgyMDkpLHRoaXMud3JpdGVJMTYoZSk7ZWxzZSBpZihlPj0tMjE0NzQ4MzY0OCl0aGlzLndyaXRlVTgoMjEwKSx0aGlzLndyaXRlSTMyKGUpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUk2NChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe2lmKHRoaXMuZm9yY2VGbG9hdDMyKXRoaXMud3JpdGVVOCgyMDIpLHRoaXMud3JpdGVGMzIoZSk7ZWxzZSB0aGlzLndyaXRlVTgoMjAzKSx0aGlzLndyaXRlRjY0KGUpfWVuY29kZUJpZ0ludDY0KGUpe2lmKGU+PUJpZ0ludCgwKSl0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpO2Vsc2UgdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpfXdyaXRlU3RyaW5nSGVhZGVyKGUpe2lmKGU8MzIpdGhpcy53cml0ZVU4KDE2MCtlKTtlbHNlIGlmKGU8MjU2KXRoaXMud3JpdGVVOCgyMTcpLHRoaXMud3JpdGVVOChlKTtlbHNlIGlmKGU8NjU1MzYpdGhpcy53cml0ZVU4KDIxOCksdGhpcy53cml0ZVUxNihlKTtlbHNlIGlmKGU8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsb25nIHN0cmluZzogJHtlfSBieXRlcyBpbiBVVEYtOGApfWVuY29kZVN0cmluZyhlKXtsZXQgcj1PcyhlKTt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDUrciksdGhpcy53cml0ZVN0cmluZ0hlYWRlcihyKSxfcyhlLHRoaXMuYnl0ZXMsdGhpcy5wb3MpLHRoaXMucG9zKz1yfWVuY29kZU9iamVjdChlLHQpe2xldCByPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKHIhPW51bGwpdGhpcy5lbmNvZGVFeHRlbnNpb24ocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im9iamVjdCIpdGhpcy5lbmNvZGVNYXAoZSx0KTtlbHNlIHRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgb2JqZWN0OiAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZSl9YCl9ZW5jb2RlQmluYXJ5KGUpe2xldCB0PWUuYnl0ZUxlbmd0aDtpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk2KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgxOTcpLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDE5OCksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgYmluYXJ5OiAke3R9YCk7bGV0IHI9Q3QoZSk7dGhpcy53cml0ZVU4YShyKX1lbmNvZGVBcnJheShlLHQpe2xldCByPWUubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDE0NCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihyKTtlbHNlIGlmKHI8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIxKSx0aGlzLndyaXRlVTMyKHIpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtyfWApO2ZvcihsZXQgbiBvZiBlKXRoaXMuZG9FbmNvZGUobix0KzEpfWNvdW50V2l0aG91dFVuZGVmaW5lZChlLHQpe2xldCByPTA7Zm9yKGxldCBuIG9mIHQpaWYoZVtuXSE9PXZvaWQgMClyKys7cmV0dXJuIHJ9ZW5jb2RlTWFwKGUsdCl7bGV0IHI9T2JqZWN0LmtleXMoZSk7aWYodGhpcy5zb3J0S2V5cylyLnNvcnQoKTtsZXQgbj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLHIpOnIubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDEyOCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihuKTtlbHNlIGlmKG48NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIzKSx0aGlzLndyaXRlVTMyKG4pO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke259YCk7Zm9yKGxldCBzIG9mIHIpe2xldCBpPWVbc107aWYoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCYmaT09PXZvaWQgMCkpdGhpcy5lbmNvZGVTdHJpbmcocyksdGhpcy5kb0VuY29kZShpLHQrMSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZih0eXBlb2YgZS5kYXRhPT09ImZ1bmN0aW9uIil7bGV0IHI9ZS5kYXRhKHRoaXMucG9zKzYpLG49ci5sZW5ndGg7aWYobj49NDI5NDk2NzI5Nil0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGV4dGVuc2lvbiBvYmplY3Q6ICR7bn1gKTt0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEocik7cmV0dXJufWxldCB0PWUuZGF0YS5sZW5ndGg7aWYodD09PTEpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZih0PT09Mil0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKHQ9PT00KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYodD09PTgpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZih0PT09MTYpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwMSksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEoZS5kYXRhKX13cml0ZVU4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldFVpbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVOGEoZSl7bGV0IHQ9ZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSh0KSx0aGlzLmJ5dGVzLnNldChlLHRoaXMucG9zKSx0aGlzLnBvcys9dH13cml0ZUk4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldEludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVUxNihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRVaW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVJMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVVMzIoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0VWludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlSTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsZSksdGhpcy5wb3MrPTR9d3JpdGVGNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSx0aGlzLnZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZVU2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHFzKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUk2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLG5yKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19ZnVuY3Rpb24gWWUoZSx0KXtyZXR1cm4gbmV3IGlyKHQpLmVuY29kZVNoYXJlZFJlZihlKX1mdW5jdGlvbiBvcihlKXtyZXR1cm5gJHtlPDA/Ii0iOiIifTB4JHtNYXRoLmFicyhlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWB9dmFyIFFhPTE2LFlhPTE2O2NsYXNzIHRue2hpdD0wO21pc3M9MDtjYWNoZXM7bWF4S2V5TGVuZ3RoO21heExlbmd0aFBlcktleTtjb25zdHJ1Y3RvcihlPVFhLHQ9WWEpe3RoaXMubWF4S2V5TGVuZ3RoPWUsdGhpcy5tYXhMZW5ndGhQZXJLZXk9dCx0aGlzLmNhY2hlcz1bXTtmb3IobGV0IHI9MDtyPHRoaXMubWF4S2V5TGVuZ3RoO3IrKyl0aGlzLmNhY2hlcy5wdXNoKFtdKX1jYW5CZUNhY2hlZChlKXtyZXR1cm4gZT4wJiZlPD10aGlzLm1heEtleUxlbmd0aH1maW5kKGUsdCxyKXtsZXQgbj10aGlzLmNhY2hlc1tyLTFdO2U6Zm9yKGxldCBzIG9mIG4pe2xldCBpPXMuYnl0ZXM7Zm9yKGxldCBvPTA7bzxyO28rKylpZihpW29dIT09ZVt0K29dKWNvbnRpbnVlIGU7cmV0dXJuIHMuc3RyfXJldHVybiBudWxsfXN0b3JlKGUsdCl7bGV0IHI9dGhpcy5jYWNoZXNbZS5sZW5ndGgtMV0sbj17Ynl0ZXM6ZSxzdHI6dH07aWYoci5sZW5ndGg+PXRoaXMubWF4TGVuZ3RoUGVyS2V5KXJbTWF0aC5yYW5kb20oKSpyLmxlbmd0aHwwXT1uO2Vsc2Ugci5wdXNoKG4pfWRlY29kZShlLHQscil7bGV0IG49dGhpcy5maW5kKGUsdCxyKTtpZihuIT1udWxsKXJldHVybiB0aGlzLmhpdCsrLG47dGhpcy5taXNzKys7bGV0IHM9ZW4oZSx0LHIpLGk9VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLHQsdCtyKTtyZXR1cm4gdGhpcy5zdG9yZShpLHMpLHN9fXZhciBybj0iYXJyYXkiLE10PSJtYXBfa2V5Iixqcz0ibWFwX3ZhbHVlIixKYT0oZSk9PntpZih0eXBlb2YgZT09PSJzdHJpbmcifHx0eXBlb2YgZT09PSJudW1iZXIiKXJldHVybiBlO3Rocm93IG5ldyBoZSgiVGhlIHR5cGUgb2Yga2V5IG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciBidXQgIit0eXBlb2YgZSl9O2NsYXNzIFhze3N0YWNrPVtdO3N0YWNrSGVhZFBvc2l0aW9uPS0xO2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5zdGFja0hlYWRQb3NpdGlvbisxfXRvcCgpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXB1c2hBcnJheVN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9cm4sdC5wb3NpdGlvbj0wLHQuc2l6ZT1lLHQuYXJyYXk9QXJyYXkoZSl9cHVzaE1hcFN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9TXQsdC5yZWFkQ291bnQ9MCx0LnNpemU9ZSx0Lm1hcD17fX1nZXRVbmluaXRpYWxpemVkU3RhdGVGcm9tUG9vbCgpe2lmKHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rKyx0aGlzLnN0YWNrSGVhZFBvc2l0aW9uPT09dGhpcy5zdGFjay5sZW5ndGgpe2xldCBlPXt0eXBlOnZvaWQgMCxzaXplOjAsYXJyYXk6dm9pZCAwLHBvc2l0aW9uOjAscmVhZENvdW50OjAsbWFwOnZvaWQgMCxrZXk6bnVsbH07dGhpcy5zdGFjay5wdXNoKGUpfXJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXJlbGVhc2UoZSl7aWYodGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXSE9PWUpdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhY2sgc3RhdGUuIFJlbGVhc2VkIHN0YXRlIGlzIG5vdCBvbiB0b3Agb2YgdGhlIHN0YWNrLiIpO2lmKGUudHlwZT09PXJuKXtsZXQgcj1lO3Iuc2l6ZT0wLHIuYXJyYXk9dm9pZCAwLHIucG9zaXRpb249MCxyLnR5cGU9dm9pZCAwfWlmKGUudHlwZT09PU10fHxlLnR5cGU9PT1qcyl7bGV0IHI9ZTtyLnNpemU9MCxyLm1hcD12b2lkIDAsci5yZWFkQ291bnQ9MCxyLnR5cGU9dm9pZCAwfXRoaXMuc3RhY2tIZWFkUG9zaXRpb24tLX1yZXNldCgpe3RoaXMuc3RhY2subGVuZ3RoPTAsdGhpcy5zdGFja0hlYWRQb3NpdGlvbj0tMX19dmFyIFR0PS0xLG5uPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpLFphPW5ldyBVaW50OEFycmF5KG5uLmJ1ZmZlcik7dHJ5e25uLmdldEludDgoMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIil9dmFyIHpzPVJhbmdlRXJyb3IoIkluc3VmZmljaWVudCBkYXRhIiksZWM9bmV3IHRuO2NsYXNzIGFye2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7cmF3U3RyaW5nczttYXhTdHJMZW5ndGg7bWF4QmluTGVuZ3RoO21heEFycmF5TGVuZ3RoO21heE1hcExlbmd0aDttYXhFeHRMZW5ndGg7a2V5RGVjb2RlcjttYXBLZXlDb252ZXJ0ZXI7dG90YWxQb3M9MDtwb3M9MDt2aWV3PW5uO2J5dGVzPVphO2hlYWRCeXRlPVR0O3N0YWNrPW5ldyBYcztlbnRlcmVkPSExO2NvbnN0cnVjdG9yKGUpe3RoaXMuZXh0ZW5zaW9uQ29kZWM9ZT8uZXh0ZW5zaW9uQ29kZWM/P2x0LmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLnJhd1N0cmluZ3M9ZT8ucmF3U3RyaW5ncz8/ITEsdGhpcy5tYXhTdHJMZW5ndGg9ZT8ubWF4U3RyTGVuZ3RoPz9kdCx0aGlzLm1heEJpbkxlbmd0aD1lPy5tYXhCaW5MZW5ndGg/P2R0LHRoaXMubWF4QXJyYXlMZW5ndGg9ZT8ubWF4QXJyYXlMZW5ndGg/P2R0LHRoaXMubWF4TWFwTGVuZ3RoPWU/Lm1heE1hcExlbmd0aD8/ZHQsdGhpcy5tYXhFeHRMZW5ndGg9ZT8ubWF4RXh0TGVuZ3RoPz9kdCx0aGlzLmtleURlY29kZXI9ZT8ua2V5RGVjb2RlciE9PXZvaWQgMD9lLmtleURlY29kZXI6ZWMsdGhpcy5tYXBLZXlDb252ZXJ0ZXI9ZT8ubWFwS2V5Q29udmVydGVyPz9KYX1jbG9uZSgpe3JldHVybiBuZXcgYXIoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxyYXdTdHJpbmdzOnRoaXMucmF3U3RyaW5ncyxtYXhTdHJMZW5ndGg6dGhpcy5tYXhTdHJMZW5ndGgsbWF4QmluTGVuZ3RoOnRoaXMubWF4QmluTGVuZ3RoLG1heEFycmF5TGVuZ3RoOnRoaXMubWF4QXJyYXlMZW5ndGgsbWF4TWFwTGVuZ3RoOnRoaXMubWF4TWFwTGVuZ3RoLG1heEV4dExlbmd0aDp0aGlzLm1heEV4dExlbmd0aCxrZXlEZWNvZGVyOnRoaXMua2V5RGVjb2Rlcn0pfXJlaW5pdGlhbGl6ZVN0YXRlKCl7dGhpcy50b3RhbFBvcz0wLHRoaXMuaGVhZEJ5dGU9VHQsdGhpcy5zdGFjay5yZXNldCgpfXNldEJ1ZmZlcihlKXtsZXQgdD1DdChlKTt0aGlzLmJ5dGVzPXQsdGhpcy52aWV3PW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wfWFwcGVuZEJ1ZmZlcihlKXtpZih0aGlzLmhlYWRCeXRlPT09VHQmJiF0aGlzLmhhc1JlbWFpbmluZygxKSl0aGlzLnNldEJ1ZmZlcihlKTtlbHNle2xldCB0PXRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpLHI9Q3QoZSksbj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtyLmxlbmd0aCk7bi5zZXQodCksbi5zZXQocix0Lmxlbmd0aCksdGhpcy5zZXRCdWZmZXIobil9fWhhc1JlbWFpbmluZyhlKXtyZXR1cm4gdGhpcy52aWV3LmJ5dGVMZW5ndGgtdGhpcy5wb3M+PWV9Y3JlYXRlRXh0cmFCeXRlRXJyb3IoZSl7bGV0e3ZpZXc6dCxwb3M6cn09dGhpcztyZXR1cm4gUmFuZ2VFcnJvcihgRXh0cmEgJHt0LmJ5dGVMZW5ndGgtcn0gb2YgJHt0LmJ5dGVMZW5ndGh9IGJ5dGUocykgZm91bmQgYXQgYnVmZmVyWyR7ZX1dYCl9ZGVjb2RlKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZShlKTt0cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcihlKTtsZXQgdD10aGlzLmRvRGVjb2RlU3luYygpO2lmKHRoaXMuaGFzUmVtYWluaW5nKDEpKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX0qZGVjb2RlTXVsdGkoZSl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGkoZSk7cmV0dXJufXRyeXt0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuc2V0QnVmZmVyKGUpO3doaWxlKHRoaXMuaGFzUmVtYWluaW5nKDEpKXlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWFzeW5jIGRlY29kZUFzeW5jKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZUFzeW5jKGUpO3RyeXt0aGlzLmVudGVyZWQ9ITA7bGV0IHQ9ITEscjtmb3IgYXdhaXQobGV0IG8gb2YgZSl7aWYodCl0aHJvdyB0aGlzLmVudGVyZWQ9ITEsdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTt0aGlzLmFwcGVuZEJ1ZmZlcihvKTt0cnl7cj10aGlzLmRvRGVjb2RlU3luYygpLHQ9ITB9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgYX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc31pZih0KXtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpO3JldHVybiByfWxldHtoZWFkQnl0ZTpuLHBvczpzLHRvdGFsUG9zOml9PXRoaXM7dGhyb3cgUmFuZ2VFcnJvcihgSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAke29yKG4pfSBhdCAke2l9ICgke3N9IGluIHRoZSBjdXJyZW50IGJ1ZmZlcilgKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZGVjb2RlQXJyYXlTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCEwKX1kZWNvZGVTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCExKX1hc3luYypkZWNvZGVNdWx0aUFzeW5jKGUsdCl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGlBc3luYyhlLHQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwO2xldCByPXQsbj0tMTtmb3IgYXdhaXQobGV0IHMgb2YgZSl7aWYodCYmbj09PTApdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtpZih0aGlzLmFwcGVuZEJ1ZmZlcihzKSxyKW49dGhpcy5yZWFkQXJyYXlTaXplKCkscj0hMSx0aGlzLmNvbXBsZXRlKCk7dHJ5e3doaWxlKCEwKWlmKHlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCksLS1uPT09MClicmVha31jYXRjaChpKXtpZighKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyBpfXRoaXMudG90YWxQb3MrPXRoaXMucG9zfX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9EZWNvZGVTeW5jKCl7ZTp3aGlsZSghMCl7bGV0IGU9dGhpcy5yZWFkSGVhZEJ5dGUoKSx0O2lmKGU+PTIyNCl0PWUtMjU2O2Vsc2UgaWYoZTwxOTIpaWYoZTwxMjgpdD1lO2Vsc2UgaWYoZTwxNDQpe2xldCBuPWUtMTI4O2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPDE2MCl7bGV0IG49ZS0xNDQ7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2V7bGV0IG49ZS0xNjA7dD10aGlzLmRlY29kZVN0cmluZyhuLDApfWVsc2UgaWYoZT09PTE5Mil0PW51bGw7ZWxzZSBpZihlPT09MTk0KXQ9ITE7ZWxzZSBpZihlPT09MTk1KXQ9ITA7ZWxzZSBpZihlPT09MjAyKXQ9dGhpcy5yZWFkRjMyKCk7ZWxzZSBpZihlPT09MjAzKXQ9dGhpcy5yZWFkRjY0KCk7ZWxzZSBpZihlPT09MjA0KXQ9dGhpcy5yZWFkVTgoKTtlbHNlIGlmKGU9PT0yMDUpdD10aGlzLnJlYWRVMTYoKTtlbHNlIGlmKGU9PT0yMDYpdD10aGlzLnJlYWRVMzIoKTtlbHNlIGlmKGU9PT0yMDcpaWYodGhpcy51c2VCaWdJbnQ2NCl0PXRoaXMucmVhZFU2NEFzQmlnSW50KCk7ZWxzZSB0PXRoaXMucmVhZFU2NCgpO2Vsc2UgaWYoZT09PTIwOCl0PXRoaXMucmVhZEk4KCk7ZWxzZSBpZihlPT09MjA5KXQ9dGhpcy5yZWFkSTE2KCk7ZWxzZSBpZihlPT09MjEwKXQ9dGhpcy5yZWFkSTMyKCk7ZWxzZSBpZihlPT09MjExKWlmKHRoaXMudXNlQmlnSW50NjQpdD10aGlzLnJlYWRJNjRBc0JpZ0ludCgpO2Vsc2UgdD10aGlzLnJlYWRJNjQoKTtlbHNlIGlmKGU9PT0yMTcpe2xldCBuPXRoaXMubG9va1U4KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDEpfWVsc2UgaWYoZT09PTIxOCl7bGV0IG49dGhpcy5sb29rVTE2KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDIpfWVsc2UgaWYoZT09PTIxOSl7bGV0IG49dGhpcy5sb29rVTMyKCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDQpfWVsc2UgaWYoZT09PTIyMCl7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMSl7bGV0IG49dGhpcy5yZWFkVTMyKCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMil7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaE1hcFN0YXRlKG4pLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSBlfWVsc2UgdD17fX1lbHNlIGlmKGU9PT0yMjMpe2xldCBuPXRoaXMucmVhZFUzMigpO2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPT09MTk2KXtsZXQgbj10aGlzLmxvb2tVOCgpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwxKX1lbHNlIGlmKGU9PT0xOTcpe2xldCBuPXRoaXMubG9va1UxNigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwyKX1lbHNlIGlmKGU9PT0xOTgpe2xldCBuPXRoaXMubG9va1UzMigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiw0KX1lbHNlIGlmKGU9PT0yMTIpdD10aGlzLmRlY29kZUV4dGVuc2lvbigxLDApO2Vsc2UgaWYoZT09PTIxMyl0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsMCk7ZWxzZSBpZihlPT09MjE0KXQ9dGhpcy5kZWNvZGVFeHRlbnNpb24oNCwwKTtlbHNlIGlmKGU9PT0yMTUpdD10aGlzLmRlY29kZUV4dGVuc2lvbig4LDApO2Vsc2UgaWYoZT09PTIxNil0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LDApO2Vsc2UgaWYoZT09PTE5OSl7bGV0IG49dGhpcy5sb29rVTgoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMSl9ZWxzZSBpZihlPT09MjAwKXtsZXQgbj10aGlzLmxvb2tVMTYoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMil9ZWxzZSBpZihlPT09MjAxKXtsZXQgbj10aGlzLmxvb2tVMzIoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sNCl9ZWxzZSB0aHJvdyBuZXcgaGUoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7b3IoZSl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCByPXRoaXMuc3RhY2s7d2hpbGUoci5sZW5ndGg+MCl7bGV0IG49ci50b3AoKTtpZihuLnR5cGU9PT1ybilpZihuLmFycmF5W24ucG9zaXRpb25dPXQsbi5wb3NpdGlvbisrLG4ucG9zaXRpb249PT1uLnNpemUpdD1uLmFycmF5LHIucmVsZWFzZShuKTtlbHNlIGNvbnRpbnVlIGU7ZWxzZSBpZihuLnR5cGU9PT1NdCl7aWYodD09PSJfX3Byb3RvX18iKXRocm93IG5ldyBoZSgiVGhlIGtleSBfX3Byb3RvX18gaXMgbm90IGFsbG93ZWQiKTtuLmtleT10aGlzLm1hcEtleUNvbnZlcnRlcih0KSxuLnR5cGU9anM7Y29udGludWUgZX1lbHNlIGlmKG4ubWFwW24ua2V5XT10LG4ucmVhZENvdW50Kyssbi5yZWFkQ291bnQ9PT1uLnNpemUpdD1uLm1hcCxyLnJlbGVhc2Uobik7ZWxzZXtuLmtleT1udWxsLG4udHlwZT1NdDtjb250aW51ZSBlfX1yZXR1cm4gdH19cmVhZEhlYWRCeXRlKCl7aWYodGhpcy5oZWFkQnl0ZT09PVR0KXRoaXMuaGVhZEJ5dGU9dGhpcy5yZWFkVTgoKTtyZXR1cm4gdGhpcy5oZWFkQnl0ZX1jb21wbGV0ZSgpe3RoaXMuaGVhZEJ5dGU9VHR9cmVhZEFycmF5U2l6ZSgpe2xldCBlPXRoaXMucmVhZEhlYWRCeXRlKCk7c3dpdGNoKGUpe2Nhc2UgMjIwOnJldHVybiB0aGlzLnJlYWRVMTYoKTtjYXNlIDIyMTpyZXR1cm4gdGhpcy5yZWFkVTMyKCk7ZGVmYXVsdDppZihlPDE2MClyZXR1cm4gZS0xNDQ7ZWxzZSB0aHJvdyBuZXcgaGUoYFVucmVjb2duaXplZCBhcnJheSB0eXBlIGJ5dGU6ICR7b3IoZSl9YCl9fXB1c2hNYXBTdGF0ZShlKXtpZihlPnRoaXMubWF4TWFwTGVuZ3RoKXRocm93IG5ldyBoZShgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHtlfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKGUpfXB1c2hBcnJheVN0YXRlKGUpe2lmKGU+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgaGUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGFycmF5IGxlbmd0aCAoJHtlfSkgPiBtYXhBcnJheUxlbmd0aCAoJHt0aGlzLm1heEFycmF5TGVuZ3RofSlgKTt0aGlzLnN0YWNrLnB1c2hBcnJheVN0YXRlKGUpfWRlY29kZVN0cmluZyhlLHQpe2lmKCF0aGlzLnJhd1N0cmluZ3N8fHRoaXMuc3RhdGVJc01hcEtleSgpKXJldHVybiB0aGlzLmRlY29kZVV0ZjhTdHJpbmcoZSx0KTtyZXR1cm4gdGhpcy5kZWNvZGVCaW5hcnkoZSx0KX1kZWNvZGVVdGY4U3RyaW5nKGUsdCl7aWYoZT50aGlzLm1heFN0ckxlbmd0aCl0aHJvdyBuZXcgaGUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgke2V9KSA+IG1heFN0ckxlbmd0aCAoJHt0aGlzLm1heFN0ckxlbmd0aH0pYCk7aWYodGhpcy5ieXRlcy5ieXRlTGVuZ3RoPHRoaXMucG9zK3QrZSl0aHJvdyB6cztsZXQgcj10aGlzLnBvcyt0LG47aWYodGhpcy5zdGF0ZUlzTWFwS2V5KCkmJnRoaXMua2V5RGVjb2Rlcj8uY2FuQmVDYWNoZWQoZSkpbj10aGlzLmtleURlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMscixlKTtlbHNlIG49TnModGhpcy5ieXRlcyxyLGUpO3JldHVybiB0aGlzLnBvcys9dCtlLG59c3RhdGVJc01hcEtleSgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuc3RhY2sudG9wKCkudHlwZT09PU10O3JldHVybiExfWRlY29kZUJpbmFyeShlLHQpe2lmKGU+dGhpcy5tYXhCaW5MZW5ndGgpdGhyb3cgbmV3IGhlKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgke2V9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKGUrdCkpdGhyb3cgenM7bGV0IHI9dGhpcy5wb3MrdCxuPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixyK2UpO3JldHVybiB0aGlzLnBvcys9dCtlLG59ZGVjb2RlRXh0ZW5zaW9uKGUsdCl7aWYoZT50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgaGUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCR7ZX0pID4gbWF4RXh0TGVuZ3RoICgke3RoaXMubWF4RXh0TGVuZ3RofSlgKTtsZXQgcj10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyt0KSxuPXRoaXMuZGVjb2RlQmluYXJ5KGUsdCsxKTtyZXR1cm4gdGhpcy5leHRlbnNpb25Db2RlYy5kZWNvZGUobixyLHRoaXMuY29udGV4dCl9bG9va1U4KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyl9bG9va1UxNigpe3JldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKX1sb29rVTMyKCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpfXJlYWRVOCgpe2xldCBlPXRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkSTgoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkVTE2KCl7bGV0IGU9dGhpcy52aWV3LmdldFVpbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZEkxNigpe2xldCBlPXRoaXMudmlldy5nZXRJbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZFUzMigpe2xldCBlPXRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRJMzIoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRVNjQoKXtsZXQgZT1Gcyh0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjQoKXtsZXQgZT1zcih0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRVNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdVaW50NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdJbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEYzMigpe2xldCBlPXRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRjY0KCl7bGV0IGU9dGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfX1mdW5jdGlvbiBzbihlLHQpe3JldHVybiBuZXcgYXIodCkuZGVjb2RlKGUpfWNsYXNzIFJ0e2xpc3RlbmVycz1uZXcgTWFwO2FkZEV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYoIXIpcj1uZXcgU2V0LHRoaXMubGlzdGVuZXJzLnNldChlLHIpO3JldHVybiByLmFkZCh0KSwoKT0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2lmKHIuZGVsZXRlKHQpLHIuc2l6ZT09PTApdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2xldCBuPUFycmF5LmZyb20ocik7Zm9yKGxldCBzIG9mIG4pcyh0KX19ZW1pdEFsbChlKXtsZXQgdD1BcnJheS5mcm9tKHRoaXMubGlzdGVuZXJzLmtleXMoKSk7Zm9yKGxldCByIG9mIHQpdGhpcy5lbWl0KHIsZSl9fWNsYXNzIEple2dldHRlcjtzdGF0aWMgZXZlbnROYW1lPSJ1cGRhdGUiO2VtaXR0ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5nZXR0ZXI9ZTt0aGlzLmVtaXR0ZXI9bmV3IFJ0fWdldD0oKT0+dGhpcy5nZXR0ZXIoKTthc3luYyBlbWl0KCl7bGV0IGU9YXdhaXQgdGhpcy5nZXR0ZXIoKTtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5lbWl0dGVyLmVtaXQoSmUuZXZlbnROYW1lLGUpKX1saXN0ZW4oZSl7cmV0dXJuIHRoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKEplLmV2ZW50TmFtZSxlKSwoKT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKEplLmV2ZW50TmFtZSxlKX19fXNlKCk7QigpO00oKTthc3luYyBmdW5jdGlvbiBvbihlLHQpe2xldCByPW5ldyBGLG49ci53cml0ZURhdGUodCk7aWYobiE9PTApcmV0dXJuIGMobik7bGV0IHM9ci5yZXN1bHQoKSxbaSxvXT1hd2FpdCBlLnNpZ24ocyk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIGYoe3B1YktleTplLnB1YmxpY0tleSxzaWc6aSx0aW1lc3RhbXA6dH0pfWFzeW5jIGZ1bmN0aW9uIHFlKGUsdCxyKXtsZXQgbj1yLm5vdygpLmdldFRpbWUoKSxzPWUudGltZXN0YW1wLmdldFRpbWUoKTtpZihNYXRoLmFicyhuLXMpPktzKXJldHVybiA0O2xldCBvPW5ldyBGO28ud3JpdGVEYXRlKGUudGltZXN0YW1wKTtsZXQgYT1vLnJlc3VsdCgpLHU7dHJ5e3U9YXdhaXQgdC5pbXBvcnRWZXJpZnlLZXkoZS5wdWJLZXkpfWNhdGNoe3JldHVybiAyOX1pZighYXdhaXQgdC5jaGVja1NpZ0VkMjU1MTkoZS5zaWcsYSx1KSlyZXR1cm4gMztyZXR1cm4gMH1zZSgpO3NlKCk7QigpO3NlKCk7QigpO00oKTt2YXIgbWU9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmlkKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlRGF0ZSh0LnRzKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckJ5dGVzKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkRGF0ZSgpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHtpZDp0LHRzOm59KX19O2Z1bmN0aW9uIGNyKGUpe2xldCB0PW5ldyBGLHI9dC53cml0ZVN0cnVjdChtZSxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXQgbj10LnJlc3VsdCgpO3JldHVybiBmKG4pfU0oKTt2YXIgd2U9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJTdHJpbmcodC50eXA/PyIiKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5laWQpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJJbnQodC5vZmYpO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5jdHIpO2lmKGkhPT0wKXJldHVybiBpO2xldCBvPWUud3JpdGVWYXJJbnQodC5sZW4pO2lmKG8hPT0wKXJldHVybiBvO2lmKHQuaHNoKWUud3JpdGVCeXRlcyh0LmhzaCk7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBpPW5ldyBXKG4pLFssb109bWUuZGVjb2RlKGkpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldFthLHVdPWUucmVhZFZhckludCgpO2lmKHUhPT0wKXJldHVybiBjKHUpO2xldFtkLGxdPWUucmVhZFZhckludCgpO2lmKGwhPT0wKXJldHVybiBjKGwpO2xldFtwLGhdPWUucmVhZFZhckludCgpO2lmKGghPT0wKXJldHVybiBjKGgpO2xldCB5O2lmKHA+MCl7bGV0W20sZ109ZS5yZWFkQnl0ZXMocnIpO2lmKGchPT0wKXJldHVybiBjKGcpO3k9bX1yZXR1cm4gZih7dHlwOnQsZWlkOm4sb2ZmOmEsY3RyOmQsbGVuOnAsaHNoOnl9KX19O0IoKTtmZSgpO2NlKCk7TSgpO2Z1bmN0aW9uIFNyKGUsdCl7cmV0dXJuIHJ0KGUsdCl9ZnVuY3Rpb24gVmkoZSx0LHIpe2lmKGUucmxtLmJ5dGVMZW5ndGghPT1vZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCExKTtyZXR1cm4gci5jaGVja1NpZ0VkMjU1MTkoZS5zaWcsU3IoZS5ybG0sZS5oZWFkQ3BoKSx0KX1hc3luYyBmdW5jdGlvbiBPaShlLHQscixuLHM9eixpPXope2xldCBvO2lmKGUuYm9kJiZlLmxlbj4wKW89YXdhaXQgci5ibGFrZTMoZS5ib2QpO2xldCBhPW5ldyBGLHU9d2UuZW5jb2RlKGEsey4uLmUsaHNoOm99KTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXQgZD1hLnJlc3VsdCgpLFtsLHBdPWF3YWl0IHQua2RtRm9yKGQpO2lmKHAhPT0wKXJldHVybiBjKHApO2xldFtoLHldPWF3YWl0IG4uaG9zdFJsbShpLHMpO2lmKHkhPT0wKXJldHVybiBjKHkpO2xldCBtPW4uZGVyaXZlQ2lwaGVyKGwsImVuY3J5cHQiLGkpLFtnLFNdPWF3YWl0IG0uZW5jcnlwdChkKTtpZihTIT09MClyZXR1cm4gYyhTKTtsZXQgST1uZXcgVWludDhBcnJheSgwKTtpZihlLmJvZCl7bGV0W0UsRF09YXdhaXQgbS5lbmNyeXB0KGUuYm9kKTtpZihEIT09MClyZXR1cm4gYyhEKTtJPUV9bGV0W3csQV09YXdhaXQgdC5zaWduKFNyKGgsZykpO2lmKEEhPT0wKXJldHVybiBjKEEpO3JldHVybiBmKHtybG06aCxzaWc6dyxrZG06bCxoZWFkQ3BoOmcsYm9keUNwaDpJfSl9YXN5bmMgZnVuY3Rpb24gQm4oZSx0LHIsbixzKXtsZXQgaT1uZXcgVyhlKSxbbyxhXT13ZS5kZWNvZGUoaSk7aWYoYSE9PTApcmV0dXJuIGMoMTQpO2xldCB1O2lmKHQmJnQubGVuZ3RoPjApe2xldFtoLHldPWF3YWl0IHIuZGVjcnlwdCh0KTtpZih5IT09MClyZXR1cm4gYyh5KTt1PWh9bGV0IGQ9by5oc2gmJnU9PT12b2lkIDAsbD1vLmhzaD09PXZvaWQgMCYmdSE9PXZvaWQgMDtpZihkfHxsKXJldHVybiBjKDE5KTtpZihvLmhzaCYmdSl7bGV0IGg9YXdhaXQgbi5ibGFrZTModSk7aWYoIVkoaCxvLmhzaCkpcmV0dXJuIGMoMTkpfWxldCBwPXM/P2F3YWl0IG4uYmxha2UzKGUpO3JldHVybiBmKHttc2dIZWFkOm8sYm9kOnUsaGVhZEhhc2g6cH0pfWNsYXNzIFVue25vdygpe3JldHVybiBuZXcgRGF0ZX19ZnVuY3Rpb24gX2koZSx0LHIsbil7bGV0IHM9dC5nZXRUaW1lKCktZS5nZXRUaW1lKCksaT1yLmdldFRpbWUoKS1uLmdldFRpbWUoKTtyZXR1cm4ocytpKS8yfXNlKCk7QigpO00oKTtCKCk7TSgpO3ZhciBGdD17ZW5jb2RlKGUsdCl7aWYoZS53cml0ZVZhckludCh0LnF1b3RhKSx0LnF1b3RhPjApe2lmKHQudXNhZ2U9PT12b2lkIDApcmV0dXJuIDk7ZS53cml0ZVZhckludCh0LnVzYWdlKX1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuO2lmKHQ+MCl7bGV0W3MsaV09ZS5yZWFkVmFySW50KCk7aWYoaSE9PTApcmV0dXJuIGMoaSk7bj1zfXJldHVybiBmKHtxdW90YTp0LHVzYWdlOm59KX19O3ZhciB2bj17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKG5ldyBVaW50OEFycmF5KFt0LnN0YXR1c10pKTtsZXQgcj1lLndyaXRlRGF0ZSh0LnRpbWVSY3ZkKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlRGF0ZSh0LnRpbWVTZW50KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQuc3Vic2NyaXB0aW9uLnRlcm0pO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24uZWxhcHNlZCk7aWYoaSE9PTApcmV0dXJuIGk7bGV0IG89ZS53cml0ZVN0cnVjdChGdCx0LnN1YnNjcmlwdGlvbi5zdGF0KTtpZihvIT09MClyZXR1cm4gbztsZXQgYT1lLndyaXRlU3RydWN0KEZ0LHQuc3Vic2NyaXB0aW9uLmR5bik7aWYoYSE9PTApcmV0dXJuIGE7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcygxKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXQgbj10WzBdLFtzLGldPWUucmVhZERhdGUoKTtpZihpIT09MClyZXR1cm4gYyhpKTtsZXRbbyxhXT1lLnJlYWREYXRlKCk7aWYoYSE9PTApcmV0dXJuIGMoYSk7bGV0W3UsZF09ZS5yZWFkVmFySW50KCk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0W2wscF09ZS5yZWFkVmFySW50KCk7aWYocCE9PTApcmV0dXJuIGMocCk7bGV0W2gseV09ZS5yZWFkU3RydWN0KEZ0KTtpZih5IT09MClyZXR1cm4gYyh5KTtsZXRbbSxnXT1lLnJlYWRTdHJ1Y3QoRnQpO2lmKGchPT0wKXJldHVybiBjKGcpO3JldHVybiBmKHtzdGF0dXM6bix0aW1lUmN2ZDpzLHRpbWVTZW50Om8sc3Vic2NyaXB0aW9uOnt0ZXJtOnUsZWxhcHNlZDpsLHN0YXQ6aCxkeW46bX19KX19O0IoKTtmZSgpO3NlKCk7QigpO0IoKTtCKCk7TSgpO3ZhciBDbj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LnNlcSk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZFZhckludCgpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHtoZWFkQ3BoOnQsc2VxOm59KX19O0IoKTtNKCk7dmFyIGdlPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5wdWJLZXkpLGUud3JpdGVCeXRlcyh0LnNpZyk7bGV0IHI9ZS53cml0ZURhdGUodC50aW1lc3RhbXApO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoSHMpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKFJlKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWREYXRlKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIGYoe3B1YktleTp0LHNpZzpuLHRpbWVzdGFtcDppfSl9fTtmZSgpO00oKTt2YXIgTmk9e2VuY29kZShlLHQpe2lmKHQucmxtLmJ5dGVMZW5ndGghPT1vZSlyZXR1cm4gMTA7cmV0dXJuIGUud3JpdGVCeXRlcyh0LnJsbSksZS53cml0ZVZhckludCh0LnNlcSl9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhvZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109V2UodCk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFySW50KCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIGYoe3JsbTpuLHNlcTppfSl9fSxxaT17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdChnZSxyKTtpZihpIT09MClyZXR1cm4gaTtyZXR1cm4gcy53cml0ZVN0cnVjdChOaSxuKX0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGdlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgdT1hd2FpdCBxZShvLHMsbik7aWYodSE9PTApcmV0dXJuIHU7bGV0e3B1YktleTpkfT1vLFtsLHBdPWF3YWl0IGkuaGFzVXNlcihkKTtpZihwIT09MClyZXR1cm4gcDtpZighbClyZXR1cm4gNTtsZXRbaCx5XT10LnJlYWRTdHJ1Y3QoTmkpO2lmKHkhPT0wKXJldHVybiB5O2lmKCF0LmRvbmUoKSlyZXR1cm4gODtsZXRbbSxnXT1hd2FpdCBpLmxpc3RIZWFkcyhkLGgucmxtLGguc2VxKTtpZihnIT09MClyZXR1cm4gZztyZXR1cm4gci53cml0ZVN0cnVjdHMoQ24sbSl9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoQ24pfX07QigpO00oKTt2YXIgVG49e2VuY29kZShlLHQpe2Uud3JpdGVWYXJJbnQodC5zZXEpO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlDcGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gYyhzKTtyZXR1cm4gZih7c2VxOnQsYm9keUNwaDpufSl9fTtCKCk7ZmUoKTtNKCk7dmFyIEZpPXtlbmNvZGUoZSx0KXtpZih0LnJsbS5ieXRlTGVuZ3RoIT09b2UpcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LnJsbSk7Zm9yKGxldCByIG9mIHQuc2Vxcyl7bGV0IG49ZS53cml0ZVZhckludChyKTtpZihuIT09MClyZXR1cm4gbn1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKG9lKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1XZSh0KTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXQgaT1bXTt3aGlsZSghZS5kb25lKCkpe2xldFtvLGFdPWUucmVhZFZhckludCgpO2lmKGEhPT0wKXJldHVybiBjKGEpO2kucHVzaChvKX1yZXR1cm4gZih7cmxtOm4sc2VxczppfSl9fSxXaT17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdChnZSxyKTtpZihpIT09MClyZXR1cm4gaTtyZXR1cm4gcy53cml0ZVN0cnVjdChGaSxuKX0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGdlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgdT1hd2FpdCBxZShvLHMsbik7aWYodSE9PTApcmV0dXJuIHU7bGV0e3B1YktleTpkfT1vLFtsLHBdPWF3YWl0IGkuaGFzVXNlcihkKTtpZihwIT09MClyZXR1cm4gcDtpZighbClyZXR1cm4gNTtsZXRbaCx5XT10LnJlYWRTdHJ1Y3QoRmkpO2lmKHkhPT0wKXJldHVybiB5O2NvbnNvbGUuaW5mbyhgUFVMTDogJHtoLnNlcXMubGVuZ3RofSBiYWdzYCk7bGV0W20sZ109YXdhaXQgaS5nZXRCb2RpZXMoZCxoLnJsbSxoLnNlcXMpO2lmKGchPT0wKXJldHVybiBnO2lmKCFtKXJldHVybiAxNztmb3IobGV0e3NlcTpTLGJvZHlDcGg6SX1vZiBtKXtsZXQgdz17c2VxOlMsYm9keUNwaDpJfSxBPXIud3JpdGVTdHJ1Y3QoVG4sdyk7aWYoQSE9PTApcmV0dXJuIEF9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoVG4pfX07c2UoKTtCKCk7ZmUoKTtNKCk7dmFyIE1uPXtlbmNvZGUoZSx0KXtpZih0LnJsbS5ieXRlTGVuZ3RoIT09b2UpcmV0dXJuIDEwO2lmKHQuc2lnLmJ5dGVMZW5ndGghPT1SZSlyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQuc2lnKSxlLndyaXRlQnl0ZXModC5ybG0pLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuYm9keUNwaCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhSZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMob2UpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPVdlKG4pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldFthLHVdPWUucmVhZEJ5dGVzKE5lKTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXRbZCxsXT1lLnJlYWRWYXJCeXRlcygpO2lmKGwhPT0wKXJldHVybiBjKGwpO2xldFtwLGhdPWUucmVhZFZhckJ5dGVzKCk7aWYoaCE9PTApcmV0dXJuIGMoaCk7cmV0dXJuIGYoe3JsbTppLHNpZzp0LGtkbTphLGhlYWRDcGg6ZCxib2R5Q3BoOnB9KX19O0IoKTtmZSgpO00oKTt2YXIgYnI9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5zZXEpO2lmKHIhPT0wKXJldHVybiByO2lmKHQucmxtLmJ5dGVMZW5ndGghPT1vZSlyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQucmxtKTtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz10LmJvZHlDcGg/dC5ib2R5Q3BoLmxlbmd0aDowLGk9ZS53cml0ZVZhckludChzKTtpZihpIT09MClyZXR1cm4gaTtpZihzPjApe2lmKCF0LmJvZHlDcGgpcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LmJvZHlDcGgpfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMob2UpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPVdlKG4pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldFthLHVdPWUucmVhZFZhckJ5dGVzKCk7aWYodSE9PTApcmV0dXJuIGModSk7bGV0W2QsbF09ZS5yZWFkVmFySW50KCk7aWYobCE9PTApcmV0dXJuIGMobCk7bGV0IHA7aWYoZD4wKXtsZXRbaCx5XT1lLnJlYWRCeXRlcyhkKTtpZih5IT09MClyZXR1cm4gYyh5KTtwPWh9cmV0dXJuIGYoe3NlcTp0LHJsbTppLGhlYWRDcGg6YSxib2R5Q3BoOnB9KX19O0IoKTtNKCk7dmFyIElyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5zaWcpLGUud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhSZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoTmUpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIGYoe3NpZzp0LGtkbTpuLGhlYWRDcGg6aX0pfX07QigpO00oKTt2YXIgV3Q9e2VuY29kZShlLHQpe2lmKGUud3JpdGVWYXJJbnQodC5pZHgpLGUud3JpdGVCeXRlcyhuZXcgVWludDhBcnJheShbdC5zdGF0dXNdKSksdC5zdGF0dXM9PT0wKWUud3JpdGVWYXJJbnQodC5zZXEpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoMSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0IGk9blswXTtpZihpIT09MClyZXR1cm4gZih7aWR4OnQsc3RhdHVzOml9KTtsZXRbbyxhXT1lLnJlYWRWYXJJbnQoKTtpZihhIT09MClyZXR1cm4gYyhhKTtyZXR1cm4gZih7aWR4OnQsc3RhdHVzOmksc2VxOm99KX19O0IoKTt2YXIgemk9e2VuY29kZShlLHQpe3JldHVybiBlLndyaXRlU3RydWN0cyhNbix0KX0sZGVjb2RlKGUpe3JldHVybiBlLnJlYWRTdHJ1Y3RzKE1uKX19LGppPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgaT1zLndyaXRlU3RydWN0KGdlLHIpO2lmKGkhPT0wKXJldHVybiBpO3JldHVybiBzLndyaXRlU3RydWN0KHppLG4pfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6aSxub3RpZmllcjpvfT1lLFthLHVdPXQucmVhZFN0cnVjdChnZSk7aWYodSE9PTApcmV0dXJuIHU7bGV0IGQ9YXdhaXQgcWUoYSxzLG4pO2lmKGQhPT0wKXJldHVybiBkO2xldHtwdWJLZXk6bH09YSxbcCxoXT1hd2FpdCBpLmhhc1VzZXIobCk7aWYoaCE9PTApcmV0dXJuIGg7aWYoIXApcmV0dXJuIDU7bGV0W3ksbV09dC5yZWFkU3RydWN0KHppKTtpZihtIT09MClyZXR1cm4gbTtjb25zb2xlLmluZm8oYFBVU0g6ICR7eS5sZW5ndGh9IGJhZ3NgKTtsZXQgZzt0cnl7Zz1hd2FpdCBzLmltcG9ydFZlcmlmeUtleShsKX1jYXRjaHtyZXR1cm4gMjl9bGV0IFM9W10sST1bXTtmb3IobGV0IEQ9MDtEPHkubGVuZ3RoO0QrKyl7bGV0IFQ9eVtEXTtpZighYXdhaXQgVmkoVCxnLHMpKXtsZXQgeD17aWR4OkQsc3RhdHVzOjN9LEM9ci53cml0ZVN0cnVjdChXdCx4KTtpZihDIT09MClyZXR1cm4gQztjb250aW51ZX1TLnB1c2goRCksSS5wdXNoKFQpfWxldFt3LEFdPWF3YWl0IGkuc2V0QmFncyhsLEkpO2lmKEEhPT0wKXJldHVybiBBO2lmKCF3fHx3Lmxlbmd0aCE9PUkubGVuZ3RoKXJldHVybiAxNztsZXQgRT1bXTtmb3IobGV0IEQ9MDtEPEkubGVuZ3RoO0QrKyl7bGV0IFQ9SVtEXSxMPVNbRF0seD13W0RdO2lmKHguc3RhdHVzIT09MCl7bGV0IE89e2lkeDpMLHN0YXR1czp4LnN0YXR1c30sTj1yLndyaXRlU3RydWN0KFd0LE8pO2lmKE4hPT0wKXJldHVybiBOO2NvbnRpbnVlfWxldCBDPXguc2VxLFI9bmV3IEYsdj1SLndyaXRlU3RydWN0KElyLFQpO2lmKHYhPT0wKXJldHVybiB2O2xldCBWPVIucmVzdWx0KCksYj17c2VxOkMscmxtOlQucmxtLGhlYWRDcGg6Vn07aWYoeS5sZW5ndGg9PT0xJiZULmJvZHlDcGgubGVuZ3RoPD1McyliLmJvZHlDcGg9VC5ib2R5Q3BoO0UucHVzaChiKTtsZXQgSD17aWR4Okwsc3RhdHVzOjAsc2VxOkN9LF89ci53cml0ZVN0cnVjdChXdCxIKTtpZihfIT09MClyZXR1cm4gX31pZihFLmxlbmd0aD4wKXtsZXQgRD1uZXcgRixUPUQud3JpdGVTdHJ1Y3RzKGJyLEUpO2lmKFQhPT0wKXJldHVybiBUO2xldCBMPUQucmVzdWx0KCk7YXdhaXQgUHJvbWlzZS5yZXNvbHZlKG8ucHVzaChsLEwpKX1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhXdCl9fTtCKCk7TSgpO3ZhciBYaT17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7cmV0dXJuIHMud3JpdGVTdHJ1Y3QoZ2Uscil9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTppfT1lLFtvLGFdPXQucmVhZFN0cnVjdChnZSk7aWYoYSE9PTApcmV0dXJuIGE7bGV0IHU9YXdhaXQgcWUobyxzLG4pO2lmKHUhPT0wKXJldHVybiB1O2xldHtwdWJLZXk6ZH09bztpZighdC5kb25lKCkpcmV0dXJuIDg7bGV0W2wscF09YXdhaXQgaS5hZGRVc2VyKGQpO2lmKHAhPT0wKXJldHVybiBwO3JldHVybiAwfSxkZWNvZGVSZXNwKGUpe3JldHVybiBmKHZvaWQgMCl9fTtjZSgpO3NlKCk7QigpO2NsYXNzIFJue3VybDt3ZWJzb2NrZXQ7Y29uc3RydWN0b3IoZSl7dGhpcy51cmw9ZX1jb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy53ZWJzb2NrZXQhPT12b2lkIDAmJnRoaXMud2Vic29ja2V0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTn1hc3luYyBjb25uZWN0KGUsdCxyPSgpPT57fSxuPSgpPT57fSl7bGV0e3VybDpzfT10aGlzO2lmKHRoaXMud2Vic29ja2V0KXRoaXMud2Vic29ja2V0LmNsb3NlKCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwO2xldCBpPW5ldyBGO2kud3JpdGVTdHJ1Y3QoZ2UsZSk7bGV0IG89aS5yZXN1bHQoKSxhPXR0KG8pO3JldHVybiBzLnNlYXJjaFBhcmFtcy5zZXQoInQiLGEpLHRoaXMud2Vic29ja2V0PW5ldyBXZWJTb2NrZXQocyksdGhpcy53ZWJzb2NrZXQuYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLHRoaXMud2Vic29ja2V0Lm9ub3Blbj0oKT0+e2NvbnNvbGUubG9nKCJDT05ORUNURUQiKSxuKCl9LHRoaXMud2Vic29ja2V0Lm9uY2xvc2U9KCk9Pntjb25zb2xlLmxvZygiRElTQ09OTkVDVEVEIiksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sdGhpcy53ZWJzb2NrZXQub25tZXNzYWdlPSh1KT0+e2xldCBkPW5ldyBVaW50OEFycmF5KHUuZGF0YSk7dChkKX0sdGhpcy53ZWJzb2NrZXQub25lcnJvcj0odSk9Pntjb25zb2xlLmxvZyhgRVJST1I6ICR7SlNPTi5zdHJpbmdpZnkodSl9YCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwLHIoKX0sUHJvbWlzZS5yZXNvbHZlKDApfWRpc2Nvbm5lY3QoKXt0aGlzLndlYnNvY2tldD8uY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDB9fU0oKTt2YXIgbGU9e3VzZXI6e3BhdGg6Ii91c2VyIixlbmRwb2ludDpYaSxuYW1lOjB9LHB1c2g6e3BhdGg6Ii9wdXNoIixlbmRwb2ludDpqaSxuYW1lOjJ9LHBlZWs6e3BhdGg6Ii9wZWVrIixlbmRwb2ludDpxaSxuYW1lOjF9LHB1bGw6e3BhdGg6Ii9wdWxsIixlbmRwb2ludDpXaSxuYW1lOjN9fSxNYz17MDpsZS51c2VyLDI6bGUucHVzaCwxOmxlLnBlZWssMzpsZS5wdWxsfSxoaD17W2xlLnVzZXIucGF0aF06bGUudXNlcixbbGUucHVzaC5wYXRoXTpsZS5wdXNoLFtsZS5wZWVrLnBhdGhdOmxlLnBlZWssW2xlLnB1bGwucGF0aF06bGUucHVsbH07Y2xhc3MgJGl7dXJsO2xpc3RlbmVyO2NvbnN0cnVjdG9yKGUpe3RoaXMudXJsPWU7dGhpcy5saXN0ZW5lcj1uZXcgUm4oZSl9YXN5bmMgY2FsbChlLHQpe2xldHtwYXRoOnJ9PU1jW2VdLG49bmV3IFVSTChyLHRoaXMudXJsKTt0cnl7cmV0dXJuIGF3YWl0IFJjKG4sdCl9Y2F0Y2h7cmV0dXJuIGMoMjUpfX19dmFyIEdpPShlKT0+bmV3ICRpKGUuaGFuZGxlKTthc3luYyBmdW5jdGlvbiBSYyhlLHQpe2xldCByPWF3YWl0IGZldGNoKGUse21ldGhvZDoiUE9TVCIsYm9keTp0LnJlc3VsdCgpLnNsaWNlKCl9KTtpZighci5vaylyZXR1cm4gYygyNCk7bGV0IG49YXdhaXQgVy5mcm9tUmVzcG9uc2Uocik7cmV0dXJuIGYobil9TSgpO2NsYXNzIHdye2VuY2xhdmU7Y3J5cHRvO2hvc3Q7Y2xvY2s7dHJhbnNwb3J0O3VwZGF0ZUhvc3RNZXRhO2NvbnN0cnVjdG9yKGUsdCxyLG4scyxpKXt0aGlzLmVuY2xhdmU9ZTt0aGlzLmNyeXB0bz10O3RoaXMuaG9zdD1yO3RoaXMuY2xvY2s9bjt0aGlzLnRyYW5zcG9ydD1zO3RoaXMudXBkYXRlSG9zdE1ldGE9aX1hc3luYyBjYWxsKGUsdCl7bGV0e2Nsb2NrOnIsdHJhbnNwb3J0Om59PXRoaXMse2VuZHBvaW50OnMsbmFtZTppfT1lLFtvLGFdPWF3YWl0IHRoaXMuaWRlbnRpdHkoKTtpZihhIT09MClyZXR1cm4gYyhhKTtsZXQgdT1yLm5vdygpLFtkLGxdPWF3YWl0IG9uKG8sdSk7aWYobCE9PTApcmV0dXJuIGMobCk7bGV0IHA9bmV3IEYsaD1hd2FpdCBzLmVuY29kZVJlcSh0aGlzLG8sZCx0LHApO2lmKGghPT0wKXJldHVybiBjKGgpO2xldCB5PXIubm93KCksW20sZ109YXdhaXQgbi5jYWxsKGkscCksUz1yLm5vdygpO2lmKGchPT0wKXJldHVybiBjKGcpO2xldFtJLHddPW0ucmVhZFN0cnVjdCh2bik7aWYodyE9PTApcmV0dXJuIGModyk7aWYoSS5zdGF0dXMhPT0wKXJldHVybiBjKEkuc3RhdHVzKTtsZXQgRT17Y2xvY2tPZmZzZXQ6X2koeSxJLnRpbWVSY3ZkLEkudGltZVNlbnQsUyksc3Vic2NyaXB0aW9uOkkuc3Vic2NyaXB0aW9ufSxEPWF3YWl0IHRoaXMudXBkYXRlSG9zdE1ldGEoRSk7aWYoRCE9PTApcmV0dXJuIGMoRCk7cmV0dXJuIHMuZGVjb2RlUmVzcChtKX0jZSgpe3JldHVybntsYWJlbDp0aGlzLmhvc3QubGFiZWwsaW5kZXg6dGhpcy5ob3N0LmlkeD8/MH19aWRlbnRpdHk9KCk9PnRoaXMuZW5jbGF2ZS5kZXJpdmVJZGVudGl0eSh0aGlzLiNlKCkpO2hvc3RSbG09KGU9eik9PnRoaXMuZW5jbGF2ZS5ob3N0UmxtKGUsdGhpcy4jZSgpKTtzZWFsPWFzeW5jKGUsdD16KT0+e2xldHtjcnlwdG86cixlbmNsYXZlOm59PXRoaXMsW3MsaV09YXdhaXQgdGhpcy5pZGVudGl0eSgpO2lmKGkhPT0wKXJldHVybiBjKGkpO3JldHVybiBPaShlLHMscixuLHRoaXMuI2UoKSx0KX07cmVnaXN0ZXI9KCk9PnRoaXMuY2FsbChsZS51c2VyLHZvaWQgMCk7cGVlaz1hc3luYyhlLHQ9eik9PntsZXRbcixuXT1hd2FpdCB0aGlzLmhvc3RSbG0odCk7aWYobiE9PTApcmV0dXJuIGMobik7cmV0dXJuIHRoaXMuY2FsbChsZS5wZWVrLHtybG06cixzZXE6ZX0pfTtwdXNoPShlKT0+dGhpcy5jYWxsKGxlLnB1c2gsZSk7cHVsbD1hc3luYyhlLHQ9eik9PntsZXRbcixuXT1hd2FpdCB0aGlzLmhvc3RSbG0odCk7aWYobiE9PTApcmV0dXJuIGMobik7cmV0dXJuIHRoaXMuY2FsbChsZS5wdWxsLHtybG06cixzZXFzOmV9KX07bGlzdGVuPWFzeW5jKGUsdCxyKT0+e2xldHtjbG9jazpuLHRyYW5zcG9ydDpzfT10aGlzLHtsaXN0ZW5lcjppfT1zLFtvLGFdPWF3YWl0IHRoaXMuaWRlbnRpdHkoKTtpZihhIT09MClyZXR1cm4gYTtsZXQgdT1uLm5vdygpLFtkLGxdPWF3YWl0IG9uKG8sdSk7aWYobCE9PTApcmV0dXJuIGw7cmV0dXJuIGF3YWl0IGkuY29ubmVjdChkLGUsdCxyKX07aXNDb25uZWN0ZWQoKXtsZXQgZT10aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI7aWYoZSYmdHlwZW9mIGUuY29ubmVjdGVkPT09ImZ1bmN0aW9uIilyZXR1cm4gZS5jb25uZWN0ZWQoKTtyZXR1cm4hMH1jbG9zZUxpc3RlbmVyKCl7dGhpcy50cmFuc3BvcnQ/Lmxpc3RlbmVyPy5kaXNjb25uZWN0KCl9fXNlKCk7QigpO2ZlKCk7dmFyIHZoPVN5bWJvbCgiRG93bmxvYWRLZXkiKTtmdW5jdGlvbiB4cihlKXtpZihlPT09dm9pZCAwKXJldHVybiEwO3JldHVybiBlLmxhYmVsPT09ei5sYWJlbCYmZS5pbmRleD09PXouaW5kZXh9ZnVuY3Rpb24gUWkoZSx0KXtyZXR1cm4gZS5sYWJlbD09PXQubGFiZWwmJmUuaW5kZXg9PT10LmluZGV4fWZ1bmN0aW9uIG10KGUpe3JldHVybmAke2UubGFiZWx9XHgwMCR7ZS5pbmRleH1gfWZ1bmN0aW9uIHp0KGUsdD16KXtpZih4cih0KSlyZXR1cm4gZS5sYXN0U2VxO3JldHVybiBlLnNlcXM/LmZpbmQoKG4pPT5uLmxhYmVsPT09dC5sYWJlbCYmbi5pbmRleD09PXQuaW5kZXgpPy5sYXN0U2VxPz8wfWZ1bmN0aW9uIGd0KGUpe2xldCB0PVt6XSxyPW5ldyBTZXQoW210KHopXSksbj0ocyxpKT0+e2xldCBvPXM9PT0iIiYmaT09PTA/ejp7bGFiZWw6cyxpbmRleDppfSxhPW10KG8pO2lmKHIuaGFzKGEpKXJldHVybjtyLmFkZChhKSx0LnB1c2gobyl9O2ZvcihsZXQgcyBvZiBlKXtpZihuKHMubGFiZWwscy5pbmRleCkscy5wcmlvcj09PXZvaWQgMCljb250aW51ZTtmb3IobGV0IGkgb2Ygcy5wcmlvciluKHMubGFiZWwsaSl9cmV0dXJuIHR9ZnVuY3Rpb24gWWkoZSx0KXtpZihlPT09dm9pZCAwfHxlPT09IiIpcmV0dXJuIHo7Zm9yKGxldCByIG9mIHQpaWYoci5sYWJlbD09PWUpcmV0dXJue2xhYmVsOnIubGFiZWwsaW5kZXg6ci5pbmRleH07cmV0dXJue2xhYmVsOmUsaW5kZXg6MH19ZnVuY3Rpb24gRXIoZSl7aWYoeHIoZSkpcmV0dXJuO3JldHVybiBlfWZ1bmN0aW9uIEhuKGUsdCxyKXtsZXQgbj1yPz96O3JldHVybiB4cihuKT9gJHtlfToke3R9YDpgJHtlfToke24ubGFiZWx9OiR7bi5pbmRleH06JHt0fWB9ZnVuY3Rpb24gSmkoZSx0KXtpZih0LnNldExhc3RTZXEhPT12b2lkIDApcmV0dXJuIHQuc2V0TGFzdFNlcTtpZih0Lmxhc3RTZXEhPT12b2lkIDAmJnQubGFzdFNlcT5lKXJldHVybiB0Lmxhc3RTZXE7cmV0dXJufWZ1bmN0aW9uIFppKGUpe2xldCB0PTAscj1bXTtmb3IobGV0IG4gb2YgZSlpZih4cihuKSl0PW4ubGFzdFNlcTtlbHNlIHIucHVzaChuKTtpZihyLmxlbmd0aD09PTApcmV0dXJue2xhc3RTZXE6dH07cmV0dXJue2xhc3RTZXE6dCxzZXFzOnJ9fUIoKTtNKCk7ZnVuY3Rpb24gemUoZSl7aWYoZT09PXZvaWQgMClyZXR1cm4gZigiIik7aWYodHlwZW9mIGUhPT0ic3RyaW5nIilyZXR1cm4gYygxMCk7cmV0dXJuIGYoZS50cmltKCkpfWZ1bmN0aW9uIGVvKGUsdCxyKXtsZXRbbixzXT16ZSh0KTtpZihzIT09MHx8bj09PXZvaWQgMClyZXR1cm4gYygxMCk7aWYociYmZSE9PXZvaWQgMCYmZSE9PW4pcmV0dXJuIGMoMTApO3JldHVybiBmKG4pfWNlKCk7c2UoKTtCKCk7TSgpO0IoKTtNKCk7dmFyIEtuPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGJsKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuaWR4KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQubnVtKTtpZihzIT09MClyZXR1cm4gcztyZXR1cm4gZS53cml0ZUJ5dGVzKHQuaHNoKSxlLndyaXRlQnl0ZXModC5zaWcpLDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXRbYSx1XT1lLnJlYWRCeXRlcyhycik7aWYodSE9PTApcmV0dXJuIGModSk7bGV0W2QsbF09ZS5yZWFkQnl0ZXMoUmUpO2lmKGwhPT0wKXJldHVybiBjKGwpO3JldHVybiBmKHtsYmw6dCxpZHg6bixudW06aSxoc2g6YSxzaWc6ZH0pfX07dmFyIEFyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlU3RydWN0KEtuLHQuaGVhZCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuaW5kZXhFbmMpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlFbmMpO2lmKHMhPT0wKXJldHVybiBzO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KEtuKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIGYoe2hlYWQ6dCxpbmRleEVuYzpuLGJvZHlFbmM6aX0pfX07QigpO00oKTt2YXIgTG49e2VuY29kZShlLHQpe2Uud3JpdGVCeXRlcyh0LmtkbSk7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LmxlbkJvZHkpO2lmKG4hPT0wKXJldHVybiBuO2lmKHQubGVuQm9keT4wJiZ0Lm9mZkJvZHkhPT12b2lkIDApe2xldCBzPWUud3JpdGVWYXJJbnQodC5vZmZCb2R5KTtpZihzIT09MClyZXR1cm4gc31yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKE5lKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhO2lmKGk+MCl7bGV0W3UsZF09ZS5yZWFkVmFySW50KCk7aWYoZCE9PTApcmV0dXJuIGMoZCk7YT11fXJldHVybiBmKHtrZG06dCxoZWFkQ3BoOm4sbGVuQm9keTppLG9mZkJvZHk6YX0pfX07QigpO00oKTt2YXIgUHI7KCh0byk9Pnt0by5kZWZhdWx0RmlsZUV4dGVuc2lvbj0iZHBsIjthc3luYyBmdW5jdGlvbiB0KHMsaSxvLGEsdSl7bGV0W2QsbF09YXdhaXQgdS5kZXJpdmVJZGVudGl0eSh7bGFiZWw6cyxpbmRleDppfSk7aWYobCE9PTApcmV0dXJuIGMobCk7bGV0IHA9bmV3IEYsaD1uZXcgRix5PTAsbT0wO2ZvcihsZXQgTCBvZiBvKXtsZXQgeD1uZXcgRixDPXgud3JpdGVTdHJ1Y3Qod2UsTC5oZWFkKTtpZihDIT09MClyZXR1cm4gYyhDKTtsZXQgUj14LnJlc3VsdCgpLFt2LFZdPWF3YWl0IGQua2RtRm9yKFIpO2lmKFYhPT0wKXJldHVybiBjKFYpO2xldCBiPXUuZGVyaXZlQ2lwaGVyKHYsImVuY3J5cHQiKSxbSCxfXT1hd2FpdCBiLmVuY3J5cHQoUik7aWYoXyE9PTApcmV0dXJuIGMoXyk7bGV0IE89bmV3IFVpbnQ4QXJyYXkoMCk7aWYoTC5ib2R5KXtsZXRbaix0ZV09YXdhaXQgYi5lbmNyeXB0KEwuYm9keSk7aWYodGUhPT0wKXJldHVybiBjKHRlKTtPPWp9bGV0IE49TC5oZWFkLmxlbj4wJiZMLmhlYWQuaHNoIT09dm9pZCAwP08ubGVuZ3RoOjAsVT17a2RtOnYsaGVhZENwaDpILGxlbkJvZHk6TixvZmZCb2R5Ok4+MD9tOnZvaWQgMH0sZWU9cC53cml0ZVN0cnVjdChMbixVKTtpZihlZSE9PTApcmV0dXJuIGMoZWUpO2lmKEwuYm9keSloLndyaXRlQnl0ZXMoTyksbSs9Ty5sZW5ndGg7eSsrfWxldCBnPWgucmVzdWx0KCksUz1wLnJlc3VsdCgpLEk9YXdhaXQgYS5ibGFrZTMoUyksW3csQV09YXdhaXQgZC5zaWduKEkpO2lmKEEhPT0wKXJldHVybiBjKEEpO2xldCBFPXtsYmw6cyxpZHg6aSxudW06eSxoc2g6SSxzaWc6d30sRD1uZXcgRjtELndyaXRlU3RydWN0KEFyLHtoZWFkOkUsaW5kZXhFbmM6Uyxib2R5RW5jOmd9KTtsZXQgVD1ELnJlc3VsdCgpO3JldHVybiBmKFQpfXRvLmVuY29kZUZpbGU9dDthc3luYyBmdW5jdGlvbiByKHMsaSxvKXtsZXRbYSx1XT1Bci5kZWNvZGUobmV3IFcocykpO2lmKHUhPT0wKXJldHVybiBjKHUpO2xldHtoZWFkOmQsaW5kZXhFbmM6bCxib2R5RW5jOnB9PWEsW2gseV09YXdhaXQgby5kZXJpdmVJZGVudGl0eSh7bGFiZWw6ZC5sYmwsaW5kZXg6ZC5pZHh9KTtpZih5IT09MClyZXR1cm4gYyh5KTtsZXQgbTt0cnl7bT1hd2FpdCBpLmltcG9ydFZlcmlmeUtleShoLnB1YmxpY0tleSl9Y2F0Y2h7cmV0dXJuIGMoMjkpfWlmKCFhd2FpdCBpLmNoZWNrU2lnRWQyNTUxOShkLnNpZyxkLmhzaCxtKSlyZXR1cm4gYygzKTtsZXQgUz1hd2FpdCBpLmJsYWtlMyhsKTtpZighWShTLGQuaHNoKSlyZXR1cm4gYygxOSk7bGV0IEk9bmV3IFcobCksdz1bXTtmb3IobGV0IEU9MDtFPGQubnVtO0UrKyl7bGV0W0QsVF09SS5yZWFkU3RydWN0KExuKTtpZihUIT09MClyZXR1cm4gYyhUKTt3LnB1c2goRCl9aWYody5sZW5ndGghPT1kLm51bSlyZXR1cm4gYygxNCk7bGV0IEE9W107Zm9yKGxldCBFIG9mIHcpe2xldCBEPW8uZGVyaXZlQ2lwaGVyKEUua2RtLCJkZWNyeXB0IiksW1QsTF09YXdhaXQgRC5kZWNyeXB0KEUuaGVhZENwaCk7aWYoTCE9PTApcmV0dXJuIGMoTCk7bGV0W3gsQ109d2UuZGVjb2RlKG5ldyBXKFQpKTtpZihDIT09MClyZXR1cm4gYyhDKTtsZXQgUjtpZihFLmxlbkJvZHk+MCYmRS5vZmZCb2R5IT09dm9pZCAwKXtpZih4LmhzaD09PXZvaWQgMClyZXR1cm4gYygxNCk7bGV0IHY9cC5zbGljZShFLm9mZkJvZHksRS5vZmZCb2R5K0UubGVuQm9keSksW1YsYl09YXdhaXQgRC5kZWNyeXB0KHYpO2lmKGIhPT0wKXJldHVybiBjKGIpO1I9VjtsZXQgSD1hd2FpdCBpLmJsYWtlMyhSKTtpZighWShILHguaHNoKSlyZXR1cm4gYygxOSl9QS5wdXNoKHtoZWFkOngsYm9keTpSfSl9cmV0dXJuIGYoQSl9dG8uZGVjb2RlRmlsZT1yO2FzeW5jIGZ1bmN0aW9uIG4ocyxpLG8sYSx1KXtsZXRbZCxsXT1hd2FpdCByKHMsaSxvKTtpZihsIT09MClyZXR1cm4gYyhsKTtsZXRbcCxoXT1Bci5kZWNvZGUobmV3IFcocykpO2lmKGghPT0wKXJldHVybiBjKGgpO2xldCB5PWF3YWl0IHUoZCk7cmV0dXJuIHQocC5oZWFkLmxibCxwLmhlYWQuaWR4LHksaSxhKX10by5taWdyYXRlRmlsZT1ufSkoUHJ8fD17fSk7c2UoKTtCKCk7TSgpO2FzeW5jIGZ1bmN0aW9uIHJvKHtub3c6ZSxib2Q6dCxjcnlwdG86cix0eXA6bj0iIn0pe2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCksaT1uZXcgRixvPWkud3JpdGVTdHJ1Y3QobWUse2lkOnMsdHM6ZX0pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhPWkucmVzdWx0KCk7cmV0dXJuIGtyKHtub3c6ZSxlaWQ6YSxjdHI6MCx0eXA6bixib2Q6dCxjcnlwdG86cn0pfWFzeW5jIGZ1bmN0aW9uIGtyKHtub3c6ZSxlaWQ6dCxjdHI6cix0eXA6bj0iIixib2Q6cyxjcnlwdG86aX0pe2xldCBvPW5ldyBXKHQpLFthLHVdPW1lLmRlY29kZShvKTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXQgZD1lLmdldFRpbWUoKS1hLnRzLmdldFRpbWUoKSxsLHA9cz8ubGVuZ3RoPz8wO2lmKHMmJnA+MClsPWF3YWl0IGkuYmxha2UzKHMpO3JldHVybiBmKHtlaWQ6dCxvZmY6ZCxjdHI6cix0eXA6bixsZW46cCxoc2g6bH0pfWNlKCk7c2UoKTtCKCk7TSgpO2Z1bmN0aW9uIEhjKGUsdCl7bGV0IHI9ZS5sZW5ndGg8dC5sZW5ndGg/ZS5sZW5ndGg6dC5sZW5ndGg7Zm9yKGxldCBuPTA7bjxyO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4gZVtuXS10W25dO3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH1hc3luYyBmdW5jdGlvbiBqdChlLHQpe2xldCByPUFycmF5LmZyb20oZSk7ci5zb3J0KEhjKTtsZXQgbj0wO2ZvcihsZXQgbyBvZiByKW4rPW8ubGVuZ3RoO2xldCBzPW5ldyBVaW50OEFycmF5KG4pLGk9MDtmb3IobGV0IG8gb2YgcilzLnNldChvLGkpLGkrPW8ubGVuZ3RoO3JldHVybiB0LmJsYWtlMyhzKX1mdW5jdGlvbiBLYyhlKXtsZXQgdD1uZXcgRixyPXQud3JpdGVWYXJCeXRlcyhlLmVpZCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0IG49dC53cml0ZURhdGUoZS51cGRhdGVkQXQpO2lmKG4hPT0wKXJldHVybiBjKG4pO2xldCBzPXQud3JpdGVWYXJJbnQoZS5jdHIpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHQucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIERyKGUsdCl7bGV0IHI9W107Zm9yKGxldCBuIG9mIGUpe2xldFtzLGldPUtjKG4pO2lmKGkhPT0wfHwhcylyZXR1cm4gYyhpKTtyLnB1c2gocyl9cmV0dXJuIGYoYXdhaXQganQocix0KSl9c2UoKTtCKCk7TSgpO1h0KCk7dmFyIGd5PVN5bWJvbCgiRW50aXR5SUQiKTtmdW5jdGlvbiBzbyhlKXtyZXR1cm4idHlwZSJpbiBlfXZhciBTeT1TeW1ib2woIkRlcml2YXRpb25TZWVkIiksYnk9U3ltYm9sKCJQdWJsaWNLZXkiKSxJeT1TeW1ib2woIlByaXZhdGVLZXkiKSx3eT1TeW1ib2woIkhvc3RTcGVjaWZpY0tleVBhaXIiKSx4eT1TeW1ib2woIkhhc2giKTtCKCk7TSgpO2Z1bmN0aW9uIExjKGUpe2lmKCFlKXJldHVybiExO2lmKHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoImJvZHkiaW4gZT09PSExKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFZjKGUpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9PSJvYmplY3QiKXJldHVybjtpZighKCJ0eXBlImluIGUpKXJldHVybjtsZXQgdD1lLnR5cGU7aWYodHlwZW9mIHQhPT0ic3RyaW5nIilyZXR1cm47cmV0dXJuIHR9ZnVuY3Rpb24gT2MoZSl7aWYoIWUuYm9kfHxlLmJvZC5sZW5ndGg9PT0wKXtsZXQgaT17b2ZmOmUub2ZmLGN0cjplLmN0cixlaWQ6ZS5laWR9O3JldHVybiBmKGkpfWxldCB0PXNuKGUuYm9kKTtpZihMYyh0KT09PSExKXJldHVybiBjb25zb2xlLndhcm4oIm1zZyBib2R5IGludmFsaWQiLHQpLGMoMTQpO2xldCByPWUudHlwPz8iIixuPXIubGVuZ3RoPjA/cjpWYyh0KT8/IiIscz17b2ZmOmUub2ZmLGN0cjplLmN0cixlaWQ6ZS5laWQscGlkOnQucGlkLHRhZ3M6dC50YWdzLHR5cGU6bixib2R5OnQuYm9keX07cmV0dXJuIGYocyl9Y2xhc3MgQnJ7YXBwbGllcjtlbWl0dGVyPW5ldyBSdDtjbGVhcmVyO29uRGlydHlFaWRzO2NhY2hlRHJpdmVuO3BlZXJJbmdlc3Q7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5hcHBsaWVyPWU7dGhpcy5jbGVhcmVyPXQsdGhpcy5vbkRpcnR5RWlkcz1yLHRoaXMuY2FjaGVEcml2ZW49bj8uY2FjaGVEcml2ZW4/PyExLHRoaXMucGVlckluZ2VzdD1uPy5wZWVySW5nZXN0fWFwcGx5PWFzeW5jKGUpPT57bGV0IHQ9W10scj1bXTtmb3IobGV0IGEgb2YgZSl7bGV0W3UsZF09T2MoYSk7aWYoci5wdXNoKGQpLGQhPT0wKWNvbnRpbnVlO3QucHVzaCh1KX1sZXR7c3RhdHM6bix0eXBlczpzLGVpZHM6aX09YXdhaXQgdGhpcy5hcHBsaWVyKHQpLG89W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2xldCB1PXJbYV0sZD1uW2FdO2lmKHUhPT0wKXtvLnB1c2godSk7Y29udGludWV9aWYoZCE9PTApe28ucHVzaChkKTtjb250aW51ZX1vLnB1c2goMCl9aWYoIXRoaXMuY2FjaGVEcml2ZW4pZm9yKGxldCBhIG9mIHMpdGhpcy5lbWl0dGVyLmVtaXQoYSxudWxsKTtpZihpLmxlbmd0aD4wKXRoaXMub25EaXJ0eUVpZHM/LihpKTtyZXR1cm4gb307Y2xlYXI9YXN5bmMoKT0+e2xldCBlPWF3YWl0IHRoaXMuY2xlYXJlcigpO2lmKGUhPT0wKXJldHVybiBlO3JldHVybiB0aGlzLmVtaXR0ZXIuZW1pdEFsbChudWxsKSxlfTtub3RpZnk9KGUpPT57Zm9yKGxldCB0IG9mIGUpdGhpcy5lbWl0dGVyLmVtaXQodCxudWxsKX07cmVmcmVzaD1hc3luYyhlKT0+e2lmKHRoaXMucGVlckluZ2VzdCl7YXdhaXQgdGhpcy5wZWVySW5nZXN0KGUpO3JldHVybn19O29uPShlLHQpPT57dGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoZSx0KX07b2ZmPShlLHQpPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KX19ZnVuY3Rpb24gSihlKXtyZXR1cm4idHlwZSJpbiBlfWZ1bmN0aW9uIF9jKGUsdCl7bGV0IHI9dC5leGNsdWRlU3RhcnQ/ZT50LnN0YXJ0OmU+PXQuc3RhcnQsbj10LmV4Y2x1ZGVFbmQ/ZTx0LmVuZDplPD10LmVuZDtyZXR1cm4gciYmbn1mdW5jdGlvbiAkdChlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZighMCk7aWYoZS5yYW5nZS5zdGFydD5lLnJhbmdlLmVuZClyZXR1cm4gYygxMCk7cmV0dXJuIGYoITApfWZ1bmN0aW9uIFZuKGUsdCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7cmV0dXJuIF9jKGUsdC5yYW5nZSl9ZnVuY3Rpb24gTmMoZSx0KXtsZXQgcj10LmV4Y2x1ZGVTdGFydD9lPnQuc3RhcnQ6ZT49dC5zdGFydCxuPXQuZXhjbHVkZUVuZD9lPHQuZW5kOmU8PXQuZW5kO3JldHVybiByJiZufWZ1bmN0aW9uIEd0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpcmV0dXJuIGYoZS5sZW5ndGg+MCk7aWYoInJhbmdlImluIGUpe2lmKGUucmFuZ2Uuc3RhcnQ+ZS5yYW5nZS5lbmQpcmV0dXJuIGMoMTApO3JldHVybiBmKCEwKX1yZXR1cm4gZihlLnByZWZpeC5sZW5ndGg+MCl9ZnVuY3Rpb24gT24oZSx0KXtpZih0eXBlb2YgdD09PSJzdHJpbmciKXJldHVybiBlPT09dDtpZigicmFuZ2UiaW4gdClyZXR1cm4gTmMoZSx0LnJhbmdlKTtpZih0LnByZWZpeC5sZW5ndGg9PT0wKXJldHVybiExO3JldHVybiBlLnN0YXJ0c1dpdGgodC5wcmVmaXgpfWZ1bmN0aW9uIHFjKGUpe2lmKCFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PW5ldyBTZXQscj1bXTtmb3IobGV0IG4gb2YgZSl7aWYodHlwZW9mIG4hPT0ic3RyaW5nInx8bi5sZW5ndGg9PT0wKWNvbnRpbnVlO2lmKHQuaGFzKG4pKWNvbnRpbnVlO3QuYWRkKG4pLHIucHVzaChuKX1yZXR1cm4gci5sZW5ndGg+MD9yOnZvaWQgMH1mdW5jdGlvbiBVcihlKXtyZXR1cm57ZWlkOmUuZWlkLGN0cjplLmN0cix1cGRhdGVkQXQ6ZS51cGRhdGVkQXR9fWZ1bmN0aW9uIGlvKGUpe2xldCB0PW5ldyBXKGUuZWlkKSxbcixuXT10LnJlYWRTdHJ1Y3QobWUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3JldHVybiBmKHtlaWQ6ZS5laWQsY3RyOmUuY3RyLHVwZGF0ZWRBdDpuZXcgRGF0ZShyLnRzLmdldFRpbWUoKStlLm9mZil9KX1mdW5jdGlvbiBTdChlLHQpe2xldCByPW5ldyBXKHQuZWlkKSxbbixzXT1yLnJlYWRTdHJ1Y3QobWUpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBpPW5ldyBEYXRlKG4udHMuZ2V0VGltZSgpK3Qub2ZmKTtpZihlIT09dm9pZCAwJiZpPD1lLnVwZGF0ZWRBdClyZXR1cm4gYygxNSk7aWYoc28odCkpe2xldCBvPXFjKHQudGFncyk7cmV0dXJuIGYoe2VpZDp0LmVpZCxwaWQ6dC5waWQsLi4ubyE9PXZvaWQgMD97dGFnczpvfTp7fSx0eXBlOnQudHlwZSxjcmVhdGVkQXQ6bi50cyx1cGRhdGVkQXQ6aSxjdHI6dC5jdHIsYm9keTp0LmJvZHl9KX1yZXR1cm4gZih7ZWlkOnQuZWlkLHVwZGF0ZWRBdDppLGN0cjp0LmN0cn0pfWZ1bmN0aW9uIGJ0KGUsdCl7bGV0IHI9bmV3IFNldDtpZihlIT09dm9pZCAwJiZKKGUpKXIuYWRkKGUudHlwZSk7aWYoSih0KSlyLmFkZCh0LnR5cGUpO3JldHVyblsuLi5yXX1NKCk7Y2xhc3MgdnJ7aW5mbGlnaHQ9bnVsbDthZ2Fpbj0hMTtydW4oZSl7aWYodGhpcy5hZ2Fpbj0hMCx0aGlzLmluZmxpZ2h0KXJldHVybiB0aGlzLmluZmxpZ2h0O3JldHVybiB0aGlzLmluZmxpZ2h0PXRoaXMuZHJhaW4oZSksdGhpcy5pbmZsaWdodH1hc3luYyBmbHVzaCgpe2lmKCF0aGlzLmluZmxpZ2h0KXJldHVybjt0cnl7YXdhaXQgdGhpcy5pbmZsaWdodH1jYXRjaHt9fWFzeW5jIGRyYWluKGUpe3RyeXt0aGlzLmFnYWluPSExO2xldCB0PWF3YWl0IGUoKTt3aGlsZSh0aGlzLmFnYWluKXRoaXMuYWdhaW49ITEsdD1hd2FpdCBlKCk7cmV0dXJuIHR9ZmluYWxseXt0aGlzLmluZmxpZ2h0PW51bGx9fX12YXIgb289MTAwO2NsYXNzIF9ue3RpbWVyPW51bGw7ZGVsYXlNczt3b3JrO3RhaWw9bmV3IHZyO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kZWxheU1zPWU8MD8wOmUsdGhpcy53b3JrPXR9c2NoZWR1bGUoKXtpZih0aGlzLmRlbGF5TXM8PTApe3RoaXMuZmlyZSgpO3JldHVybn1pZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lcik7dGhpcy50aW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy50aW1lcj1udWxsLHRoaXMuZmlyZSgpfSx0aGlzLmRlbGF5TXMpfWFzeW5jIGZsdXNoKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKTthd2FpdCB0aGlzLnRhaWwuZmx1c2goKX1jYW5jZWwoKXtpZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj1udWxsfWZpcmUoKXtyZXR1cm4gdGhpcy50YWlsLnJ1bih0aGlzLndvcmspfX12YXIgYW89ITE7ZnVuY3Rpb24gY28oZSl7YW89ZT09PSEwfWZ1bmN0aW9uIFgoZSx0KXtpZighYW8pcmV0dXJuO2xldCByPU1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpO2lmKHQhPT12b2lkIDApY29uc29sZS53YXJuKGBbZGlwICR7cn1tc10gJHtlfWAsdCk7ZWxzZSBjb25zb2xlLndhcm4oYFtkaXAgJHtyfW1zXSAke2V9YCl9c2UoKTtCKCk7ZnVuY3Rpb24gdW8oZSl7bGV0IHQ9bmV3IFcoZS5laWQpLFtyLG5dPW1lLmRlY29kZSh0KTtpZihuIT09MClyZXR1cm47cmV0dXJuIHIudHMuZ2V0VGltZSgpK2Uub2ZmfWZ1bmN0aW9uIEZjKGUsdCl7bGV0IHI9dW8oZSksbj11byh0KTtpZihyPT09dm9pZCAwJiZuPT09dm9pZCAwKXJldHVybiAwO2lmKHI9PT12b2lkIDApcmV0dXJuIDE7aWYobj09PXZvaWQgMClyZXR1cm4tMTtpZihuIT09cilyZXR1cm4gbi1yO3JldHVybiB0LmN0ci1lLmN0cn1mdW5jdGlvbiBJdChlLHQpe3JldHVybiBlLnNsaWNlKCkuc29ydCgocixuKT0+RmModChyKSx0KG4pKSl9dmFyIE5uPXtwaGFzZToiaWRsZSJ9LFF0PTUwO2Z1bmN0aW9uIHFuKGUsdCxyKXtpZihlPD0wfHx0PD0wKXJldHVybiExO2lmKGU9PT0xfHxlPT09dClyZXR1cm4hMDtyZXR1cm4gZSVyPT09MH1mdW5jdGlvbiBsbyhlLHQpe2lmKHR5cGVvZiBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYj09PSJmdW5jdGlvbiIpe25hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGUsdCk7cmV0dXJufWxldCByPVVSTC5jcmVhdGVPYmplY3RVUkwoZSksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5ocmVmPXIsbi5kb3dubG9hZD10LGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobiksbi5jbGljaygpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobiksVVJMLnJldm9rZU9iamVjdFVSTChyKX1mdW5jdGlvbiBmbyhlLHQscil7bGV0IG49W10scz1bXSxpPTA7Zm9yKGxldCBvIG9mIGUpe2xldCBhPXQobyk7aWYocy5sZW5ndGg+MCYmaSthPnIpbi5wdXNoKHMpLHM9W10saT0wO2lmKHMucHVzaChvKSxpKz1hLGk+PXIpbi5wdXNoKHMpLHM9W10saT0wfWlmKHMubGVuZ3RoPjApbi5wdXNoKHMpO3JldHVybiBufWFzeW5jIGZ1bmN0aW9uIEZuKGUsdCxyKXtsZXQgbj1lLmxlbmd0aDtpZihuPDEpcmV0dXJuW107bGV0IHM9QXJyYXkobiksaT0wLG89TWF0aC5taW4oTWF0aC5tYXgoMSx0KSxuKSxhPWFzeW5jKCk9Pnt3aGlsZSghMCl7bGV0IGQ9aTtpZihpKz0xLGQ+PW4pcmV0dXJuO3NbZF09YXdhaXQgcihlW2RdLGQpfX0sdT1bXTtmb3IobGV0IGQ9MDtkPG87ZCsrKXUucHVzaChhKCkpO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbCh1KSxzfXNlKCk7QigpO2ZlKCk7c2UoKTtCKCk7ZmUoKTtNKCk7YXN5bmMgZnVuY3Rpb24gQ3IoZSx0LHIsbixzLGk9eil7aWYocy5ieXRlTGVuZ3RoIT09b2UpcmV0dXJuIGMoMTApO2xldCBvPW5ldyBXKGUuaGVhZENwaCksW2EsdV09by5yZWFkU3RydWN0KElyKTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXR7c2lnOmQsa2RtOmwsaGVhZENwaDpwfT1hO2lmKCFhd2FpdCBuLmNoZWNrU2lnRWQyNTUxOShkLFNyKHMscCksdCkpcmV0dXJuIGMoMyk7bGV0IHk9ci5kZXJpdmVDaXBoZXIobCwiZGVjcnlwdCIsaSksW20sZ109YXdhaXQgeS5kZWNyeXB0KHApO2lmKGchPT0wKXJldHVybiBjKGcpO3JldHVybiBmKHtrZG06bCxoZWFkRW5jOm19KX1CKCk7TSgpO3ZhciB5bT1TeW1ib2woIkVudFJsbSIpO2Z1bmN0aW9uIHN0KGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyJ8fGU9PT0iIilyZXR1cm47cmV0dXJuIGV9ZnVuY3Rpb24gVHIoZSl7aWYoZS5ybG0hPT12b2lkIDAmJmUucmxtIT09IiIpcmV0dXJuIGU7aWYoZS5ybG09PT12b2lkIDApcmV0dXJuIGU7bGV0IHQ9ey4uLmV9O3JldHVybiBkZWxldGUgdC5ybG0sdH1mdW5jdGlvbiBXbihlKXtyZXR1cm4gdHlwZW9mIGU9PT0ibnVtYmVyIiYmTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MH1mdW5jdGlvbiBXYyhlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT09Im9iamVjdCJ9ZnVuY3Rpb24gTXIoZSl7aWYoIVdjKGUpfHx0eXBlb2YgZS5sYWJlbCE9PSJzdHJpbmciKXJldHVybjtpZighV24oZS5pbmRleCkpcmV0dXJuO2xldCB0PXtsYWJlbDplLmxhYmVsLGluZGV4OmUuaW5kZXh9O2lmKGUucHJpb3I9PT12b2lkIDApcmV0dXJuIHQ7aWYoIUFycmF5LmlzQXJyYXkoZS5wcmlvcikpcmV0dXJuO2xldCByPVtdO2ZvcihsZXQgbiBvZiBlLnByaW9yKXtpZighV24obikpcmV0dXJuO3IucHVzaChuKX1pZihyLmxlbmd0aD4wKXQucHJpb3I9cjtyZXR1cm4gdH1mdW5jdGlvbiBwbyhlLHQscil7aWYodHlwZW9mIGUhPT0ic3RyaW5nInx8IVduKHIpKXJldHVybiBjKDEwKTtpZih0IT09dm9pZCAwJiZyPHQuaW5kZXgpcmV0dXJuIGMoMTApO2xldCBuPXQ/LnByaW9yIT09dm9pZCAwP3QucHJpb3Iuc2xpY2UoKTp2b2lkIDA7aWYodCE9PXZvaWQgMCYmcj50LmluZGV4KXtsZXQgcz1uIT09dm9pZCAwP246W107cmV0dXJuIHMucHVzaCh0LmluZGV4KSxmKHtsYWJlbDplLGluZGV4OnIscHJpb3I6c30pfXJldHVybiBmKHtsYWJlbDplLGluZGV4OnIsLi4ubiE9PXZvaWQgMD97cHJpb3I6bn06e319KX1NKCk7Y2UoKTtCKCk7dmFyIHh0PSJmIixScj0idCIsd3Q9ImUiO2Z1bmN0aW9uIHpjKGUpe2lmKGU9PT0hMHx8ZT09PVJyKXJldHVybiBScjtpZihlPT09d3QpcmV0dXJuIHd0O3JldHVybiB4dH1mdW5jdGlvbiBobyhlKXtyZXR1cm4gZSE9PTAmJmUhPT0xNSYmZSE9PTE4JiZlIT09MTd9ZnVuY3Rpb24gem4oZSx0LHIpe2lmKGUuYXBsZD10LHQ9PT13dCYmciE9PXZvaWQgMCllLmVycj1yO2Vsc2UgZGVsZXRlIGUuZXJyfWFzeW5jIGZ1bmN0aW9uIEhyKGUsdCxyLG4pe2xldCBzPW4/LmJvZHkhPT0hMSxpPXpjKHQuYXBsZCksbz10LmJvZHksYT1vPy5sZW5ndGg/PzAsdTtpZihzJiZvJiZhPjApdT1hd2FpdCByLmJsYWtlMyhvKTtsZXQgZD17ZWlkOnQuZWlkLG9mZjp0Lm9mZj8/MCxjdHI6dC5jdHI/PzAsdHlwOnQudHlwPz8iIixsZW46YSxoc2g6dX0sbD17aGFzaDplLGhlYWQ6ZCxhcGxkOml9O2lmKHMmJm8hPT12b2lkIDApbC5ib2R5PW87aWYoaT09PXd0JiZ0LmVyciE9PXZvaWQgMClsLmVycj10LmVycjtsZXQgcD1zdCh0LnJsbSk7aWYocCE9PXZvaWQgMClsLnJsbT1wO3JldHVybiBsfXZhciBqbj0xMDQ4NTc2LFhuPTEwNDg1NzYsbW89NjQ7ZnVuY3Rpb24gamMoZSl7cmV0dXJuIGUuc2lnLmxlbmd0aCtlLmtkbS5sZW5ndGgrZS5oZWFkQ3BoLmxlbmd0aCtlLmJvZHlDcGgubGVuZ3RofWZ1bmN0aW9uIEtyKGUsdCxyLG4pe2xldCBzPWAke3R9XHgwMCR7bXQobj8/eil9YCxpPWUuZ2V0KHMpO2lmKGkpe2kuc2Vxcy5wdXNoKHIpO3JldHVybn1lLnNldChzLHtob3N0OnQscmVhbG06bixzZXFzOltyXX0pfWFzeW5jIGZ1bmN0aW9uIGdvKGUsdCl7Zm9yKGxldCByIG9mIHQudmFsdWVzKCkpYXdhaXQgZS5kb3dubG9hZHMuZGVxKHIuaG9zdCxyLnNlcXMsci5yZWFsbSl9YXN5bmMgZnVuY3Rpb24gWGMoZSx0LHIsbixzLGk9eil7aWYobi5sZW5ndGg8MSlyZXR1cm4gMDtsZXRbbyxhXT1hd2FpdCBlLnB1c2gobik7aWYoYSE9PTApcmV0dXJuIGE7aWYoIW8pcmV0dXJuIDI3O2ZvcihsZXQgZCBvZiBvKXtpZihkLnN0YXR1cyE9PTApe2NvbnNvbGUuZXJyb3IoInB1c2ggZXJyIixkKTtjb250aW51ZX1sZXQgbD1zW2QuaWR4XTtpZighbCl7Y29uc29sZS5lcnJvcigibm8gaGFzaCIsZCk7Y29udGludWV9YXdhaXQgdC51cGxvYWRzLmRlcShyLFtsXSl9bGV0IHU9YXdhaXQgdC5ob3N0cy5nZXQocik7aWYodSl7bGV0IGQ9enQodSxpKSxsPWQscD1bXTtmb3IobGV0IGggb2YgbylpZihoLnN0YXR1cz09PTApcC5wdXNoKGguc2VxKTtwLnNvcnQoKGgseSk9PmgteSk7Zm9yKGxldCBoIG9mIHApaWYoaD09PWQrMSlkPWg7aWYoZD5sKWF3YWl0IHQuaG9zdHMudG91Y2gocixkLGkpfXJldHVybiAwfWFzeW5jIGZ1bmN0aW9uIHlvKGUsdCl7aWYodC5sZW5ndGg8MSlyZXR1cm4gZihbXSk7bGV0IHI9bmV3IE1hcDtmb3IobGV0IHMgb2YgdCl7bGV0IGk9cy5yZWFsbT8/eixvPW10KGkpLGE9ci5nZXQobyk7aWYoIWEpYT17cmVhbG06aSxkbHM6bmV3IE1hcCxzZXFzOltdfSxyLnNldChvLGEpO2EuZGxzLnNldChzLnNlcSxzKSxhLnNlcXMucHVzaChzLnNlcSl9bGV0IG49W107Zm9yKGxldCBzIG9mIHIudmFsdWVzKCkpe2xldFtpLG9dPWF3YWl0IGUucHVsbChzLnNlcXMscy5yZWFsbSk7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoIWkpcmV0dXJuIGMoMjcpO2ZvcihsZXR7c2VxOmEsYm9keUNwaDp1fW9mIGkpe2xldCBkPXMuZGxzLmdldChhKTtpZighZCljb250aW51ZTtuLnB1c2goe2RsOmQsYm9keUNwaDp1fSl9fXJldHVybiBmKG4pfWFzeW5jIGZ1bmN0aW9uICRjKGUsdCxyLG4pe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIGYoe3BhcnRzOltdLGhhc2hlczpbXX0pO2xldCBzPVtdLGk9W10sbz1bXSxhPW5ldyBNYXA7Zm9yKGxldHtkbDpkLGJvZHlDcGg6bH1vZiBuKXtsZXR7aGVhZDpwLGtkbTpoLHNlcTp5LGhvc3Q6bX09ZCxnPWQucmVhbG0/P3osW1MsSV09YXdhaXQgU28oZCxyKTtpZihJIT09MCl7S3IoYSxtLHksZC5yZWFsbSk7Y29udGludWV9bGV0e2hlYWRFbmM6dyxoZWFkRW5jSGFzaDpBfT1TLEU9dC5kZXJpdmVDaXBoZXIoaCwiZGVjcnlwdCIsZyksW0QsVF09YXdhaXQgQm4odyxsLEUscixBKTtpZihUIT09MCl7S3IoYSxtLHksZC5yZWFsbSk7Y29udGludWV9bGV0IEw9e2hlYWQ6cCxib2R5OkQuYm9kfSx4PUQuaGVhZEhhc2g7by5wdXNoKHtrZXk6eCxkYXRhOndvKEwsZyl9KSxzLnB1c2goTCksaS5wdXNoKHgpLEtyKGEsbSx5LGQucmVhbG0pfWxldCB1PWF3YWl0IGUubWVzc2FnZXMuYWRkKG8pO2F3YWl0IGdvKGUsYSk7Zm9yKGxldCBkPTA7ZDx1Lmxlbmd0aDtkKyspe2xldCBsPXVbZF07aWYobCE9PTAmJmwhPT0xNSljb25zb2xlLmVycm9yKCJFUlIgc3RvcmluZyIsUFtsXSwiZm9yIG1lc3NhZ2UiLGQpfXJldHVybiBmKHtwYXJ0czpzLGhhc2hlczppfSl9YXN5bmMgZnVuY3Rpb24gU28oZSx0KXtsZXQgcj1lLmhlYWRFbmM7aWYoIXIpe2xldCBzPW5ldyBGLGk9cy53cml0ZVN0cnVjdCh3ZSxlLmhlYWQpO2lmKGkhPT0wKXJldHVybiBjKGkpO3I9cy5yZXN1bHQoKX1pZihlLmhlYWRFbmNIYXNoKXJldHVybiBmKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6ZS5oZWFkRW5jSGFzaH0pO2xldCBuPWF3YWl0IHQuYmxha2UzKHIpO3JldHVybiBmKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6bn0pfWFzeW5jIGZ1bmN0aW9uIGJvKGUsdCxyKXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgbyBvZiB0KW4uYWRkKEsobykpO2lmKG4uc2l6ZTwxKXJldHVybjtsZXQgcz1BcnJheS5mcm9tKGF3YWl0IGUuZG93bmxvYWRzLmxpc3QoKSk7aWYocy5sZW5ndGg8MSlyZXR1cm47bGV0IGk9bmV3IE1hcDtmb3IobGV0IG8gb2Ygcyl7bGV0IGE7aWYoby5oZWFkRW5jSGFzaClhPUsoby5oZWFkRW5jSGFzaCk7ZWxzZXtsZXRbdSxkXT1hd2FpdCBTbyhvLHIpO2lmKGQhPT0wKWNvbnRpbnVlO2E9Syh1LmhlYWRFbmNIYXNoKX1pZighbi5oYXMoYSkpY29udGludWU7S3IoaSxvLmhvc3Qsby5zZXEsby5yZWFsbSl9YXdhaXQgZ28oZSxpKX1hc3luYyBmdW5jdGlvbiAkbih7Y29ubjplLHN0b3JlOnQsZW5jbGF2ZTpyLGhvc3Q6bixjcnlwdG86cyxvblByb2dyZXNzOmkscGVla1Byb2dyZXNzRXZlcnk6byxwZWVrQ29uY3VycmVuY3k6YSxyZWFsbTp1fSl7bGV0IGQ9dT8/eixbbCxwXT1hd2FpdCBlLmlkZW50aXR5KCk7aWYocCE9PTApcmV0dXJuIHA7bGV0W2gseV09YXdhaXQgZS5ob3N0UmxtKGQpO2lmKHkhPT0wKXJldHVybiB5O2xldCBtO3RyeXttPWF3YWl0IHMuaW1wb3J0VmVyaWZ5S2V5KGwucHVibGljS2V5KX1jYXRjaHtyZXR1cm4gMjl9bGV0IGc9W10sW1MsSV09YXdhaXQgZS5wZWVrKHp0KG4sZCksZCk7aWYoSSE9PTApcmV0dXJuIEk7bGV0IHc9Uy5sZW5ndGgsQT1vPz9RdCxFPWE/P21vO2lmKGkmJnc+MClpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6MCx0b3RhbDp3fSk7bGV0IEQ9MCxUPWF3YWl0IEZuKFMsRSxhc3luYyh4KT0+e2xldFtDLFJdPWF3YWl0IENyKHgsbSxyLHMsaCxkKSx2O2lmKFIhPT0wKXY9e29rOiExLHNlcTp4LnNlcSxzdGF0OlJ9O2Vsc2V7bGV0IFY9YXdhaXQgcy5ibGFrZTMoQy5oZWFkRW5jKTt2PXtvazohMCxzZXE6eC5zZXEsa2RtOkMua2RtLGhlYWRFbmM6Qy5oZWFkRW5jLGhlYWRFbmNIYXNoOlZ9fWlmKEQrPTEsaSYmcW4oRCx3LEEpKWkoe3BoYXNlOiJwZWVrIixob3N0Om4ubGFiZWwsZG9uZTpELHRvdGFsOnd9KTtyZXR1cm4gdn0pLEw9bmV3IFNldDtmb3IobGV0IHggb2YgVCl7aWYoIXgub2spe2NvbnNvbGUuZXJyb3IoInBlZWs6IGRlY3J5cHRpbmcgaXRlbSBoZWFkIix4LnN0YXQpO2NvbnRpbnVlfWxldCBDPUsoeC5oZWFkRW5jSGFzaCk7aWYoYXdhaXQgdC5tZXNzYWdlcy5oYXMoeC5oZWFkRW5jSGFzaCkpe2NvbnNvbGUuaW5mbygicGVlazogbG9jYWwgbXNnOyBza2lwIGRvd25sb2FkLCBkZXEgdXBsb2FkIiksYXdhaXQgdC51cGxvYWRzLmRlcShuLmxhYmVsLFt4LmhlYWRFbmNIYXNoXSksYXdhaXQgdC5kb3dubG9hZHMuZGVxKG4ubGFiZWwsW3guc2VxXSxkKTtjb250aW51ZX1pZihMLmhhcyhDKSl7YXdhaXQgdC5kb3dubG9hZHMuZGVxKG4ubGFiZWwsW3guc2VxXSxkKTtjb250aW51ZX1sZXQgdj1uZXcgVyh4LmhlYWRFbmMpLFtWLGJdPXYucmVhZFN0cnVjdCh3ZSk7aWYoYiE9PTApe2NvbnNvbGUuZXJyb3IoInBlZWs6IHJlYWRpbmcgaXRlbSBoZWFkIixiKTtjb250aW51ZX1MLmFkZChDKTtsZXQgSD17a2RtOngua2RtLGhlYWQ6VixzZXE6eC5zZXEsaG9zdDpuLmxhYmVsLGhlYWRFbmM6eC5oZWFkRW5jLGhlYWRFbmNIYXNoOnguaGVhZEVuY0hhc2h9LF89RXIoZCk7aWYoXyE9PXZvaWQgMClILnJlYWxtPV87Zy5wdXNoKEgpfWlmKGF3YWl0IHQuZG93bmxvYWRzLmVucShnKSxTLmxlbmd0aD4wKXtsZXQgeD1NYXRoLm1heCguLi5TLm1hcCgoQyk9PkMuc2VxKSk7YXdhaXQgdC5ob3N0cy5yZWNvcmRTZXFzKG4ubGFiZWwse2xhc3RTZXE6eH0sZCl9aWYoaSlpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6dyx0b3RhbDp3fSk7cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gSW8oe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixtYXhQdXNoQnl0ZXM6bixvblByb2dyZXNzOnN9KXtsZXQgaT1uPz9qbixvPWF3YWl0IHQudXBsb2Fkcy5saXN0KHIubGFiZWwpLGE9by5sZW5ndGgsdT0wO2lmKHMmJmE+MClzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6MCx0b3RhbDphfSk7bGV0IGQ9W10sbD1bXSxwPTAsaD16LHk9YXN5bmMoKT0+e2lmKGQubGVuZ3RoPDEpcmV0dXJuIDA7bGV0IFM9ZC5sZW5ndGgsST1hd2FpdCBYYyhlLHQsci5sYWJlbCxkLGwsaCk7aWYoZD1bXSxsPVtdLHA9MCxJPT09MCl7aWYodSs9UyxzKXMoe3BoYXNlOiJwdXNoIixob3N0OnIubGFiZWwsZG9uZTp1LHRvdGFsOmF9KX1yZXR1cm4gSX0sbT1bXSxnPWF3YWl0IHQucmVhbG1zLmxpc3QoKTtmb3IobGV0IFMgb2Ygbyl7bGV0IEk9YXdhaXQgdC5tZXNzYWdlcy5nZXQoUyk7aWYoIUkpe3UrPTE7Y29udGludWV9bS5wdXNoKHtoYXNoOlMscmVhbG06WWkoSS5ybG0sZyksbXNnOnsuLi5JLmhlYWQsYm9kOkkuYm9keX19KX1tLnNvcnQoKFMsSSk9PntpZihTLnJlYWxtLmxhYmVsPEkucmVhbG0ubGFiZWwpcmV0dXJuLTE7aWYoUy5yZWFsbS5sYWJlbD5JLnJlYWxtLmxhYmVsKXJldHVybiAxO3JldHVybiBTLnJlYWxtLmluZGV4LUkucmVhbG0uaW5kZXh9KTtmb3IobGV0IFMgb2YgbSl7aWYoZC5sZW5ndGg+MCYmIVFpKGgsUy5yZWFsbSkpe2xldCBFPWF3YWl0IHkoKTtpZihFIT09MClyZXR1cm4gRX1sZXRbSSx3XT1hd2FpdCBlLnNlYWwoUy5tc2csUy5yZWFsbSk7aWYodyE9PTApcmV0dXJuIHc7bGV0IEE9amMoSSk7aWYoZC5sZW5ndGg+MCYmcCtBPmkpe2xldCBFPWF3YWl0IHkoKTtpZihFIT09MClyZXR1cm4gRX1pZihkLmxlbmd0aDwxKWg9Uy5yZWFsbTtpZihkLnB1c2goSSksbC5wdXNoKFMuaGFzaCkscCs9QSxwPj1pKXtsZXQgRT1hd2FpdCB5KCk7aWYoRSE9PTApcmV0dXJuIEV9fXJldHVybiB5KCl9YXN5bmMgZnVuY3Rpb24gR24oe2Nvbm46ZSxzdG9yZTp0LGVuY2xhdmU6cixob3N0Om4sY3J5cHRvOnMsbWF4UHVsbEJ5dGVzOmksb25Qcm9ncmVzczpvfSxhKXtsZXQgdT1pPz9YbixkPWF3YWl0IHQuZG93bmxvYWRzLmxpc3QoKSxsPUFycmF5LmZyb20oZCkuZmlsdGVyKChTKT0+Uy5ob3N0PT09bi5sYWJlbCk7aWYobC5sZW5ndGg8MSlyZXR1cm4gMTU7bGV0IHA9SXQobCwoUyk9PlMuaGVhZCksaD1mbyhwLChTKT0+Uy5oZWFkLmxlbix1KSx5PXAubGVuZ3RoLG09MDtpZihvKW8oe3BoYXNlOiJwdWxsIixob3N0Om4ubGFiZWwsZG9uZTowLHRvdGFsOnl9KTtsZXQgZz15byhlLGhbMF0pO2ZvcihsZXQgUz0wO1M8aC5sZW5ndGg7UysrKXtsZXRbSSx3XT1hd2FpdCBnO2lmKHchPT0wKXJldHVybiB3O2lmKG0rPWhbU10ubGVuZ3RoLG8pbyh7cGhhc2U6InB1bGwiLGhvc3Q6bi5sYWJlbCxkb25lOm0sdG90YWw6eX0pO2xldCBBPWhbUysxXTtpZihBKWc9eW8oZSxBKTtpZihvKW8oe3BoYXNlOiJvcGVuIixob3N0Om4ubGFiZWwsZG9uZTptLHRvdGFsOnl9KTtsZXQgRT1JdChJLChUKT0+VC5kbC5oZWFkKSxbLERdPWF3YWl0ICRjKHQscixzLEUpO2lmKEQhPT0wKXJldHVybiBEO2lmKGEpe2lmKG8pbyh7cGhhc2U6ImV4ZWMiLGhvc3Q6bi5sYWJlbCxkb25lOm0sdG90YWw6eX0pO2F3YWl0IGEoKX19cmV0dXJuIDB9ZnVuY3Rpb24gd28oe2hlYWQ6ZSxib2R5OnR9LHIpe2xldCBuPXtlaWQ6ZS5laWQsYm9keTp0LGFwbGQ6eHR9O2lmKGUub2ZmIT09MCluLm9mZj1lLm9mZjtpZihlLmN0ciE9PTApbi5jdHI9ZS5jdHI7aWYoZS50eXApbi50eXA9ZS50eXA7bGV0IHM9c3Qocj8ubGFiZWwpO2lmKHMhPT12b2lkIDApbi5ybG09cztyZXR1cm4gbn1hc3luYyBmdW5jdGlvbiB4byhlLHtjb25uOnQsc3RvcmU6cixlbmNsYXZlOm4saG9zdDpzLGNyeXB0bzppLG9uUHJvZ3Jlc3M6b30sYSl7bGV0IHU9cy5sYWJlbCxbZCxsXT1hd2FpdCB0LmlkZW50aXR5KCk7aWYobCE9PTApcmV0dXJuO2xldCBwO3RyeXtwPWF3YWl0IGkuaW1wb3J0VmVyaWZ5S2V5KGQucHVibGljS2V5KX1jYXRjaCh4KXtjb25zb2xlLmVycm9yKCJGYWlsZWQgaW1wb3J0aW5nIGhvc3QgdmVyaWZ5IGtleSIseCk7cmV0dXJufWxldCBoPW5ldyBXKGUpLFt5LG1dPWgucmVhZFN0cnVjdHMoYnIpO2lmKG0hPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgZGVjb2Rpbmcgbm90aWYiLFBbbV0pO3JldHVybn1sZXQgZz17bGFiZWw6cy5sYWJlbCxpbmRleDpzLmlkeD8/MH0sUz1ndChhd2FpdCByLnJlYWxtcy5saXN0KCkpLEk9ITEsdz1hd2FpdCByLmhvc3RzLmdldCh1KSxBPW5ldyBNYXAsRT1bXSxEPSExO2ZvcihsZXQgeCBvZiB5KXtsZXRbQyxSXT1hd2FpdCBuLnJlYWxtRm9yUmxtKGcseC5ybG0sUyk7aWYoUiE9PTApe2NvbnNvbGUuZXJyb3IoIm5vdGlmOiByZWFsbSIsUFtSXSk7Y29udGludWV9bGV0W3YsVl09YXdhaXQgQ3Ioe3NlcTp4LnNlcSxoZWFkQ3BoOnguaGVhZENwaH0scCxuLGkseC5ybG0sQyk7aWYoViE9PTApe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCBkZWNyeXB0aW5nIG5vdGlmIixQW1ZdKTtjb250aW51ZX1sZXQgYj1hd2FpdCBpLmJsYWtlMyh2LmhlYWRFbmMpO2lmKGF3YWl0IHIubWVzc2FnZXMuaGFzKGIpKWNvbnRpbnVlO2xldCBIPW5ldyBXKHYuaGVhZEVuYyksW18sT109SC5yZWFkU3RydWN0KHdlKTtpZihPIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGhlYWQiLFBbT10pO2NvbnRpbnVlfWlmKCF4LmJvZHlDcGgmJl8ubGVuPjApe0Q9ITA7bGV0IGVlPXtzZXE6eC5zZXEsaG9zdDp1LGtkbTp2LmtkbSxoZWFkOl8saGVhZEVuYzp2LmhlYWRFbmMsaGVhZEVuY0hhc2g6Yn0saj1FcihDKTtpZihqIT09dm9pZCAwKWVlLnJlYWxtPWo7YXdhaXQgci5kb3dubG9hZHMuZW5xKFtlZV0pfWVsc2UgRS5wdXNoKHsuLi52LGhlYWQ6Xyxib2R5Q3BoOnguYm9keUNwaCxoZWFkRW5jSGFzaDpiLHJlYWxtOkN9KTtpZighdyl7Y29uc29sZS5sb2coIm91dCBvZiBzZXEiLHguc2VxLHZvaWQgMCksST0hMDtjb250aW51ZX1sZXQgTj1tdChDKSxVPUEuZ2V0KE4pO2lmKCFVKVU9e3JlYWxtOkMsc2VxOnp0KHcsQyl9LEEuc2V0KE4sVSk7aWYoeC5zZXEhPT1VLnNlcSsxKWNvbnNvbGUubG9nKCJvdXQgb2Ygc2VxIix4LnNlcSxVLnNlcSksST0hMDtlbHNlIFUuc2VxPXguc2VxfWlmKHcpe2ZvcihsZXQgeCBvZiBBLnZhbHVlcygpKWlmKHguc2VxPnp0KHcseC5yZWFsbSkpYXdhaXQgci5ob3N0cy50b3VjaChzLmxhYmVsLHguc2VxLHgucmVhbG0pfWxldCBUPVtdO2ZvcihsZXQgeCBvZiBFKXtsZXQgQz1uLmRlcml2ZUNpcGhlcih4LmtkbSwiZGVjcnlwdCIseC5yZWFsbSksW1Isdl09YXdhaXQgQm4oeC5oZWFkRW5jLHguYm9keUNwaCxDLGkpO2lmKHYhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gb3BlbiBib2R5IixQW3ZdKTtjb250aW51ZX1ULnB1c2goe2tleTp4LmhlYWRFbmNIYXNoLGRhdGE6d28oe2hlYWQ6eC5oZWFkLGJvZHk6Ui5ib2R9LHgucmVhbG0pfSl9bGV0IEw9YXdhaXQgci5tZXNzYWdlcy5hZGQoVCk7Zm9yKGxldCB4PTA7eDxMLmxlbmd0aDt4Kyspe2xldCBDPUxbeF07aWYoQyE9PTAmJkMhPT0xNSljb25zb2xlLmVycm9yKCJFUlIgc3RvcmluZyIsUFtDXSwiZm9yIG1lc3NhZ2UiLHgpfWlmKG8mJlQubGVuZ3RoPjApbyh7cGhhc2U6Im9wZW4iLGhvc3Q6cy5sYWJlbCxkb25lOlQubGVuZ3RoLHRvdGFsOlQubGVuZ3RofSk7aWYoSXx8RHx8VC5sZW5ndGg+MClhKCl9YXN5bmMgZnVuY3Rpb24gUW4oZSx0PXt9KXtsZXQgcj10LnB1bGwhPT0hMSxuPXQucHVzaD09PSEwLHtjb25uOnMsc3RvcmU6aSxlbmNsYXZlOm8saG9zdDphLGNyeXB0bzp1LG9uUHJvZ3Jlc3M6ZCxwZWVrUHJvZ3Jlc3NFdmVyeTpsLHBlZWtDb25jdXJyZW5jeTpwfT1lLFtoLHldPWF3YWl0IHMuaWRlbnRpdHkoKTtpZih5IT09MClyZXR1cm4gYyh5KTtsZXQgbTt0cnl7bT1hd2FpdCB1LmltcG9ydFZlcmlmeUtleShoLnB1YmxpY0tleSl9Y2F0Y2h7cmV0dXJuIGMoMjkpfWxldCBnPW5ldyBNYXAsUz0wLEk9bD8/UXQsdz1wPz9tbyxBPWd0KGF3YWl0IGkucmVhbG1zLmxpc3QoKSk7Zm9yKGxldCB2IG9mIEEpe2xldFtWLGJdPWF3YWl0IHMuaG9zdFJsbSh2KTtpZihiIT09MClyZXR1cm4gYyhiKTtsZXRbSCxfXT1hd2FpdCBzLnBlZWsoMCx2KTtpZihfIT09MClyZXR1cm4gYyhfKTtTKz1ILmxlbmd0aDtsZXQgTz1ILmxlbmd0aDtpZihkJiZPPjApZCh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOjAsdG90YWw6T30pO2xldCBOPTAsVT1hd2FpdCBGbihILHcsYXN5bmMoaik9PntsZXRbdGUsR109YXdhaXQgQ3IoaixtLG8sdSxWLHYpLEllO2lmKEchPT0wKUllPXtvazohMSxzZXE6ai5zZXEsc3RhdDpHfTtlbHNle2xldCBfZT1hd2FpdCB1LmJsYWtlMyh0ZS5oZWFkRW5jKTtJZT17b2s6ITAsc2VxOmouc2VxLGtkbTp0ZS5rZG0saGVhZEVuYzp0ZS5oZWFkRW5jLGhlYWRFbmNIYXNoOl9lfX1pZihOKz0xLGQmJnFuKE4sTyxJKSlkKHtwaGFzZToicGVlayIsaG9zdDphLmxhYmVsLGRvbmU6Tix0b3RhbDpPfSk7cmV0dXJuIEllfSk7Zm9yKGxldCBqIG9mIFUpe2lmKCFqLm9rKWNvbnRpbnVlO2xldCB0ZT1LKGouaGVhZEVuY0hhc2gpLEc9Zy5nZXQodGUpO2lmKEcpRy5jb3VudCs9MTtlbHNlIGcuc2V0KHRlLHtoYXNoOmouaGVhZEVuY0hhc2gsY291bnQ6MSxzYW1wbGU6aixyZWFsbTp2fSl9bGV0IGVlPUgubGVuZ3RoPjA/TWF0aC5tYXgoLi4uSC5tYXAoKGopPT5qLnNlcSkpOjA7aWYoYXdhaXQgaS5ob3N0cy5yZWNvcmRTZXFzKGEubGFiZWwse3NldExhc3RTZXE6ZWV9LHYpLGQpZCh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOk8sdG90YWw6T30pfWxldCBFPTAsRD1bXTtmb3IobGV0IHYgb2YgZy52YWx1ZXMoKSl7aWYodi5jb3VudD4xKUUrPXYuY291bnQtMTtELnB1c2godi5oYXNoKX1sZXQgVD1nLnNpemUsTD1hd2FpdCBqdChELHUpLHg9W10sQz0wO2ZvcihsZXQgdiBvZiBnLnZhbHVlcygpKXtpZihhd2FpdCBpLm1lc3NhZ2VzLmhhcyh2Lmhhc2gpKXthd2FpdCBpLnVwbG9hZHMuZGVxKGEubGFiZWwsW3YuaGFzaF0pO2NvbnRpbnVlfWlmKEMrPTEsIXIpY29udGludWU7bGV0IGI9di5zYW1wbGUsSD1uZXcgVyhiLmhlYWRFbmMpLFtfLE9dPUgucmVhZFN0cnVjdCh3ZSk7aWYoTyE9PTApe2NvbnNvbGUuZXJyb3IoInJlY29uY2lsZTogcmVhZGluZyBtc2cgaGVhZGVyIixPKTtjb250aW51ZX1sZXQgTj17a2RtOmIua2RtLGhlYWQ6XyxzZXE6Yi5zZXEsaG9zdDphLmxhYmVsLGhlYWRFbmM6Yi5oZWFkRW5jLGhlYWRFbmNIYXNoOmIuaGVhZEVuY0hhc2h9LFU9RXIodi5yZWFsbSk7aWYoVSE9PXZvaWQgMClOLnJlYWxtPVU7eC5wdXNoKE4pfWlmKHgubGVuZ3RoPjApYXdhaXQgaS5kb3dubG9hZHMuZW5xKHgpO2xldCBSPTA7aWYobil7bGV0IHY9YXdhaXQgaS5tZXNzYWdlcy5saXN0S2V5cygpLFY9bmV3IFNldChnLmtleXMoKSksYj1bXTtmb3IobGV0IEggb2YgdilpZighVi5oYXMoSyhIKSkpUis9MSxiLnB1c2goSCk7aWYoYi5sZW5ndGg+MClhd2FpdCBpLnVwbG9hZHMuZW5xKGEubGFiZWwsYil9ZWxzZXtsZXQgdj1hd2FpdCBpLm1lc3NhZ2VzLmxpc3RLZXlzKCksVj1uZXcgU2V0KGcua2V5cygpKTtmb3IobGV0IGIgb2YgdilpZighVi5oYXMoSyhiKSkpUis9MX1yZXR1cm4gZih7bXNnY2hlY2s6TCxudW1CYWdzOlMsdW5pcXVlTXNnczpULG51bUR1cGVzOkUsbWlzc2luZ0xvY2FsOkMsbWlzc2luZ0hvc3Q6Un0pfWZ1bmN0aW9uIEdjKGUpe3JldHVybiBlLm1hcCgoe2hlYWQ6dCxib2R5OnJ9KT0+KHsuLi50LGJvZDpyfSkpfWNsYXNzIFlue2Nsb2NrO3N0YXRlO3N0b3JlO3RyYW5zcG9ydDtjcnlwdG87Zm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ7b25TY2hlZHVsZVN5bmM7Y29ubmVjdGlvbnM9bmV3IE1hcDsjZTthcHBseUNoYWluPVByb21pc2UucmVzb2x2ZSgpO3N5bmNSdW5zPW5ldyB2cjtjbGllbnRTdGF0ZTt4ZmVyU3RhdGU7bWF4UHVzaEJ5dGVzO21heFB1bGxCeXRlcztwZWVrUHJvZ3Jlc3NFdmVyeT1RdDtsYXN0UHJvZ3Jlc3M9Tm47c2NoZWR1bGVkU3luYztjb25zdHJ1Y3RvcihlLHQscixuLHMsaT0hMCxvPWpuLGE9WG4sdSl7dGhpcy5jbG9jaz1lO3RoaXMuc3RhdGU9dDt0aGlzLnN0b3JlPXI7dGhpcy50cmFuc3BvcnQ9bjt0aGlzLmNyeXB0bz1zO3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ9aTt0aGlzLm9uU2NoZWR1bGVTeW5jPXU7dGhpcy5tYXhQdXNoQnl0ZXM9byx0aGlzLm1heFB1bGxCeXRlcz1hLHRoaXMuY2xpZW50U3RhdGU9bmV3IEplKCgpPT50aGlzLmdldENsaWVudFN0YXRlKCkpLHRoaXMueGZlclN0YXRlPW5ldyBKZSgoKT0+dGhpcy5nZXRYZmVyU3RhdGUoKSksdGhpcy5zY2hlZHVsZWRTeW5jPW5ldyBfbihvbyxhc3luYygpPT57dHJ5e2NvbnNvbGUuaW5mbygiUnVubmluZyBzY2hlZHVsZWQgc3luYyIpLGF3YWl0IHRoaXMuc3luYygpfWNhdGNoKGQpe2NvbnNvbGUuZXJyb3IoIkRlYm91bmNlZCBzeW5jIGZhaWxlZDoiLGQpfX0pfWVtaXRQcm9ncmVzcz0oZSk9Pnt0aGlzLmxhc3RQcm9ncmVzcz1lLHRoaXMueGZlclN0YXRlLmVtaXQoKX07c2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy4jZX1hc3luYyBzZXRTZWVkKGUsdCl7bGV0W3Isbl09emUodD8ubGFiZWwpO2lmKG4hPT0wfHxyPT09dm9pZCAwKXJldHVybiAxMDtsZXRbLHNdPWF3YWl0IHRoaXMuc3RvcmUuYWNjb3VudC5zYXZlKGUsdCk7aWYocyE9PTApcmV0dXJuIHM7bGV0IGk9YXdhaXQgdGhpcy4jaShyLGUpO2lmKGkhPT0wKXJldHVybiBpO3JldHVybiB0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSwwfWFzeW5jIGFkb3B0KGUsdD0iIil7bGV0IHI9YXdhaXQgdGhpcy4jaSh0LGUpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSwwfSN0KCl7cmV0dXJuIHRoaXMuI2U/LmVuY2xhdmV9YXN5bmMjcygpe3JldHVybiBBcnJheS5mcm9tKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMubGlzdCgpKX1hc3luYyNuKCl7aWYodGhpcy4jZT09PXZvaWQgMClyZXR1cm47dGhpcy4jZS5ob3N0cz1hd2FpdCB0aGlzLiNzKCl9YXN5bmMjcigpe2lmKHRoaXMuI2U9PT12b2lkIDApcmV0dXJuO3RoaXMuI2UucmVhbG1zPWF3YWl0IHRoaXMuc3RvcmUucmVhbG1zLmxpc3QoKX1hc3luYyNpKGUsdCl7bGV0IHI9YXdhaXQgdGhpcy5zdG9yZS5iaW5kKGUpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLiNlPXtsYWJlbDplLGVuY2xhdmU6dCxob3N0czphd2FpdCB0aGlzLiNzKCkscmVhbG1zOmF3YWl0IHRoaXMuc3RvcmUucmVhbG1zLmxpc3QoKX0sMH1hc3luYyBnZXRDbGllbnRTdGF0ZSgpe2xldHtzdG9yZTplLGNvbm5lY3Rpb25zOnR9PXRoaXMscj10aGlzLiN0KCksbj1hd2FpdCBlLmhvc3RzLmxpc3QoKSxzPSExO2ZvcihsZXQgaSBvZiB0LnZhbHVlcygpKWlmKGkuaXNDb25uZWN0ZWQoKSl7cz0hMDticmVha31yZXR1cm57aGFzU2VlZDpyIT09dm9pZCAwLGhhc0hvc3Q6QXJyYXkuZnJvbShuKS5sZW5ndGg+MCxjb25uZWN0ZWQ6c319YXN5bmMgZ2V0WGZlclN0YXRlKCl7bGV0e3VwbG9hZHM6ZSxkb3dubG9hZHM6dH09dGhpcy5zdG9yZSxyPWF3YWl0IGUuY291bnQoKTtyZXR1cm57bnVtRG93bmxvYWRzOmF3YWl0IHQuY291bnQoKSxudW1VcGxvYWRzOnIscHJvZ3Jlc3M6dGhpcy5sYXN0UHJvZ3Jlc3N9fWFwcGx5PShlLHQpPT57WCgiYXBwbHkga2ljayIse246ZS5sZW5ndGh9KTtsZXQgcj10aGlzLnN0YXRlLmFwcGx5KEdjKGUpKTtyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseShlLHQscikpfTthc3luYyBkb0FwcGx5KGUsdD17ZW5xdWV1ZVVwbG9hZDohMCx0cmlnZ2VyVXBsb2FkOiEwfSxyKXtsZXQgbj1bXSxzPVtdO2ZvcihsZXR7aGVhZDpvLGJvZHk6YX1vZiBlKXtsZXQgdT1uZXcgRjt1LndyaXRlU3RydWN0KHdlLG8pO2xldCBkPXUucmVzdWx0KCksbD1hd2FpdCB0aGlzLmNyeXB0by5ibGFrZTMoZCkscD17ZWlkOm8uZWlkLGJvZHk6YSxhcGxkOnh0fTtpZihvLm9mZiE9PTApcC5vZmY9by5vZmY7aWYoby5jdHIhPT0wKXAuY3RyPW8uY3RyO2lmKG8udHlwKXAudHlwPW8udHlwO24ucHVzaChsKSxzLnB1c2goe2tleTpsLGRhdGE6cH0pfVgoImRvQXBwbHkgYXJjaGl2ZSBzdGFydCIpLGF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMuYWRkKHMpLFgoImRvQXBwbHkgYXJjaGl2ZSBkb25lIiksYXdhaXQgYm8odGhpcy5zdG9yZSxuLHRoaXMuY3J5cHRvKSxYKCJkb0FwcGx5IGF3YWl0IHBlcnNpc3QiKTtsZXQgaT1hd2FpdCByO2lmKFgoImRvQXBwbHkgcGVyc2lzdCBkb25lIiksYXdhaXQgdGhpcy5tYXJrQXBwbHlTdGF0cyhuLGkpLHQuZW5xdWV1ZVVwbG9hZCl7bGV0IG89W107Zm9yKGxldCBhPTA7YTxuLmxlbmd0aDthKyspe2xldCB1PWlbYV07aWYodT09PTB8fHU9PT0xNSlvLnB1c2goblthXSl9aWYoby5sZW5ndGg+MCl7bGV0IGE9YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5saXN0KCk7Zm9yKGxldCB1IG9mIGEpYXdhaXQgdGhpcy5zdG9yZS51cGxvYWRzLmVucSh1LmxhYmVsLG8pO3RoaXMueGZlclN0YXRlLmVtaXQoKX19aWYodC50cmlnZ2VyVXBsb2FkKXRoaXMuc2NoZWR1bGVTeW5jKCk7cmV0dXJuIGl9ZW5xdWV1ZUFwcGx5Sm9iKGUpe2xldCB0PXRoaXMuYXBwbHlDaGFpbi50aGVuKGUsZSk7cmV0dXJuIHRoaXMuYXBwbHlDaGFpbj10LnRoZW4oKCk9PntyZXR1cm59LCgpPT57cmV0dXJufSksdH1kcmFpbkFwcGx5UXVldWUoKXtyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9EcmFpbkFwcGx5UXVldWUoKSl9YXN5bmMgZG9EcmFpbkFwcGx5UXVldWUoKXtsZXQgZT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3Qoe2FwbGQ6eHR9KTtpZihlLmxlbmd0aDwxKXJldHVybltdO2xldCB0PUl0KGUsKHIpPT5yLmhlYWQpO3JldHVybiB0aGlzLmFwcGx5U3RvcmVkKHQpfWFwcGx5SGFzaGVzPShlKT0+dGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseUhhc2hlcyhlKSk7YXN5bmMgZG9BcHBseUhhc2hlcyhlKXtsZXQgdD1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IGk9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5nZXQocyk7aWYoaSl0LnB1c2goaSl9bGV0IHI9YXdhaXQgdGhpcy5hcHBseVN0b3JlZCh0KSxuPW5ldyBNYXA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspbi5zZXQoSyh0W3NdLmhhc2gpLHJbc10/PzEyKTtyZXR1cm4gZS5tYXAoKHMpPT5uLmdldChLKHMpKT8/MTMpfWFzeW5jIGFwcGx5U3RvcmVkKGUpe2lmKGUubGVuZ3RoPDEpcmV0dXJuW107bGV0IHQ9ZS5tYXAoKG4pPT4oey4uLm4uaGVhZCxib2Q6bi5ib2R5fSkpLHI9YXdhaXQgdGhpcy5zdGF0ZS5hcHBseSh0KTtyZXR1cm4gYXdhaXQgdGhpcy5tYXJrQXBwbHlTdGF0cyhlLm1hcCgobik9Pm4uaGFzaCkscikscn1hc3luYyBtYXJrQXBwbHlTdGF0cyhlLHQpe2xldCByPVtdLG49W107Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2xldCBpPXRbc107aWYoaT09PTB8fGk9PT0xNSlyLnB1c2goZVtzXSk7ZWxzZSBpZihpIT09dm9pZCAwJiZobyhpKSluLnB1c2goe2tleTplW3NdLGVycjppfSl9aWYoci5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtBcHBsaWVkKHIpO2lmKG4ubGVuZ3RoPjApYXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5tYXJrRmFpbGVkKG4pfWFzeW5jIGluc2VydFJhdyhlLHQ9IiIpe1goImluc2VydFJhdyIpO2xldHtjbG9jazpyLGNyeXB0bzpufT10aGlzLHM9ci5ub3coKSxbaSxvXT1hd2FpdCBybyh7bm93OnMsYm9kOmUsdHlwOnQsY3J5cHRvOm59KTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXQgdT0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6aSxib2R5OmV9XSkpWzBdO2lmKHUhPT0wJiZ1IT09MTUpcmV0dXJuIGModT8/MTIpO3JldHVybiBmKGkpfWFzeW5jIG1ha2VVcGRhdGUoZSx0LHI9IiIpe2xldHtjbG9jazpuLGNyeXB0bzpzfT10aGlzLGk9bi5ub3coKTtpZihlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+aS5nZXRUaW1lKCkpcmV0dXJuIGMoNCk7bGV0IG89ZS5jdHIrMSxbYSx1XT1hd2FpdCBrcih7bm93OmksZWlkOmUuZWlkLGN0cjpvLHR5cDpyLGJvZDp0LGNyeXB0bzpzfSk7aWYodSE9PTApcmV0dXJuIGModSk7cmV0dXJuIGYoe2hlYWQ6YSxib2R5OnR9KX1hc3luYyB1cGRhdGVXaXRoU2tldyhlLHQscixuPSIiKXtpZihyPT09ITEpcmV0dXJuIGMoNCk7bGV0e2Nsb2NrOnMsY3J5cHRvOml9PXRoaXMsbz1zLm5vdygpLGE9bmV3IFcoZS5laWQpLFt1LGRdPWEucmVhZFN0cnVjdChtZSk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0IGw9ZS51cGRhdGVkQXQuZ2V0VGltZSgpLXUudHMuZ2V0VGltZSgpLHA9e2VpZDplLmVpZCxvZmY6bCsxLGN0cjplLmN0cisxLHR5cDoiIixsZW46MH0seT0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6cCxib2R5OnZvaWQgMH1dKSlbMF07aWYoeSE9PTAmJnkhPT0xNSlyZXR1cm4gYyh5Pz8xMik7aWYodD09PXZvaWQgMClyZXR1cm4gZihwKTtsZXRbbSxnXT1jcih7aWQ6dS5pZCx0czpvfSk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0W1MsSV09YXdhaXQga3Ioe25vdzpvLGVpZDptLGN0cjowLHR5cDpuLGJvZDp0LGNyeXB0bzppfSk7aWYoSSE9PTApcmV0dXJuIGMoSSk7bGV0IEE9KGF3YWl0IHRoaXMuYXBwbHkoW3toZWFkOlMsYm9keTp0fV0pKVswXTtpZihBIT09MCYmQSE9PTE1KXJldHVybiBjKEE/PzEyKTtyZXR1cm4gZihTKX1hc3luYyB1cGRhdGVSYXcoZSx0LHI9dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdCxuPSIiKXtpZihYKCJ1cGRhdGVSYXciKSxlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+dGhpcy5jbG9jay5ub3coKS5nZXRUaW1lKCkpcmV0dXJuIHRoaXMudXBkYXRlV2l0aFNrZXcoZSx0LHIsbik7bGV0W3MsaV09YXdhaXQgdGhpcy5tYWtlVXBkYXRlKGUsdCxuKTtpZihpIT09MClyZXR1cm4gYyhpKTtsZXQgYT0oYXdhaXQgdGhpcy5hcHBseShbc10pKVswXTtpZihhIT09MCYmYSE9PTE1KXJldHVybiBjKGE/PzEyKTtyZXR1cm4gZihzLmhlYWQpfWFzeW5jIGluc2VydChlKXtsZXR7Ym9keTp0LHR5cGU6cixwaWQ6bix0YWdzOnN9PWUsaT17Ym9keTp0fTtpZihuIT09dm9pZCAwKWkucGlkPW47aWYocyE9PXZvaWQgMClpLnRhZ3M9cztsZXQgbz1ZZShpKTtyZXR1cm4gdGhpcy5pbnNlcnRSYXcobyxyKX1hc3luYyB1cGRhdGUoZSl7bGV0e3ByaW9yOnQsYm9keTpyLHR5cGU6bixwaWQ6cyx0YWdzOmksZm9yY2U6b309ZSxhPXtib2R5OnJ9O2lmKHMhPT12b2lkIDApYS5waWQ9cztpZihpIT09dm9pZCAwKWEudGFncz1pO2xldCB1PVllKGEpO3JldHVybiB0aGlzLnVwZGF0ZVJhdyh0LHUsbz8/dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdCxuKX1hc3luYyBkZWxldGUoZSl7bGV0IHQ9ZS5mb3JjZT8/ITA7aWYoInByaW9yImluIGUpcmV0dXJuIHRoaXMudXBkYXRlUmF3KGUucHJpb3Isdm9pZCAwLHQpO2xldFtyLG5dPWF3YWl0IHRoaXMucmV2RnJvbUFyY2hpdmUoZS5laWQpO2lmKG4hPT0wKXJldHVybiBjKG4pO3JldHVybiB0aGlzLnVwZGF0ZVJhdyhyLHZvaWQgMCx0KX1hc3luYyByZXZGcm9tQXJjaGl2ZShlKXtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxhc3QoZSk7aWYodClyZXR1cm4gaW8odC5oZWFkKTtsZXQgcj1uZXcgVyhlKSxbbixzXT1yLnJlYWRTdHJ1Y3QobWUpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHtlaWQ6ZSxjdHI6LTEsdXBkYXRlZEF0Om4udHN9KX1hc3luYyBnZW5FSUQoZSl7bGV0e2Nsb2NrOnQsY3J5cHRvOnJ9PXRoaXMsbj10Lm5vdygpO2lmKGUhPT12b2lkIDApcmV0dXJuIGNyKHtpZDplLHRzOm59KTtsZXQgcz1hd2FpdCByLmdlblJhbmRvbUJ5dGVzKDgpO3JldHVybiBjcih7aWQ6cyx0czpufSl9c3luYygpe3JldHVybiB0aGlzLnN5bmNSdW5zLnJ1bigoKT0+dGhpcy5kb1N5bmMoKSl9YXN5bmMgZG9TeW5jKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPXRoaXMuI3QoKTtpZighbilyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKSxhd2FpdCB0aGlzLiNyKCk7bGV0IHM9Z3QodGhpcy4jZT8ucmVhbG1zPz9bXSk7Zm9yKGxldFtpLG9db2YgZSl7bGV0IGE9YXdhaXQgci5ob3N0cy5nZXQoaSk7aWYoIWEpY29udGludWU7bGV0IHU9e2Nvbm46byxzdG9yZTpyLGVuY2xhdmU6bixob3N0OmEsY3J5cHRvOnQsbWF4UHVzaEJ5dGVzOnRoaXMubWF4UHVzaEJ5dGVzLG1heFB1bGxCeXRlczp0aGlzLm1heFB1bGxCeXRlcyxvblByb2dyZXNzOnRoaXMuZW1pdFByb2dyZXNzLHBlZWtQcm9ncmVzc0V2ZXJ5OnRoaXMucGVla1Byb2dyZXNzRXZlcnl9O2ZvcihsZXQgcCBvZiBzKXtsZXQgaD1hd2FpdCAkbih7Li4udSxyZWFsbTpwfSk7aWYoaCE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwZWVrOiAke2h9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLGg7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfWxldCBkPWF3YWl0IElvKHUpO2lmKGQhPT0wKXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVzaDogJHtkfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxkO3RoaXMueGZlclN0YXRlLmVtaXQoKTtsZXQgbD1hd2FpdCBHbih1LGFzeW5jKCk9Pnthd2FpdCB0aGlzLmRyYWluQXBwbHlRdWV1ZSgpfSk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlYnVpbGQoZSl7aWYodGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKSxlPy5jaGVja0hvc3Q/PyEwKXtsZXQgcj1hd2FpdCB0aGlzLnJlcHVsbCgpO2lmKHIhPT0wKXJldHVybiByfXJldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5yZXBsYXkoKSl9YXN5bmMgbXNnY2hlY2soKXtsZXQgZT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3RLZXlzKCk7cmV0dXJuIGp0KGUsdGhpcy5jcnlwdG8pfWxpc3RNc2dzKGUpe3JldHVybiB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoZSl9Y291bnRNc2dzKGUpe3JldHVybiB0aGlzLnN0b3JlLm1lc3NhZ2VzLmNvdW50KGUpfWFzeW5jIHJlY29uY2lsZShlLHQpe3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e2Nvbm5lY3Rpb25zOnIsY3J5cHRvOm4sc3RvcmU6c309dGhpcyxpPXRoaXMuI3QoKTtpZighaSlyZXR1cm4gYygyMik7bGV0IG89YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIW8pcmV0dXJuIGMoMTMpO2xldCBhPXIuZ2V0KGUpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QobywhMSwhMSksbz1hd2FpdCBzLmhvc3RzLmdldChlKSwhbylyZXR1cm4gYygxMyk7YT1yLmdldChlKX1pZighYSlyZXR1cm4gYygxMik7bGV0IHU9e2Nvbm46YSxzdG9yZTpzLGVuY2xhdmU6aSxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW2QsbF09YXdhaXQgUW4oey4uLnUsaG9zdDpvfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCksbCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxjKGwpO2lmKCFkKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYygxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZihkKTtsZXQgcD1hd2FpdCB0aGlzLnN5bmMoKTtpZihwIT09MClyZXR1cm4gYyhwKTtsZXQgaD1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighaClyZXR1cm4gYygxMyk7bGV0W3ksbV09YXdhaXQgUW4oey4uLnUsaG9zdDpofSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxtIT09MClyZXR1cm4gYyhtKTtpZigheSlyZXR1cm4gYygxMik7cmV0dXJuIGYoeSl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPXRoaXMuI3QoKTtpZighbilyZXR1cm4gMjI7bGV0IHM9QXJyYXkuZnJvbShhd2FpdCByLmhvc3RzLmxpc3QoKSk7aWYocy5sZW5ndGg8MSlyZXR1cm4gMDthd2FpdCB0aGlzLiNyKCk7bGV0IGk9Z3QodGhpcy4jZT8ucmVhbG1zPz9bXSk7Zm9yKGxldCBvIG9mIHMpe2xldCBhPWUuZ2V0KG8ubGFiZWwpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKWF3YWl0IHRoaXMuY29ubmVjdFRvSG9zdChvLCExLCExKX1mb3IobGV0W28sYV1vZiBlKXtsZXQgdT1hd2FpdCByLmhvc3RzLmdldChvKTtpZighdSljb250aW51ZTtsZXQgZD17Y29ubjphLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6ey4uLnUsbGFzdFNlcTowLHNlcXM6dm9pZCAwfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX07Zm9yKGxldCBwIG9mIGkpe2xldCBoPWF3YWl0ICRuKHsuLi5kLHJlYWxtOnB9KTtpZihoIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7aH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksaDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9bGV0IGw9YXdhaXQgR24oZCk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPUl0KHQsKGkpPT5pLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBpPTAsbz0wLGE9cztmb3IobGV0IGQ9cztkPHIubGVuZ3RoJiZvPDEwMCYmaTwxMDI0MDA7ZCsrKWkrPXJbZF0uaGVhZC5sZW4sbysrLGE9ZCsxO2xldCB1PXIuc2xpY2UocyxhKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKHUpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTphLHRvdGFsOm59KSxzPWF9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOml9PXRoaXM7aWYobilhd2FpdCBpLmhvc3RzLndpcGUoKSxhd2FpdCBpLnVwbG9hZHMud2lwZSgpLGF3YWl0IGkuZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IGkubWVzc2FnZXMud2lwZSgpO2lmKHIpYXdhaXQgdGhpcy5zdGF0ZS5jbGVhcigpO2lmKHMpYXdhaXQgaS5hY2NvdW50LndpcGUoKSxhd2FpdCBpLnJlYWxtcy53aXBlKCksdGhpcy4jZT12b2lkIDA7ZWxzZSBpZihuKWF3YWl0IHRoaXMuI24oKSxhd2FpdCB0aGlzLiNyKCk7dGhpcy5sYXN0UHJvZ3Jlc3M9Tm4sdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksdGhpcy54ZmVyU3RhdGUuZW1pdCgpfWltcG9ydD1hc3luYyhlLHQpPT57bGV0e2NyeXB0bzpyfT10aGlzLG49dD8ub25Qcm9ncmVzcyxzPXRoaXMuI3QoKTtpZighcylyZXR1cm4gMjI7Y29uc29sZS50aW1lKCJpbXBvcnQ6IGRlY29kaW5nIGZpbGUuLi4iKTtsZXQgaT1hd2FpdCBlLmJ5dGVzKCksW28sYV09YXdhaXQgUHIuZGVjb2RlRmlsZShpLHIscyk7aWYoYSE9PTApcmV0dXJuIGE7Y29uc29sZS50aW1lRW5kKCJpbXBvcnQ6IGRlY29kaW5nIGZpbGUuLi4iKTtsZXQgdT0wO3doaWxlKHU8by5sZW5ndGgpe2xldCBkPTAsbD0wLHA9dTtmb3IobGV0IG09dTttPG8ubGVuZ3RoJiZsPDEwMCYmZDwxMDI0MDA7bSsrKWQrPW9bbV0uaGVhZC5sZW4sbCsrLHA9bSsxO2xldCBoPW8uc2xpY2UodSxwKTtjb25zb2xlLnRpbWUoYGltcG9ydDogYXBwbHlpbmcgWyR7dX0sICR7cH1dYCk7bGV0IHk9YXdhaXQgdGhpcy5hcHBseShoLHtlbnF1ZXVlVXBsb2FkOiEwLHRyaWdnZXJVcGxvYWQ6ITF9KTtjb25zb2xlLnRpbWVFbmQoYGltcG9ydDogYXBwbHlpbmcgWyR7dX0sICR7cH1dYCk7Zm9yKGxldCBtPTA7bTxoLmxlbmd0aDttKyspe2xldCBnPXlbbV07aWYoZyE9PTAmJmchPT0xNSljb25zb2xlLndhcm4oYGZhaWxlZCB0byBpbXBvcnQgbXNnICR7dSttfTogJHtQW2ddfWApfWlmKG4pcXVldWVNaWNyb3Rhc2soKCk9Pm4ocCxvLmxlbmd0aCwwKSk7dGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpbXBvcnQiLGRvbmU6cCx0b3RhbDpvLmxlbmd0aH0pLHU9cH1yZXR1cm4gdGhpcy5zY2hlZHVsZVN5bmMoKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMH07c2NoZWR1bGVTeW5jPSgpPT57aWYodGhpcy5vblNjaGVkdWxlU3luYyl7dGhpcy5vblNjaGVkdWxlU3luYygpO3JldHVybn10aGlzLnNjaGVkdWxlZFN5bmMuc2NoZWR1bGUoKX07YXN5bmMgZXhwb3J0Qnl0ZXMoKXtsZXR7Y3J5cHRvOmUsc3RvcmU6dH09dGhpcyxyPXRoaXMuI3QoKTtpZighcilyZXR1cm4gYygyMik7bGV0IG49YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIFByLmVuY29kZUZpbGUoImV4cG9ydCIsMCxuLGUscil9YXN5bmMgZXhwb3J0KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihyIT09MClyZXR1cm4gcjtpZighdClyZXR1cm4gMTI7bGV0IG49bmV3IEJsb2IoW3Quc2xpY2UoKV0pO3JldHVybiBsbyhuLGUpLDB9YXN5bmMgbGluayhlLHQ9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKGUpLGF3YWl0IHRoaXMuI24oKSxhd2FpdCB0aGlzLiNyKCksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksdCl7bGV0IHI9YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5nZXQoZS5sYWJlbCk7aWYocilhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3Qocil9fWFzeW5jIHVubGluayhlKXthd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmRlbChlKSxhd2FpdCB0aGlzLiNuKCksYXdhaXQgdGhpcy4jcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfWFzeW5jIGhvc3RzKCl7cmV0dXJuIEFycmF5LmZyb20oYXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5saXN0KCkpfWNvbm5lY3RUb0hvc3Q9YXN5bmMoZSx0PSEwLHI9ITApPT57bGV0e2Nsb2NrOm4sY29ubmVjdGlvbnM6cyxjcnlwdG86aSxzdG9yZTpvLHRyYW5zcG9ydDphfT10aGlzLHU9cy5nZXQoZS5sYWJlbCk7aWYodSl7aWYodS5pc0Nvbm5lY3RlZCgpKXJldHVybjt0cnl7dS5jbG9zZUxpc3RlbmVyKCl9Y2F0Y2h7fXMuZGVsZXRlKGUubGFiZWwpfWxldCBkPXRoaXMuI3QoKTtpZighZClyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7ZS5oYW5kbGV9ICgke2UubGFiZWx9KWApO2xldCBsPW5ldyB3cihkLGksZSxuLGEoZSksYXN5bmMocCk9PntsZXQgaD1hd2FpdCBvLmhvc3RzLnNldChlLmxhYmVsLHApO3JldHVybiBhd2FpdCB0aGlzLiNuKCksYXdhaXQgdGhpcy4jcigpLGh9KTtpZihhd2FpdCBsLnJlZ2lzdGVyKCksdClhd2FpdCBsLmxpc3Rlbihhc3luYyhwKT0+e2xldCBoPXtjb25uOmwsc3RvcmU6byxlbmNsYXZlOmQsaG9zdDplLGNyeXB0bzppLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4geG8ocCxoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoZT0hMCx0PSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpyLHNjaGVkdWxlU3luYzpuLHN0b3JlOnN9PXRoaXM7aWYoIXRoaXMuI3QoKSlyZXR1cm47YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKTtsZXQgbz1hd2FpdCBzLmhvc3RzLmxpc3QoKTtmb3IobGV0IGEgb2Ygbylhd2FpdCByKGEsZSwhMSk7aWYodCluKCl9ZGlzY29ubmVjdD1hc3luYygpPT57Zm9yKGxldCBlIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpdHJ5e2UuY2xvc2VMaXN0ZW5lcigpfWNhdGNoe310aGlzLmNvbm5lY3Rpb25zLmNsZWFyKCksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9fXF0KCk7dmFyIEV0PUhpO2NlKCk7QigpO00oKTtjZSgpO0IoKTtZdCgpO00oKTtZdCgpO2ZlKCk7QigpO2NlKCk7WHQoKTtNKCk7dXMoKTtEdCgpO3ZhciBtdT04O2NsYXNzIFFyeyNlOyN0OyNzOyNuOyNyOyNpOyNvO2NvbnN0cnVjdG9yKGUpe3RoaXMuI3I9ZS5wZXJzaXN0S2V5cmluZyx0aGlzLiNzPXtycElkOmUucnBJZCxycE5hbWU6ZS5ycE5hbWV9LHRoaXMuI249ZS51c2VyTmFtZT8/ZS5ycElkPz9lLnJwTmFtZT8/SnQsdGhpcy4jaT1lLnVubG9ja0FjY291bnR9c3RhdGljIG9wZW4oZSl7bGV0IHQ9bmV3IFFyKGUpO2lmKGUua2V5cmluZz09PXZvaWQgMClyZXR1cm4gZih0KTtsZXRbcixuXT1adChlLmtleXJpbmcpO2lmKG4hPT0wKXJldHVybiBjKG4pO3JldHVybiB0LiN0PXIsZih0KX1nZXQga2V5cmluZygpe2lmKHRoaXMuI3Q9PT12b2lkIDApcmV0dXJuO2xldFtlLHRdPVp0KHRoaXMuI3QpO2lmKHQhPT0wKXJldHVybjtyZXR1cm4gZX1saXN0KCl7aWYodGhpcy4jdD09PXZvaWQgMClyZXR1cm5bXTtyZXR1cm4gdGhpcy4jdC5lbnRyaWVzLm1hcChJdSl9YXN5bmMgc2F2ZShlLHQpe2xldCByPXRoaXMuI2UhPT12b2lkIDB8fHRoaXMuI3QhPT12b2lkIDAmJnRoaXMuI3QuZW50cmllcy5sZW5ndGg+MCxbbixzXT1lbyh0aGlzLiNvLHQ/LmxhYmVsLHIpO2lmKHMhPT0wfHxuPT09dm9pZCAwKXJldHVybiBjKDEwKTtpZih0Py5wZXJzaXN0PT09ITApcmV0dXJuIGMoMTApO3JldHVybiB0aGlzLiNvPW4sdGhpcy4jZT1lLGYodGhpcy4jZSl9YXN5bmMgYmluZEFuZFNhdmUoZSx0KXtsZXQgcj10aGlzLiN0LG49dD8uY3JlZElkLHM9biBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/bi5ieXRlTGVuZ3RoPjA6biE9PXZvaWQgMCYmbi5sZW5ndGg+MDtpZighcyYmciE9PXZvaWQgMCYmci5lbnRyaWVzLmxlbmd0aD49bXUpcmV0dXJuIGMoMjYpO2xldCBpPXRhKHQ/Lm5pY2spLG89dD8uZXhjbHVkZUNyZWRlbnRpYWxzPz8ocz92b2lkIDA6d3UocikpLGE9dD8uc2FsdD8/cj8uc2FsdCx1PXI9PT12b2lkIDA/dm9pZCAwOnIuZW50cmllcy5tYXAoKEkpPT4oe2NyZWRJZDpJLmNyZWRJZCx0YWc6SS50YWd9KSksW2QsbF09YXdhaXQgZS5iaW5kKHsuLi50aGlzLiNzLHNhbHQ6YSxjcmVkSWQ6bixjcmVhdGVDcmVkSWZOZWVkZWQ6dD8uY3JlYXRlQ3JlZElmTmVlZGVkPz8hcyxleGNsdWRlQ3JlZGVudGlhbHM6byx1c2VyTmFtZTp0aGlzLiNuLGRpc3BsYXlOYW1lOmk/P3RoaXMuI3MucnBOYW1lPz90aGlzLiNuLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OnQ/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50LGhpbnRzOnQ/LmhpbnRzfSx1KTtpZihsIT09MClyZXR1cm4gYyhsKTtsZXQgcD1EYXRlLm5vdygpLGg9e3R5cGU6InByZiIsc2VhbGVkTWFzdGVyOmQuc2VhbGVkTWFzdGVyLGNyZWRJZDpkLmNyZWRJZCx0YWc6ZC50YWcsdXNlcklkOmQudXNlcklkLG5pY2s6aSxlbnJvbGxlZEF0OnAsbGFzdFVzZWRBdDpwLGF0dGFjaG1lbnQ6ZC5hdHRhY2htZW50LHRyYW5zcG9ydHM6ZC50cmFuc3BvcnRzLGFhZ3VpZDpkLmFhZ3VpZCxlbnJvbGxlZE9zOmd1KCl9LHk9cj09PXZvaWQgMD97c2FsdDpkLnNhbHQuc2xpY2UoKSxlbnRyaWVzOltdfTpyLFttLGddPXh1KHksaCk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0IFM9YXdhaXQgdGhpcy4jcihtKTtpZihTIT09MClyZXR1cm4gYyhTKTtyZXR1cm4gdGhpcy4jdD1tLHRoaXMuI2U9ZSxmKHRoaXMuI2UpfWFzeW5jIGxvYWQoKXtyZXR1cm4gdGhpcy4jZX1hc3luYyB1bmxvY2soKXtsZXQgZT10aGlzLiNpO2lmKGUhPT12b2lkIDApe2xldFtvLGFdPWF3YWl0IGUoKTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDEzKTtpZihvLmtleXJpbmc9PT12b2lkIDApdGhpcy4jdD12b2lkIDA7ZWxzZXtsZXRbdSxkXT1adChvLmtleXJpbmcpO2lmKGQhPT0wKXJldHVybiBjKGQpO3RoaXMuI3Q9dX1yZXR1cm4gdGhpcy4jZT1vLmVuY2xhdmUsZihvLmVuY2xhdmUpfWxldCB0PXRoaXMuI3Q7aWYodD09PXZvaWQgMHx8dC5lbnRyaWVzLmxlbmd0aD09PTApcmV0dXJuIGMoMjIpO2xldFtyLG5dPWF3YWl0IGllLnVuc2VhbFdpdGhQYXNza2V5KHQuZW50cmllcy5tYXAoKG8pPT4oe3NlYWxlZE1hc3RlcjpvLnNlYWxlZE1hc3RlcixjcmVkSWQ6by5jcmVkSWR9KSksey4uLnRoaXMuI3Msc2FsdDp0LnNhbHR9KTtpZihuIT09MClyZXR1cm4gYyhuKTt0aGlzLiNlPXIuZW5jbGF2ZTtsZXRbcyxpXT1scyh0LHIuY3JlZElkKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZihzIT09dm9pZCAwKXtsZXQgbz1hd2FpdCB0aGlzLiNyKHMpO2lmKG8hPT0wKXJldHVybiBjKG8pO3RoaXMuI3Q9c31yZXR1cm4gZihyLmVuY2xhdmUpfWFzeW5jIHJlbmFtZShlLHQpe2xldCByPXRoaXMuI3Q7aWYocj09PXZvaWQgMClyZXR1cm4gYygyMik7bGV0IG49ci5lbnRyaWVzLmZpbmRJbmRleCgobCk9PlkobC5jcmVkSWQsZSkpO2lmKG48MClyZXR1cm4gYygxMyk7bGV0W3MsaV09ZXIoci5lbnRyaWVzKTtpZihpIT09MClyZXR1cm4gYyhpKTtsZXQgbz1zW25dO2lmKG89PT12b2lkIDApcmV0dXJuIGMoMTMpO2xldCBhPXRhKHQpO3Nbbl09ey4uLm8sbmljazphfTtsZXQgdT17c2FsdDpyLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnN9LGQ9YXdhaXQgdGhpcy4jcih1KTtpZihkIT09MClyZXR1cm4gYyhkKTtyZXR1cm4gdGhpcy4jdD11LGYodm9pZCAwKX1hc3luYyByZW1vdmUoZSl7bGV0IHQ9dGhpcy4jdDtpZih0PT09dm9pZCAwKXJldHVybiBjKDIyKTtsZXQgcj10LmVudHJpZXMuZmlsdGVyKChhKT0+IVkoYS5jcmVkSWQsZSkpO2lmKHIubGVuZ3RoPT09dC5lbnRyaWVzLmxlbmd0aClyZXR1cm4gYygxMyk7aWYoci5sZW5ndGg9PT0wKXtsZXQgYT1hd2FpdCB0aGlzLiNyKHZvaWQgMCk7aWYoYSE9PTApcmV0dXJuIGMoYSk7cmV0dXJuIHRoaXMuI3Q9dm9pZCAwLGYodm9pZCAwKX1sZXRbbixzXT1lcihyKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXQgaT17c2FsdDp0LnNhbHQuc2xpY2UoKSxlbnRyaWVzOm59LG89YXdhaXQgdGhpcy4jcihpKTtpZihvIT09MClyZXR1cm4gYyhvKTtyZXR1cm4gdGhpcy4jdD1pLGYodm9pZCAwKX1hc3luYyB3aXBlKCl7dGhpcy4jZT12b2lkIDAsdGhpcy4jdD12b2lkIDAsdGhpcy4jbz12b2lkIDAsYXdhaXQgdGhpcy4jcih2b2lkIDApfX1mdW5jdGlvbiB0YShlKXtpZihlPT09dm9pZCAwKXJldHVybjtsZXQgdD1lLnRyaW0oKTtyZXR1cm4gdD09PSIiP3ZvaWQgMDp0fWZ1bmN0aW9uIGd1KCl7aWYodHlwZW9mIG5hdmlnYXRvcj4idSIpcmV0dXJuO3JldHVybiBSbyhuYXZpZ2F0b3IudXNlckFnZW50KX1mdW5jdGlvbiBTdShlKXtsZXRbdCxyXT1udChlLnNlYWxlZE1hc3Rlci5zbGljZSgpKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1GZShlLnRhZy5zbGljZSgpLHJlLkJpbmRUYWcpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp0LGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzpuLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfSl9ZnVuY3Rpb24gZXIoZSl7bGV0IHQ9W107Zm9yKGxldCByIG9mIGUpe2xldFtuLHNdPVN1KHIpO2lmKHMhPT0wKXJldHVybiBjKHMpO3QucHVzaChuKX1yZXR1cm4gZih0KX1mdW5jdGlvbiBadChlKXtsZXRbdCxyXT1lcihlLmVudHJpZXMpO2lmKHIhPT0wKXJldHVybiBjKHIpO3JldHVybiBmKHtzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6dH0pfWZ1bmN0aW9uIHJhKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiBidShlKXtpZighcmEoZSl8fGUudHlwZSE9PSJwcmYiKXJldHVybjtpZighKGUuc2VhbGVkTWFzdGVyIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEoZS5jcmVkSWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShlLnRhZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHx0eXBlb2YgZS5lbnJvbGxlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoZS5lbnJvbGxlZEF0KSlyZXR1cm47bGV0W3Qscl09bnQoZS5zZWFsZWRNYXN0ZXIpO2lmKHIhPT0wKXJldHVybjtsZXRbbixzXT1GZShlLnRhZy5zbGljZSgpLHJlLkJpbmRUYWcpO2lmKHMhPT0wKXJldHVybjtsZXQgaT1lLmF0dGFjaG1lbnQ9PT0icGxhdGZvcm0ifHxlLmF0dGFjaG1lbnQ9PT0iY3Jvc3MtcGxhdGZvcm0iP2UuYXR0YWNobWVudDp2b2lkIDAsbz1lLmVucm9sbGVkT3MsYT1vPT09ImlvcyJ8fG89PT0ibWFjb3MifHxvPT09ImFuZHJvaWQifHxvPT09IndpbmRvd3MifHxvPT09ImxpbnV4Inx8bz09PSJvdGhlciI/bzp2b2lkIDAsdT1BcnJheS5pc0FycmF5KGUudHJhbnNwb3J0cyk/ZS50cmFuc3BvcnRzLmZpbHRlcigoZCk9PnR5cGVvZiBkPT09InN0cmluZyIpOnZvaWQgMDtyZXR1cm57dHlwZToicHJmIixzZWFsZWRNYXN0ZXI6dCxjcmVkSWQ6ZS5jcmVkSWQuc2xpY2UoKSx0YWc6bix1c2VySWQ6ZS51c2VySWQgaW5zdGFuY2VvZiBVaW50OEFycmF5P2UudXNlcklkLnNsaWNlKCk6dm9pZCAwLG5pY2s6dHlwZW9mIGUubmljaz09PSJzdHJpbmciP2Uubmljazp2b2lkIDAsZW5yb2xsZWRBdDplLmVucm9sbGVkQXQsbGFzdFVzZWRBdDp0eXBlb2YgZS5sYXN0VXNlZEF0PT09Im51bWJlciImJk51bWJlci5pc0Zpbml0ZShlLmxhc3RVc2VkQXQpP2UubGFzdFVzZWRBdDp2b2lkIDAsYXR0YWNobWVudDppLHRyYW5zcG9ydHM6dT09PXZvaWQgMHx8dS5sZW5ndGg9PT0wP3ZvaWQgMDp1LGFhZ3VpZDplLmFhZ3VpZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZS5hYWd1aWQuc2xpY2UoKTp2b2lkIDAsZW5yb2xsZWRPczphfX1mdW5jdGlvbiBuYShlKXtpZighcmEoZSkpcmV0dXJuO2lmKCEoZS5zYWx0IGluc3RhbmNlb2YgVWludDhBcnJheSl8fCFBcnJheS5pc0FycmF5KGUuZW50cmllcykpcmV0dXJuO2xldCB0PVtdO2ZvcihsZXQgciBvZiBlLmVudHJpZXMpe2xldCBuPWJ1KHIpO2lmKG4hPT12b2lkIDApdC5wdXNoKG4pfWlmKHQubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczp0fX1mdW5jdGlvbiBJdShlKXtyZXR1cm57dHlwZToicHJmIixjcmVkSWQ6ZS5jcmVkSWQuc2xpY2UoKSx1c2VySWQ6ZS51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmUudXNlcklkLnNsaWNlKCksbmljazplLm5pY2ssZW5yb2xsZWRBdDplLmVucm9sbGVkQXQsbGFzdFVzZWRBdDplLmxhc3RVc2VkQXQsYXR0YWNobWVudDplLmF0dGFjaG1lbnQsdHJhbnNwb3J0czplLnRyYW5zcG9ydHM9PT12b2lkIDA/dm9pZCAwOlsuLi5lLnRyYW5zcG9ydHNdLGFhZ3VpZDplLmFhZ3VpZD09PXZvaWQgMD92b2lkIDA6ZS5hYWd1aWQuc2xpY2UoKSxlbnJvbGxlZE9zOmUuZW5yb2xsZWRPc319ZnVuY3Rpb24gd3UoZSl7aWYoZT09PXZvaWQgMClyZXR1cm5bXTtyZXR1cm4gZS5lbnRyaWVzLmZpbHRlcigodCk9PnQuY3JlZElkLmJ5dGVMZW5ndGg+MCkubWFwKCh0KT0+dC5jcmVkSWQuc2xpY2UoKSl9ZnVuY3Rpb24geHUoZSx0KXtsZXRbcixuXT1lcihlLmVudHJpZXMpO2lmKG4hPT0wKXJldHVybiBjKG4pO2xldCBzPXIuZmluZEluZGV4KChpKT0+WShpLmNyZWRJZCx0LmNyZWRJZCkpO2lmKHM+PTApe2xldCBpPXJbc107cltzXT17Li4udCxlbnJvbGxlZEF0Omk/LmVucm9sbGVkQXQ/P3QuZW5yb2xsZWRBdCxuaWNrOnQubmljaz8/aT8ubmlja319ZWxzZSByLnB1c2godCk7cmV0dXJuIGYoe3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczpyfSl9ZnVuY3Rpb24gbHMoZSx0KXtpZih0LmJ5dGVMZW5ndGg9PT0wKXJldHVybiBmKHZvaWQgMCk7bGV0IHI9ZS5lbnRyaWVzLmZpbmRJbmRleCgobyk9Plkoby5jcmVkSWQsdCkpO2lmKHI8MClyZXR1cm4gZih2b2lkIDApO2xldFtuLHNdPWVyKGUuZW50cmllcyk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0IGk9bltyXTtpZihpPT09dm9pZCAwKXJldHVybiBjKDEzKTtyZXR1cm4gbltyXT17Li4uaSxsYXN0VXNlZEF0OkRhdGUubm93KCl9LGYoe3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczpufSl9dmFyIEpTPVlyKCJmYmZjMzAwNzE1NGU0ZWNjOGMwYjZlMDIwNTU3ZDdiZCIpLFpTPVlyKCJlYTliOGQ2NjRkMDExZDIxM2NlNGI2YjQ4Y2I1NzVkNCIpLGViPVlyKCIwODk4NzA1OGNhZGM0YjgxYjZlMTMwZGU1MGRjYmU5NiIpLHRiPVlyKCIyZmMwNTc5ZjgxMTM0N2VhYjExNmJiNWE4ZGI5MjAyYSIpO2Z1bmN0aW9uIFlyKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyl0W3JdPU51bWJlci5wYXJzZUludChlLnNsaWNlKHIqMixyKjIrMiksMTYpO3JldHVybiB0fUIoKTtmZSgpO00oKTthc3luYyBmdW5jdGlvbiBzYShlLHQpe2xldFtyLG5dPWF3YWl0IGUuZmluZ2VycHJpbnQodCk7aWYobiE9PTApcmV0dXJuIGMobik7cmV0dXJuIEZlKHIuc2xpY2UoKSxyZS5GaW5nZXJwcmludCl9YXN5bmMgZnVuY3Rpb24gaWEoZSx0KXtsZXQgcj1hd2FpdCBlLmdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKSxbbixzXT1hd2FpdCBzYSh0LHIpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKHtuOnIsaDpufSl9YXN5bmMgZnVuY3Rpb24gZnMoZSx0KXtsZXRbcixuXT1hd2FpdCBzYShlLHQubik7aWYobiE9PTApcmV0dXJuITE7cmV0dXJuIEV1KHIsdC5oKX1mdW5jdGlvbiBvYShlKXtpZihlPT09dm9pZCAwfHxlPT09bnVsbHx8dHlwZW9mIGUhPT0ib2JqZWN0IilyZXR1cm47bGV0IHQ9ZTtpZighKHQubiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHwhKHQuaCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXJldHVybjtpZih0Lm4uYnl0ZUxlbmd0aDwxKXJldHVybjtsZXRbcixuXT1GZSh0Lmguc2xpY2UoKSxyZS5GaW5nZXJwcmludCk7aWYobiE9PTApcmV0dXJuO3JldHVybntuOnQubi5zbGljZSgpLGg6cn19ZnVuY3Rpb24gYWEoZSl7bGV0IHQ9ZS5uLnNsaWNlKCksW3Isbl09RmUoZS5oLnNsaWNlKCkscmUuRmluZ2VycHJpbnQpO2lmKG4hPT0wKXJldHVybntuOnQsaDplLmh9O3JldHVybntuOnQsaDpyfX1mdW5jdGlvbiBFdShlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtsZXQgcj0wO2ZvcihsZXQgbj0wO248ZS5ieXRlTGVuZ3RoO24rKylyfD1lW25dXnRbbl07cmV0dXJuIHI9PT0wfWZ1bmN0aW9uIHBzKGUpe2lmKGU9PT0iInx8dHlwZW9mIGluZGV4ZWREQj4idSIpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3JldHVybiBuZXcgUHJvbWlzZSgodCxyKT0+e2xldCBuPWluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShlKTtuLm9uc3VjY2Vzcz0oKT0+dCgpLG4ub25lcnJvcj0oKT0+cihuLmVycm9yPz9FcnJvcihgW0RJUExPTUFUSUNdIGRlbGV0ZURhdGFiYXNlIGZhaWxlZCAoJHtlfSlgKSksbi5vbmJsb2NrZWQ9KCk9Pntjb25zb2xlLndhcm4oYFtESVBMT01BVElDXSBkZWxldGVEYXRhYmFzZSBibG9ja2VkICgke2V9KWApfX0pfWZ1bmN0aW9uIGhzKGUsdCxyKXtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1pbmRleGVkREIub3BlbihlLHQpO2kub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpvLHRyYW5zYWN0aW9uOmF9PWk7aWYoYT09PW51bGwpe3MoRXJyb3IoYFtESVBMT01BVElDXSBtaXNzaW5nIHVwZ3JhZGUgdHJhbnNhY3Rpb24gKCR7ZX0pYCkpO3JldHVybn10cnl7cihvLGEpfWNhdGNoKHUpe3ModSBpbnN0YW5jZW9mIEVycm9yP3U6RXJyb3IoU3RyaW5nKHUpKSl9fSxpLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7ZX0g4oaSIHYke3R9KWApfSxpLm9uc3VjY2Vzcz0oKT0+e2xldCBvPWkucmVzdWx0O28ub252ZXJzaW9uY2hhbmdlPSgpPT57by5jbG9zZSgpfSxuKG8pfSxpLm9uZXJyb3I9KCk9PntzKGkuZXJyb3I/P0Vycm9yKGBbRElQTE9NQVRJQ10gSURCIG9wZW4gZmFpbGVkICgke2V9KWApKX19KX1jZSgpO3ZhciBjYT0ibWV0YSIsdWE9MSxkYT05O2Z1bmN0aW9uIEF1KCl7bGV0IGU9bmV3IFVpbnQ4QXJyYXkoMTYpO3JldHVybiBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZSksdHQoZSl9ZnVuY3Rpb24gUHUoZSl7cmV0dXJuYGRhdGEtJHtlfWB9ZnVuY3Rpb24ga3UoZSl7cmV0dXJuYGVudHMtJHtlfWB9ZnVuY3Rpb24geXMoZSx0KXtsZXQgcj1lIT09dm9pZCAwJiZlIT09IiI/ZTpBdSgpO2lmKHQhPT12b2lkIDAmJnQhPT0iIilyZXR1cm57YWNjdDpyLGRhdGE6dH07cmV0dXJue2FjY3Q6cixkYXRhOlB1KHIpfX1mdW5jdGlvbiBsYShlLHQpe2lmKHQhPT12b2lkIDAmJnQhPT0iIilyZXR1cm4gdDtyZXR1cm4ga3UoZSl9QigpO00oKTtjbGFzcyBtc3tkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgZW5xKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oU2UsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShTZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXQgbyBvZiB0KW4ucHV0KG8sSG4oby5ob3N0LG8uc2VxLG8ucmVhbG0pKX0pfWFzeW5jIGRlcShlLHQscil7bGV0IG49Wy4uLnRdO2lmKG4ubGVuZ3RoPT09MClyZXR1cm47bGV0IHM9dGhpcy5kYi50cmFuc2FjdGlvbihTZSwicmVhZHdyaXRlIiksaT1zLm9iamVjdFN0b3JlKFNlKTtyZXR1cm4gbmV3IFByb21pc2UoKG8sYSk9PntzLm9uY29tcGxldGU9KCk9Pm8oKSxzLm9uZXJyb3I9KCk9PmEocy5lcnJvcik7Zm9yKGxldCB1IG9mIG4paS5kZWxldGUoSG4oZSx1LHIpKX0pfWFzeW5jIGxpc3QoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKFNlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFNlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldEFsbCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyBjb3VudCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oU2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoU2UpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuY291bnQoKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oU2UsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShTZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1CKCk7ZmUoKTtmdW5jdGlvbiBncyhlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT09Im9iamVjdCJ9ZnVuY3Rpb24gU3MoZSl7aWYoIWdzKGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5ob3N0PT09InN0cmluZyImJnR5cGVvZiBlLmxhYmVsPT09InN0cmluZyImJnR5cGVvZiBlLmluZGV4PT09Im51bWJlciImJk51bWJlci5pc0ludGVnZXIoZS5pbmRleCkmJnR5cGVvZiBlLmxhc3RTZXE9PT0ibnVtYmVyIiYmTnVtYmVyLmlzSW50ZWdlcihlLmxhc3RTZXEpJiZlLmxhc3RTZXE+PTB9ZnVuY3Rpb24gRHUoZSl7bGV0IHQ9W107aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7Zm9yKGxldCByIG9mIGUpe2lmKCFTcyhyKSljb250aW51ZTt0LnB1c2goe2xhYmVsOnIubGFiZWwsaW5kZXg6ci5pbmRleCxsYXN0U2VxOnIubGFzdFNlcX0pfXJldHVybiB0fWZ1bmN0aW9uIEJ1KGUpe2xldCB0PW5ldyBNYXA7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7Zm9yKGxldCByIG9mIGUpe2lmKCFTcyhyKSljb250aW51ZTtsZXQgbj10LmdldChyLmhvc3QpPz9bXTtuLnB1c2goe2xhYmVsOnIubGFiZWwsaW5kZXg6ci5pbmRleCxsYXN0U2VxOnIubGFzdFNlcX0pLHQuc2V0KHIuaG9zdCxuKX1yZXR1cm4gdH1mdW5jdGlvbiBmYShlLHQpe2xldCByPVppKHQpLG49e2xhYmVsOmUubGFiZWwsaGFuZGxlOm5ldyBVUkwoZS5oYW5kbGUpLGlkeDplLmlkeCxsYXN0U2VxOnIubGFzdFNlcSxjbG9ja09mZnNldDplLmNsb2NrT2Zmc2V0LHN1YnNjcmlwdGlvbjplLnN1YnNjcmlwdGlvbn07aWYoci5zZXFzIT09dm9pZCAwKW4uc2Vxcz1yLnNlcXM7cmV0dXJuIG59ZnVuY3Rpb24gcGEoZSl7bGV0IHQ9e2xhYmVsOmUubGFiZWwsaGFuZGxlOmUuaGFuZGxlLnRvU3RyaW5nKCl9O2lmKGUuaWR4IT09dm9pZCAwKXQuaWR4PWUuaWR4O2lmKGUuY2xvY2tPZmZzZXQhPT12b2lkIDApdC5jbG9ja09mZnNldD1lLmNsb2NrT2Zmc2V0O2lmKGUuc3Vic2NyaXB0aW9uIT09dm9pZCAwKXQuc3Vic2NyaXB0aW9uPWUuc3Vic2NyaXB0aW9uO3JldHVybiB0fWNsYXNzIGJze2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBhZGQoZSl7bGV0IHQ9YXdhaXQgdGhpcy5nZXQoZS5sYWJlbCkscj10IT09dm9pZCAwJiZ0LmhhbmRsZS5ocmVmPT09ZS5oYW5kbGUuaHJlZiYmKHQuaWR4Pz8wKT09PShlLmlkeD8/MCksbj1wYShyJiZ0IT09dm9pZCAwP3suLi5lLGNsb2NrT2Zmc2V0OnQuY2xvY2tPZmZzZXQsc3Vic2NyaXB0aW9uOnQuc3Vic2NyaXB0aW9ufTplKSxzPXRoaXMuZGIudHJhbnNhY3Rpb24oW3VlLHBlXSwicmVhZHdyaXRlIiksaT1zLm9iamVjdFN0b3JlKHVlKSxvPXMub2JqZWN0U3RvcmUocGUpO3JldHVybiBuZXcgUHJvbWlzZSgoYSx1KT0+e2lmKHMub25jb21wbGV0ZT0oKT0+YSgpLHMub25lcnJvcj0oKT0+dShzLmVycm9yKSxyKXtpLnB1dChuKTtyZXR1cm59bGV0IGQ9by5pbmRleCgiaG9zdCIpLmdldEFsbEtleXMoZS5sYWJlbCk7ZC5vbnN1Y2Nlc3M9KCk9Pntmb3IobGV0IGwgb2YgZC5yZXN1bHQpby5kZWxldGUobCk7aS5wdXQobil9fSl9YXN5bmMgdG91Y2goZSx0LHIpe3JldHVybiB0aGlzLnJlY29yZFNlcXMoZSx7bGFzdFNlcTp0fSxyKX1hc3luYyByZWNvcmRTZXFzKGUsdCxyKXtsZXQgbj1yPz96LHM9dGhpcy5kYi50cmFuc2FjdGlvbihbdWUscGVdLCJyZWFkd3JpdGUiKSxpPXMub2JqZWN0U3RvcmUodWUpLG89cy5vYmplY3RTdG9yZShwZSksYT1bZSxuLmxhYmVsLG4uaW5kZXhdO3JldHVybiBuZXcgUHJvbWlzZSgodSxkKT0+e3Mub25jb21wbGV0ZT0oKT0+dSgpLHMub25lcnJvcj0oKT0+ZChzLmVycm9yKTtsZXQgbD1pLmdldChlKTtsLm9uc3VjY2Vzcz0oKT0+e2lmKCFsLnJlc3VsdClyZXR1cm47bGV0IHA9by5nZXQoYSk7cC5vbnN1Y2Nlc3M9KCk9PntsZXQgaD1wLnJlc3VsdCx5PVNzKGgpP2gubGFzdFNlcTowLG09SmkoeSx0KTtpZihtPT09dm9pZCAwKXJldHVybjtvLnB1dCh7aG9zdDplLGxhYmVsOm4ubGFiZWwsaW5kZXg6bi5pbmRleCxsYXN0U2VxOm19KX19fSl9YXN5bmMgZ2V0KGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oW3VlLHBlXSwicmVhZG9ubHkiKSxyPXQub2JqZWN0U3RvcmUodWUpLG49dC5vYmplY3RTdG9yZShwZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57dC5vbmVycm9yPSgpPT5pKHQuZXJyb3IpO2xldCBvLGEsdT0yLGQ9KCk9PntpZih1LT0xLHU+MClyZXR1cm47aWYoIWdzKG8pKXtzKHZvaWQgMCk7cmV0dXJufXMoZmEobyxEdShhKSkpfSxsPXIuZ2V0KGUpO2wub25zdWNjZXNzPSgpPT57bz1sLnJlc3VsdCxkKCl9O2xldCBwPW4uaW5kZXgoImhvc3QiKS5nZXRBbGwoZSk7cC5vbnN1Y2Nlc3M9KCk9PnthPXAucmVzdWx0LGQoKX19KX1hc3luYyBzZXQoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLmdldChlKTtpZighcilyZXR1cm4gMTM7dHJ5e3JldHVybiBhd2FpdCB0aGlzLnB1dChwYSh7Li4uciwuLi50fSkpLDB9Y2F0Y2h7cmV0dXJuIDE4fX1hc3luYyBkZWwoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihbdWUscGVdLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUodWUpLG49dC5vYmplY3RTdG9yZShwZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57dC5vbmNvbXBsZXRlPSgpPT5zKCksdC5vbmVycm9yPSgpPT5pKHQuZXJyb3IpLHIuZGVsZXRlKGUpO2xldCBvPW4uaW5kZXgoImhvc3QiKS5nZXRBbGxLZXlzKGUpO28ub25zdWNjZXNzPSgpPT57Zm9yKGxldCBhIG9mIG8ucmVzdWx0KW4uZGVsZXRlKGEpfX0pfWFzeW5jIGxpc3QoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKFt1ZSxwZV0sInJlYWRvbmx5IiksdD1lLm9iamVjdFN0b3JlKHVlKSxyPWUub2JqZWN0U3RvcmUocGUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2Uub25lcnJvcj0oKT0+cyhlLmVycm9yKTtsZXQgaSxvLGE9Mix1PSgpPT57aWYoYS09MSxhPjApcmV0dXJuO2xldCBwPUJ1KG8pLGg9W107aWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IHkgb2YgaSl7aWYoIWdzKHkpfHx0eXBlb2YgeS5sYWJlbCE9PSJzdHJpbmciKWNvbnRpbnVlO2gucHVzaChmYSh5LHAuZ2V0KHkubGFiZWwpPz9bXSkpfW4oaCl9LGQ9dC5nZXRBbGwoKTtkLm9uc3VjY2Vzcz0oKT0+e2k9ZC5yZXN1bHQsdSgpfTtsZXQgbD1yLmdldEFsbCgpO2wub25zdWNjZXNzPSgpPT57bz1sLnJlc3VsdCx1KCl9fSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oW3VlLHBlXSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKHVlKSxyPWUub2JqZWN0U3RvcmUocGUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2Uub25jb21wbGV0ZT0oKT0+bigpLGUub25lcnJvcj0oKT0+cyhlLmVycm9yKSx0LmNsZWFyKCksci5jbGVhcigpfSl9cHV0KGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24odWUsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZSh1ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57dC5vbmNvbXBsZXRlPSgpPT5uKCksdC5vbmVycm9yPSgpPT5zKHQuZXJyb3IpLHIucHV0KGUpfSl9fWZ1bmN0aW9uIHdzKCl7cmV0dXJuIGhzKGNhLHVhLChlKT0+e2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoRWUpKWUuY3JlYXRlT2JqZWN0U3RvcmUoRWUse2tleVBhdGg6ImxhYmVsIn0pfSl9ZnVuY3Rpb24geHMoZSl7cmV0dXJuIGhzKGUsZGEsVXUpfWZ1bmN0aW9uIFV1KGUsdCl7aWYoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh1ZSkpZS5jcmVhdGVPYmplY3RTdG9yZSh1ZSx7a2V5UGF0aDoibGFiZWwifSk7aWYoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhiZSkpZS5jcmVhdGVPYmplY3RTdG9yZShiZSx7a2V5UGF0aDpbImhvc3QiLCJoYXNoIl19KTtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNlKSllLmNyZWF0ZU9iamVjdFN0b3JlKFNlKTtsZXQgcjtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFopKXI9ZS5jcmVhdGVPYmplY3RTdG9yZShaKTtlbHNlIHI9dC5vYmplY3RTdG9yZShaKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKEJ0KSlyLmNyZWF0ZUluZGV4KEJ0LCJhcGxkIix7dW5pcXVlOiExfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhJcykpci5jcmVhdGVJbmRleChJcywicmxtIix7dW5pcXVlOiExfSk7aWYoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhBZSkpZS5jcmVhdGVPYmplY3RTdG9yZShBZSx7a2V5UGF0aDoibGFiZWwifSk7aWYoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhwZSkpZS5jcmVhdGVPYmplY3RTdG9yZShwZSx7a2V5UGF0aDpbImhvc3QiLCJsYWJlbCIsImluZGV4Il19KS5jcmVhdGVJbmRleCgiaG9zdCIsImhvc3QiLHt1bmlxdWU6ITF9KX1jZSgpO0IoKTtjbGFzcyBFc3tkYjtjcnlwdG87Y29uc3RydWN0b3IoZSx0KXt0aGlzLmRiPWU7dGhpcy5jcnlwdG89dH1hc3luYyBhZGQoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihaLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoWik7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e2lmKGUubGVuZ3RoPT09MCl7bihbXSk7cmV0dXJufWxldCBzPUFycmF5KGUubGVuZ3RoKS5maWxsKDApO3Qub25jb21wbGV0ZT0oKT0+bihzKSx0Lm9uZXJyb3I9KCk9Pntmb3IobGV0IGk9MDtpPHMubGVuZ3RoO2krKylzW2ldPTE4O24ocyl9O2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXR7a2V5Om8sZGF0YTphfT1lW2ldLHU9SyhvKSxkPXIucHV0KFRyKGEpLHUpO2Qub25lcnJvcj0obCk9PntsLnByZXZlbnREZWZhdWx0KCksc1tpXT0xOH19fSl9YXN5bmMgZGVsKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oWiwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFopO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9SyhvKTtuLmRlbGV0ZShhKX19KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihaLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFopO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPUsoZSksbz1yLmdldChpKTtvLm9uc3VjY2Vzcz1hc3luYygpPT57bGV0IGE9by5yZXN1bHQ7aWYoYSluKGF3YWl0IEhyKGUsYSx0aGlzLmNyeXB0bykpO2Vsc2Ugbih2b2lkIDApfSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBoYXMoZSl7cmV0dXJuIGF3YWl0IHRoaXMuZ2V0KGUpIT09dm9pZCAwfWFzeW5jIGxpc3QoZSl7bGV0IHQ9ZT8uYXBsZCxyPWU/LmJvZHkhPT0hMSxzPXRoaXMuZGIudHJhbnNhY3Rpb24oWiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShaKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9PntsZXQgYT1bXSx1PXQ9PT12b2lkIDA/cy5vcGVuQ3Vyc29yKCk6cy5pbmRleChCdCkub3BlbkN1cnNvcihJREJLZXlSYW5nZS5vbmx5KHQpKTt1Lm9uc3VjY2Vzcz0oZCk9PntsZXQgbD1kLnRhcmdldC5yZXN1bHQ7aWYobCl7bGV0IHA9dD09PXZvaWQgMD9sLmtleTpsLnByaW1hcnlLZXksaD1sLnZhbHVlO2EucHVzaCh7aGFzaDprZShwKSxkYXRhOmh9KSxsLmNvbnRpbnVlKCl9ZWxzZSBQcm9taXNlLmFsbChhLm1hcCgoe2hhc2g6cCxkYXRhOmh9KT0+SHIocCxoLHRoaXMuY3J5cHRvLHtib2R5OnJ9KSkpLnRoZW4oaSkuY2F0Y2gobyl9LHUub25lcnJvcj0oKT0+byh1LmVycm9yKX0pfWFzeW5jIGNvdW50KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oWiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShaKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1lPT09dm9pZCAwP3IuY291bnQoKTpyLmluZGV4KEJ0KS5jb3VudChJREJLZXlSYW5nZS5vbmx5KGUpKTtpLm9uc3VjY2Vzcz0oKT0+bihpLnJlc3VsdCksaS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgbGlzdEtleXMoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKFosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoWik7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9W10saT10Lm9wZW5LZXlDdXJzb3IoKTtpLm9uc3VjY2Vzcz0obyk9PntsZXQgYT1vLnRhcmdldC5yZXN1bHQ7aWYoYSlzLnB1c2goa2UoYS5rZXkpKSxhLmNvbnRpbnVlKCk7ZWxzZSByKHMpfSxpLm9uZXJyb3I9KCk9Pm4oaS5lcnJvcil9KX1hc3luYyBsYXN0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oWiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShaKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaSxvPXIub3BlbkN1cnNvcigpO28ub25zdWNjZXNzPWFzeW5jKGEpPT57bGV0IHU9YS50YXJnZXQucmVzdWx0O2lmKHUpe2xldHtrZXk6ZCx2YWx1ZTpsfT11O2lmKFkoZSxsLmVpZCkpe2lmKCFpfHwobC5jdHI/PzApPihpLmRhdGEuY3RyPz8wKXx8KGwuY3RyPz8wKT09PShpLmRhdGEuY3RyPz8wKSYmKGwub2ZmPz8wKT4oaS5kYXRhLm9mZj8/MCkpaT17a2V5OmQsZGF0YTpsfX11LmNvbnRpbnVlKCl9ZWxzZSBpZihpKXtsZXQgZD1rZShpLmtleSk7bihhd2FpdCBIcihkLGkuZGF0YSx0aGlzLmNyeXB0bykpfWVsc2Ugbih2b2lkIDApfSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBtYXJrQXBwbGllZChlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFosInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShaKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsaSk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pmkoci5lcnJvcik7Zm9yKGxldCBvIG9mIHQpe2xldCBhPUsobyksdT1uLmdldChhKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBkPXUucmVzdWx0O2lmKCFkKXJldHVybjt6bihkLFJyKSxuLnB1dChkLGEpfSx1Lm9uZXJyb3I9KGQpPT57ZC5wcmV2ZW50RGVmYXVsdCgpfX19KX1hc3luYyBtYXJrRmFpbGVkKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oWiwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFopO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0e2tleTpvLGVycjphfW9mIHQpe2xldCB1PUsobyksZD1uLmdldCh1KTtkLm9uc3VjY2Vzcz0oKT0+e2xldCBsPWQucmVzdWx0O2lmKCFsKXJldHVybjt6bihsLHd0LGEpLG4ucHV0KGwsdSl9LGQub25lcnJvcj0obCk9PntsLnByZXZlbnREZWZhdWx0KCl9fX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKFosInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShaKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fUIoKTtjbGFzcyBBc3tkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgbGlzdCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oQWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoQWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PntsZXQgaT1zLnJlc3VsdCxvPVtdO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBhIG9mIGkpe2xldCB1PU1yKGEpO2lmKHUhPT12b2lkIDApby5wdXNoKHUpfXIobyl9LHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIGdldChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKEFlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKEFlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgaT1yLmdldChlKTtpLm9uc3VjY2Vzcz0oKT0+bihNcihpLnJlc3VsdCkpLGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIHB1dChlLHQpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oQWUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShBZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57bGV0IG89MDtyLm9uY29tcGxldGU9KCk9PnMobyksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2xldCBhPW4uZ2V0KGUpO2Eub25zdWNjZXNzPSgpPT57bGV0W3UsZF09cG8oZSxNcihhLnJlc3VsdCksdCk7aWYoZCE9PTApe289ZDtyZXR1cm59bi5wdXQodSl9fSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oQWUsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShBZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1jZSgpO2NsYXNzIFBze2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBlbnEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGJlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUoYmUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IHU9dHQoYSk7cy5wdXQoe2hvc3Q6ZSxoYXNoOnV9KX19KX1hc3luYyBkZXEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGJlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUoYmUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IHU9dHQoYSk7cy5kZWxldGUoW2UsdV0pfX0pfWFzeW5jIGxpc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihiZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShiZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ci5nZXRBbGwoKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBhPWkucmVzdWx0LmZpbHRlcigodSk9PnUuaG9zdD09PWUpLm1hcCgodSk9PnUuaGFzaCk7bihhLm1hcCgodSk9PkVpKHUpKSl9LGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihiZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShiZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihiZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKGJlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fXZhciBFZT0iYWNjb3VudHMiLHVlPSJob3N0cyIscGU9Imhvc3Rfc2VxcyIsYmU9InVwbG9hZFF1ZXVlIixTZT0iZG93bmxvYWRRdWV1ZSIsWj0ibWVzc2FnZXMiLEJ0PSJhcGxkIixJcz0icmxtIixBZT0icmVhbG1zIjtmdW5jdGlvbiB2dShlLHQpe3JldHVybntyZWFsbXM6bmV3IEFzKGUpLGhvc3RzOm5ldyBicyhlKSx1cGxvYWRzOm5ldyBQcyhlKSxkb3dubG9hZHM6bmV3IG1zKGUpLG1lc3NhZ2VzOm5ldyBFcyhlLHQpfX1mdW5jdGlvbiBoYSgpe3JldHVybntyZWFsbXM6e2FzeW5jIGxpc3QoKXtyZXR1cm5bXX0sYXN5bmMgZ2V0KCl7cmV0dXJufSxhc3luYyBwdXQoKXtyZXR1cm4gMTN9LGFzeW5jIHdpcGUoKXt9fSxob3N0czp7YXN5bmMgYWRkKCl7fSxhc3luYyBnZXQoKXtyZXR1cm59LGFzeW5jIGRlbCgpe30sYXN5bmMgc2V0KCl7cmV0dXJuIDEzfSxhc3luYyBsaXN0KCl7cmV0dXJuW119LGFzeW5jIHdpcGUoKXt9LGFzeW5jIHRvdWNoKCl7fSxhc3luYyByZWNvcmRTZXFzKCl7fX0sdXBsb2Fkczp7YXN5bmMgZW5xKCl7fSxhc3luYyBkZXEoKXt9LGFzeW5jIGxpc3QoKXtyZXR1cm5bXX0sYXN5bmMgY291bnQoKXtyZXR1cm4gMH0sYXN5bmMgd2lwZSgpe319LGRvd25sb2Fkczp7YXN5bmMgZW5xKCl7fSxhc3luYyBkZXEoKXt9LGFzeW5jIGxpc3QoKXtyZXR1cm5bXX0sYXN5bmMgY291bnQoKXtyZXR1cm4gMH0sYXN5bmMgd2lwZSgpe319LG1lc3NhZ2VzOnthc3luYyBhZGQoZSl7cmV0dXJuIGUubWFwKCgpPT4xOCl9LGFzeW5jIGdldCgpe3JldHVybn0sYXN5bmMgaGFzKCl7cmV0dXJuITF9LGFzeW5jIGRlbCgpe30sYXN5bmMgbGlzdCgpe3JldHVybltdfSxhc3luYyBjb3VudCgpe3JldHVybiAwfSxhc3luYyBsaXN0S2V5cygpe3JldHVybltdfSxhc3luYyBsYXN0KCl7cmV0dXJufSxhc3luYyBtYXJrQXBwbGllZCgpe30sYXN5bmMgbWFya0ZhaWxlZCgpe30sYXN5bmMgd2lwZSgpe319fX1jbGFzcyB5YXthY2NvdW50O3JlYWxtcztob3N0czt1cGxvYWRzO2Rvd25sb2FkczttZXNzYWdlczsjZTsjdDsjcztjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmFjY291bnQ9ZSx0aGlzLiN0PXQsdGhpcy4jcz1yO2xldCBzPWhhKCk7aWYodGhpcy5yZWFsbXM9cy5yZWFsbXMsdGhpcy5ob3N0cz1zLmhvc3RzLHRoaXMudXBsb2Fkcz1zLnVwbG9hZHMsdGhpcy5kb3dubG9hZHM9cy5kb3dubG9hZHMsdGhpcy5tZXNzYWdlcz1zLm1lc3NhZ2VzLG4hPT12b2lkIDApdGhpcy4jbihuKX0jbihlKXtsZXQgdD10aGlzLiNlO2lmKHRoaXMuI2U9ZSxlLm9udmVyc2lvbmNoYW5nZT0oKT0+e2lmKHRoaXMuI2UhPT1lKXJldHVybjt0aGlzLiNyKCl9LHRoaXMuI2kodnUoZSx0aGlzLiN0KSksdCE9PXZvaWQgMCYmdCE9PWUpdC5jbG9zZSgpfSNyKCl7bGV0IGU9dGhpcy4jZTtpZih0aGlzLiNlPXZvaWQgMCx0aGlzLiNpKGhhKCkpLGUhPT12b2lkIDApZS5jbG9zZSgpfSNpKGUpe3RoaXMucmVhbG1zPWUucmVhbG1zLHRoaXMuaG9zdHM9ZS5ob3N0cyx0aGlzLnVwbG9hZHM9ZS51cGxvYWRzLHRoaXMuZG93bmxvYWRzPWUuZG93bmxvYWRzLHRoaXMubWVzc2FnZXM9ZS5tZXNzYWdlc31hc3luYyBiaW5kKGUpe2lmKHRoaXMuI3M9PT12b2lkIDApcmV0dXJuIHRoaXMuI2U9PT12b2lkIDA/MTM6MDtsZXQgdD1hd2FpdCB0aGlzLiNzKGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuIDEzO2lmKHRoaXMuI2UhPT12b2lkIDAmJnRoaXMuI2UubmFtZT09PXQpcmV0dXJuIDA7bGV0IHI9YXdhaXQgeHModCk7cmV0dXJuIHRoaXMuI24ociksMH1hc3luYyBwcmVwYXJlV29ya2VyKGUpe2xldCB0PWF3YWl0IHRoaXMuI3M/LihlKTtpZih0PT09dm9pZCAwKXJldHVybiBjKDEzKTtpZighKHRoaXMuYWNjb3VudCBpbnN0YW5jZW9mIHRyKSlyZXR1cm4gYygxMCk7bGV0IHI9YXdhaXQgdGhpcy5hY2NvdW50LmVuc3VyZUVudHMoZSk7cmV0dXJuIGYoe2RhdGE6dCxlbnRzOnJ9KX1jbG9zZSgpe3RoaXMuI3IoKX1hc3luYyB3aXBlKCl7YXdhaXQgdGhpcy5ob3N0cy53aXBlKCksYXdhaXQgdGhpcy51cGxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLmRvd25sb2Fkcy53aXBlKCksYXdhaXQgdGhpcy5tZXNzYWdlcy53aXBlKCl9fWFzeW5jIGZ1bmN0aW9uIG1hKGUsdCl7bGV0IHI9YXdhaXQgeHModCk7cmV0dXJuIG5ldyB5YSh7YXN5bmMgc2F2ZSgpe3JldHVybiBjKDEwKX0sYXN5bmMgd2lwZSgpe319LGUsdm9pZCAwLHIpfWZ1bmN0aW9uIGdhKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiBrcyhlLHQpe2xldCByPWVbdF07aWYodHlwZW9mIHIhPT0ic3RyaW5nInx8cj09PSIiKXJldHVybjtyZXR1cm4gcn1mdW5jdGlvbiBDdShlLHQpe2lmKGU9PT12b2lkIDApcmV0dXJuIHQ7aWYodC5hY2N0PT09dm9pZCAwKXQuYWNjdD1lLmFjY3Q7aWYodC5kYXRhPT09dm9pZCAwKXQuZGF0YT1lLmRhdGE7aWYodC5lbnRzPT09dm9pZCAwKXQuZW50cz1lLmVudHM7cmV0dXJuIHR9ZnVuY3Rpb24gRHMoZSl7aWYoIWdhKGUpfHx0eXBlb2YgZS5sYWJlbCE9PSJzdHJpbmciKXJldHVybjtsZXQgdD17bGFiZWw6ZS5sYWJlbH0scj1rcyhlLCJhY2N0Iiksbj1rcyhlLCJkYXRhIikscz1rcyhlLCJlbnRzIik7aWYociE9PXZvaWQgMCl0LmFjY3Q9cjtpZihuIT09dm9pZCAwKXQuZGF0YT1uO2lmKHMhPT12b2lkIDApdC5lbnRzPXM7bGV0IGk9b2EoZS5rZXlUYWcpLG89bmEoZS5rZXlyaW5nKTtpZihpIT09dm9pZCAwKXQua2V5VGFnPWk7aWYobyE9PXZvaWQgMCl0LmtleXJpbmc9bztyZXR1cm4gdH1mdW5jdGlvbiBUdShlKXtsZXQgdD1bXTtmb3IobGV0IHIgb2YgZSl7bGV0IG49ci5rZXlyaW5nO2lmKG49PT12b2lkIDApY29udGludWU7Zm9yKGxldCBzIG9mIG4uZW50cmllcyl7aWYocy5jcmVkSWQuYnl0ZUxlbmd0aD09PTApY29udGludWU7bGV0IGk9ITE7Zm9yKGxldCBvIG9mIHQpe2lmKCFZKG8uY3JlZElkLHMuY3JlZElkKSljb250aW51ZTtpZihvLmxhYmVsIT09ci5sYWJlbClyZXR1cm4gYygxMCk7aT0hMDticmVha31pZihpKWNvbnRpbnVlO3QucHVzaCh7bGFiZWw6ci5sYWJlbCxzYWx0Om4uc2FsdCxzZWFsZWRNYXN0ZXI6cy5zZWFsZWRNYXN0ZXIsY3JlZElkOnMuY3JlZElkfSl9fXJldHVybiBmKHQpfWZ1bmN0aW9uIE11KGUpe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgbj1EcyhyKTtpZihuIT09dm9pZCAwKXQucHVzaChuKX1yZXR1cm4gdH1mdW5jdGlvbiBSdShlLHQscixuKXtsZXQgcz17bGFiZWw6dC5sYWJlbH07aWYodC5hY2N0IT09dm9pZCAwKXMuYWNjdD10LmFjY3Q7aWYodC5kYXRhIT09dm9pZCAwKXMuZGF0YT10LmRhdGE7aWYodC5lbnRzIT09dm9pZCAwKXMuZW50cz10LmVudHM7aWYociE9PXZvaWQgMClzLmtleVRhZz1yO2lmKG4hPT12b2lkIDApcy5rZXlyaW5nPW47ZS5wdXQocyl9Y2xhc3MgdHJ7ZGI7I2U7I3Q7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmRiPWUsdGhpcy4jZT10fXNldENsb3NlcihlKXt0aGlzLiN0PWV9YXN5bmMgY3JlYXRlKGUsdCl7bGV0W3Isbl09emUoZSk7aWYobiE9PTB8fHI9PT12b2lkIDApcmV0dXJuIHQuZmlsbCgwKSxjKDEwKTtpZigoYXdhaXQgdGhpcy4jcihyKSk/LmtleVRhZyE9PXZvaWQgMClyZXR1cm4gdC5maWxsKDApLGMoMTkpO2lmKHQuYnl0ZUxlbmd0aDxHcilyZXR1cm4gdC5maWxsKDApLGMoMTApO2xldFtpLG9dPWF3YWl0IGllLmZyb21SYW5kb20odCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHRoaXMuc2F2ZShpLHtsYWJlbDpyfSl9YXN5bmMgc2F2ZShlLHQpe2xldFtyLG5dPXplKHQ/LmxhYmVsKTtpZihuIT09MHx8cj09PXZvaWQgMClyZXR1cm4gYygxMCk7bGV0IHM9YXdhaXQgdGhpcy4jcyhlLHIpO2lmKHMhPT0wKXJldHVybiBjKHMpO3JldHVybiBmKGUpfWFzeW5jIGRhdGFOYW1lKGUpe2xldCB0PWF3YWl0IHRoaXMuI3IoZSk7aWYodD09PXZvaWQgMClyZXR1cm47aWYodC5kYXRhIT09dm9pZCAwJiZ0LmRhdGEhPT0iIilyZXR1cm4gdC5kYXRhO3JldHVybiBhd2FpdCB0aGlzLiNvKGUsKG4pPT57aWYobj09PXZvaWQgMClyZXR1cm47cmV0dXJuey4uLm59fSksKGF3YWl0IHRoaXMuI3IoZSkpPy5kYXRhfWFzeW5jIGVuc3VyZUVudHMoZSl7bGV0W3Qscl09emUoZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBpbnZhbGlkIGFjY291bnQgbGFiZWwiKTtsZXQgbj1hd2FpdCB0aGlzLiNyKHQpLHM9eXMobj8uYWNjdCxuPy5kYXRhKSxpPWxhKHMuYWNjdCxuPy5lbnRzKTtyZXR1cm4gYXdhaXQgdGhpcy4jbyh0LChvKT0+KHsuLi5vPT09dm9pZCAwP3tsYWJlbDp0fTp7Li4ub30sYWNjdDpzLmFjY3QsZGF0YTpzLmRhdGEsZW50czppfSkpLGl9YXN5bmMgd2lwZSgpe2xldCBlPWF3YWl0IHRoaXMuI2koKTt0aGlzLiN0Py4oKTtmb3IobGV0IG4gb2YgZSl7aWYobi5kYXRhIT09dm9pZCAwKWF3YWl0IHBzKG4uZGF0YSk7aWYobi5lbnRzIT09dm9pZCAwKWF3YWl0IHBzKG4uZW50cyl9bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihFZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKEVlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5jbGVhcigpfSl9YXN5bmMgbG9hZEtleXJpbmcoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy4jbihlKTtpZihyIT09MHx8dD09PXZvaWQgMClyZXR1cm47cmV0dXJuKGF3YWl0IHRoaXMuI3IodCkpPy5rZXlyaW5nfWFzeW5jIHBlcnNpc3RLZXlyaW5nKGUsdCl7bGV0IHI7aWYoZSE9PXZvaWQgMCl7bGV0W2ksb109WnQoZSk7aWYobyE9PTApcmV0dXJuIG87cj1pfWxldFtuLHNdPWF3YWl0IHRoaXMuI24odCk7aWYocyE9PTApcmV0dXJuIHM7aWYobj09PXZvaWQgMClyZXR1cm4gMTM7cmV0dXJuIGF3YWl0IHRoaXMuI28obiwoaSk9PntpZihyPT09dm9pZCAwKXtpZihpPy5rZXlUYWc9PT12b2lkIDApcmV0dXJuO3JldHVybntsYWJlbDpuLGtleVRhZzppLmtleVRhZ319bGV0IG89e2xhYmVsOm4sa2V5cmluZzpyfTtpZihpPy5rZXlUYWchPT12b2lkIDApby5rZXlUYWc9aS5rZXlUYWc7cmV0dXJuIG99KSwwfWFzeW5jIGhhc0tleXJpbmcoZSl7bGV0IHQ9YXdhaXQgdGhpcy5sb2FkS2V5cmluZyhlKTtyZXR1cm4gdCE9PXZvaWQgMCYmdC5lbnRyaWVzLmxlbmd0aD4wfWFzeW5jIHVubG9jayhlKXtsZXRbdCxyXT1UdShhd2FpdCB0aGlzLiNpKCkpO2lmKHIhPT0wKXJldHVybiBjKHIpO2lmKHQ9PT12b2lkIDB8fHQubGVuZ3RoPT09MClyZXR1cm4gYygyMik7bGV0IG49dFswXTtpZihuPT09dm9pZCAwKXJldHVybiBjKDIyKTtsZXRbcyxpXT1hd2FpdCBpZS51bnNlYWxXaXRoUGFzc2tleSh0Lm1hcCgoaCk9Pih7c2VhbGVkTWFzdGVyOmguc2VhbGVkTWFzdGVyLGNyZWRJZDpoLmNyZWRJZCxzYWx0Omguc2FsdH0pKSx7cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lLHNhbHQ6bi5zYWx0fSk7aWYoaSE9PTApcmV0dXJuIGMoaSk7aWYocz09PXZvaWQgMClyZXR1cm4gYygyMCk7bGV0IG89dC5maW5kKChoKT0+WShoLmNyZWRJZCxzLmNyZWRJZCkpO2lmKG89PT12b2lkIDApcmV0dXJuIGMoMTMpO2xldCBhPWF3YWl0IHRoaXMuI3Ioby5sYWJlbCksdT1hPy5rZXlUYWc7aWYodSE9PXZvaWQgMCl7aWYoIWF3YWl0IGZzKHMuZW5jbGF2ZSx1KSlyZXR1cm4gYygxOSl9bGV0IGQ9YT8ua2V5cmluZztpZihkPT09dm9pZCAwKXJldHVybiBjKDEzKTtsZXRbbCxwXT1scyhkLHMuY3JlZElkKTtpZihwIT09MClyZXR1cm4gYyhwKTtpZihsIT09dm9pZCAwKWF3YWl0IHRoaXMuI28oby5sYWJlbCwoaCk9PntsZXQgeT17bGFiZWw6by5sYWJlbCxrZXlyaW5nOmx9O2lmKGg/LmtleVRhZyE9PXZvaWQgMCl5LmtleVRhZz1oLmtleVRhZztyZXR1cm4geX0pO3JldHVybiBmKHtlbmNsYXZlOnMuZW5jbGF2ZSxsYWJlbDpvLmxhYmVsfSl9YXN5bmMgb3BlblByZlN0b3JlKGUsdCl7bGV0W3Isbl09YXdhaXQgdGhpcy4jbih0KSxzPW49PT0wP2F3YWl0IHRoaXMubG9hZEtleXJpbmcocik6dm9pZCAwLGk9bj09PTA/cjp2b2lkIDA7cmV0dXJuIFFyLm9wZW4oe3JwSWQ6ZS5ycElkLHJwTmFtZTplLnJwTmFtZSx1c2VyTmFtZTplLnVzZXJOYW1lLGtleXJpbmc6cyxwZXJzaXN0S2V5cmluZzoobyk9PnRoaXMucGVyc2lzdEtleXJpbmcobyxpKSx1bmxvY2tBY2NvdW50OmFzeW5jKCk9PntsZXRbbyxhXT1hd2FpdCB0aGlzLnVubG9jayhlKTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDEzKTtyZXR1cm4gaT1vLmxhYmVsLGYoe2VuY2xhdmU6by5lbmNsYXZlLGtleXJpbmc6YXdhaXQgdGhpcy5sb2FkS2V5cmluZyhvLmxhYmVsKX0pfX0pfWFzeW5jI3MoZSx0KXtsZXQgcj1hd2FpdCB0aGlzLiNyKHQpO2lmKHI/LmtleVRhZyE9PXZvaWQgMCl7aWYoIWF3YWl0IGZzKGUsci5rZXlUYWcpKXJldHVybiAxOTtyZXR1cm4gMH1sZXRbbixzXT1hd2FpdCBpYSh0aGlzLiNlLGUpO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWFhKG4pLG89ITE7aWYoYXdhaXQgdGhpcy4jbyh0LChhKT0+e2lmKGE/LmtleVRhZyE9PXZvaWQgMClyZXR1cm4gbz0hMCxhO2xldCB1PXtsYWJlbDp0LGtleVRhZzppfTtpZihhPy5rZXlyaW5nIT09dm9pZCAwKXUua2V5cmluZz1hLmtleXJpbmc7cmV0dXJuIHV9KSwhbylyZXR1cm4gMDtyZXR1cm4gdGhpcy4jcyhlLHQpfWFzeW5jI24oZSl7aWYoZSE9PXZvaWQgMCl7bGV0W24sc109emUoZSk7aWYocyE9PTB8fG49PT12b2lkIDApcmV0dXJuIGMoMTApO3JldHVybiBmKG4pfWxldCB0PWF3YWl0IHRoaXMuI2koKSxyPXQubGVuZ3RoPT09MT90WzBdOnZvaWQgMDtpZihyIT09dm9pZCAwKXJldHVybiBmKHIubGFiZWwpO2lmKHQubGVuZ3RoPT09MClyZXR1cm4gYygxMyk7cmV0dXJuIGMoMTApfSNyKGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oRWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoRWUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPXIuZ2V0KGUpO2kub25zdWNjZXNzPSgpPT5uKERzKGkucmVzdWx0KSksaS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9I2koKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKEVlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKEVlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldEFsbCgpO3Mub25zdWNjZXNzPSgpPT5yKE11KHMucmVzdWx0KSkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMjbyhlLHQpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oRWUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShFZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2xldCBvPW4uZ2V0KGUpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9Z2Eoby5yZXN1bHQpP28ucmVzdWx0OnZvaWQgMCx1PURzKG8ucmVzdWx0KSxkPXQodSk7aWYoZD09PXZvaWQgMCl7aWYodSE9PXZvaWQgMCluLmRlbGV0ZShlKTtyZXR1cm59bGV0IGw9Q3UodSxkPT09dT97Li4uZH06ZCkscD15cyhsLmFjY3QsbC5kYXRhKTtpZihsLmFjY3Q9cC5hY2N0LGwuZGF0YT1wLmRhdGEsZD09PXUmJnU/LmFjY3Q9PT1sLmFjY3QmJnU/LmRhdGE9PT1sLmRhdGEmJnU/LmVudHM9PT1sLmVudHMpcmV0dXJuO2xldCBoPXZvaWQgMDtpZihsLmtleVRhZyE9PXZvaWQgMCloPWwua2V5VGFnPT09dT8ua2V5VGFnJiZhPy5rZXlUYWchPT12b2lkIDA/YS5rZXlUYWc6bC5rZXlUYWc7bGV0IHk9dm9pZCAwO2lmKGwua2V5cmluZyE9PXZvaWQgMCl5PWwua2V5cmluZz09PXU/LmtleXJpbmcmJmE/LmtleXJpbmchPT12b2lkIDA/YS5rZXlyaW5nOmwua2V5cmluZztSdShuLGwsaCx5KX19KX19YXN5bmMgZnVuY3Rpb24gU2EoZSl7bGV0IHQ9YXdhaXQgd3MoKTt0cnl7cmV0dXJuIGF3YWl0IG5ldyB0cih0LEV0KS5lbnN1cmVFbnRzKGUpfWZpbmFsbHl7dC5jbG9zZSgpfX1CKCk7TSgpO2NlKCk7dmFyIG5lPSJlbnRpdGllcyIsSnI9ImVudGl0eV90eXBlX2NyZWF0ZWRfYXQiLFVzPSJlbnRpdHlfdHlwZV91cGRhdGVkX2F0Iix2cz0iZW50aXR5X3R5cGVfcGFyZW50X2lkIixVdD0iZW50aXR5X3RhZ3MiLGJhPSJlbnRpdHlfcmxtIixJYT0iZW50aXR5X3R5cGVfZ3JvdXBfaWQiO3ZhciB3YT0xNTtmdW5jdGlvbiBIdShlKXtyZXR1cm4idHlwImluIGV9ZnVuY3Rpb24gS3UoZSl7bGV0IHQ9c3QoZS5ybG0pLHI9e2JvZDplLmJvZHksY3JkOmUuY3JlYXRlZEF0LC4uLmUuY3RyIT09MD97Y3RyOmUuY3RyfTp7fSxlaWQ6SyhlLmVpZCkscGlkOmUucGlkP0soZS5waWQpOnZvaWQgMCwuLi50IT09dm9pZCAwP3tybG06dH06e30sdGdzOmUudGFncyx0eXA6ZS50eXBlLHVwZDplLnVwZGF0ZWRBdH07aWYoci5waWQ9PT12b2lkIDApZGVsZXRlIHIucGlkO2lmKHIudGdzPT09dm9pZCAwKWRlbGV0ZSByLnRncztpZihyLmN0cj09PXZvaWQgMClkZWxldGUgci5jdHI7cmV0dXJuIHJ9ZnVuY3Rpb24gTHUoZSl7aWYoIUooZSkpcmV0dXJue2VpZDpLKGUuZWlkKSx1cGQ6ZS51cGRhdGVkQXQsLi4uZS5jdHIhPT0wP3tjdHI6ZS5jdHJ9Ont9fTtyZXR1cm4gS3UoZSl9ZnVuY3Rpb24gdnQoZSl7bGV0IHQ9c3QoZS5ybG0pO3JldHVybntib2R5OmUuYm9kLGNyZWF0ZWRBdDplLmNyZCx1cGRhdGVkQXQ6ZS51cGQsY3RyOmUuY3RyPz8wLHR5cGU6ZS50eXAsZWlkOmtlKGUuZWlkKSxwaWQ6ZS5waWQ/a2UoZS5waWQpOnZvaWQgMCwuLi5lLnRncyE9PXZvaWQgMD97dGFnczplLnRnc306e30sLi4udCE9PXZvaWQgMD97cmxtOnR9Ont9fX1mdW5jdGlvbiBCcyhlKXtpZihIdShlKSlyZXR1cm4gdnQoZSk7cmV0dXJue2VpZDprZShlLmVpZCksdXBkYXRlZEF0OmUudXBkLGN0cjplLmN0cj8/MH19ZnVuY3Rpb24gVnUoZSx0KXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gSURCS2V5UmFuZ2Uub25seShbZSx0XSk7bGV0IHI9dC5yYW5nZTtyZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoW2Usci5zdGFydF0sW2Usci5lbmRdLHIuZXhjbHVkZVN0YXJ0PT09ITAsci5leGNsdWRlRW5kPT09ITApfWZ1bmN0aW9uIE91KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpcmV0dXJuIElEQktleVJhbmdlLm9ubHkoZSk7aWYoInJhbmdlImluIGUpe2xldCB0PWUucmFuZ2U7cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHQuc3RhcnQsdC5lbmQsdC5leGNsdWRlU3RhcnQ9PT0hMCx0LmV4Y2x1ZGVFbmQ9PT0hMCl9cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKGUucHJlZml4LGUucHJlZml4KyLvv78iKX1mdW5jdGlvbiBfdShlLHQscil7bGV0IG49W107aWYodHlwZW9mIHI9PT0ic3RyaW5nIil7Zm9yKGxldCBvIG9mIGUpaWYoby50eXA9PT10KW4ucHVzaCh2dChvKSk7cmV0dXJuIG59bGV0IHM9bmV3IFNldCxpPSJwcmVmaXgiaW4gcj9yLnByZWZpeDp2b2lkIDA7Zm9yKGxldCBvIG9mIGUpe2lmKG8udHlwIT09dCljb250aW51ZTtpZihzLmhhcyhvLmVpZCkpY29udGludWU7aWYoaSE9PXZvaWQgMCl7bGV0IGE9by50Z3M7aWYoIWF8fCFhLnNvbWUoKHUpPT51LnN0YXJ0c1dpdGgoaSkpKWNvbnRpbnVlfXMuYWRkKG8uZWlkKSxuLnB1c2godnQobykpfXJldHVybiBufWNsYXNzIHhhe25hbWU7ZGI7b3BlbmluZztjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9ZX1hc3luYyBpbml0KCl7YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNsb3NlKCl7bGV0IGU9dGhpcy5kYjtpZih0aGlzLmRiPXZvaWQgMCx0aGlzLm9wZW5pbmc9dm9pZCAwLGUhPT12b2lkIDApZS5jbG9zZSgpfWFzeW5jIGVuc3VyZURiKCl7aWYodGhpcy5kYilyZXR1cm4gdGhpcy5kYjtpZih0aGlzLm9wZW5pbmcpcmV0dXJuIHRoaXMub3BlbmluZztyZXR1cm4gdGhpcy5vcGVuaW5nPXF1KHRoaXMubmFtZSkudGhlbigoZSk9PihlLm9udmVyc2lvbmNoYW5nZT0oKT0+e2lmKGUuY2xvc2UoKSx0aGlzLmRiPT09ZSl0aGlzLmRiPXZvaWQgMH0sdGhpcy5kYj1lLHRoaXMub3BlbmluZz12b2lkIDAsZSksKGUpPT57dGhyb3cgdGhpcy5vcGVuaW5nPXZvaWQgMCxlfSksdGhpcy5vcGVuaW5nfWFwcGx5PWFzeW5jKGUpPT57bGV0IHQ9bmV3IFNldCxyPVtdLG49cGVyZm9ybWFuY2Uubm93KCk7WCgiaWRiIGFwcGx5IHN0YXJ0Iix7b3BzOmUubGVuZ3RofSk7bGV0IHM7dHJ5e3M9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybntzdGF0czplLm1hcCgoKT0+MTYpLHR5cGVzOnQsZWlkczpyfX1sZXQgaT1zLnRyYW5zYWN0aW9uKG5lLCJyZWFkd3JpdGUiKSxvPWkub2JqZWN0U3RvcmUobmUpO3JldHVybiBuZXcgUHJvbWlzZSgoYSk9PntsZXQgdT1BcnJheShlLmxlbmd0aCkuZmlsbCgwKTtpZihlLmxlbmd0aDwxKXthKHtzdGF0czpbXSx0eXBlczp0LGVpZHM6cn0pO3JldHVybn1pLm9uY29tcGxldGU9KCk9PntYKCJpZGIgYXBwbHkgY29tcGxldGUiLHtvcHM6ZS5sZW5ndGgsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1uKX0pLGEoe3N0YXRzOnUsdHlwZXM6dCxlaWRzOnJ9KX0saS5vbmVycm9yPSgpPT57Zm9yKGxldCBsPTA7bDx1Lmxlbmd0aDtsKyspaWYodVtsXT09PXZvaWQgMCl1W2xdPTE4O2Eoe3N0YXRzOnUsdHlwZXM6dCxlaWRzOnJ9KX07bGV0IGQ9bmV3IE1hcDtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrKyl7bGV0IHA9ZVtsXSxoPUsocC5laWQpLHk9e29wOnAsaW5kZXg6bH0sbT1kLmdldChoKTtpZihtKW0ucHVzaCh5KTtlbHNlIGQuc2V0KGgsW3ldKX1mb3IobGV0W2wscF1vZiBkKXtpZihwLmxlbmd0aDwxKWNvbnRpbnVlO2xldCBoPW8uZ2V0KGwpO2gub25zdWNjZXNzPSgpPT57bGV0IHk9aC5yZXN1bHQsbT15P0JzKHkpOnZvaWQgMCxnPSExO2ZvcihsZXR7b3A6UyxpbmRleDpJfW9mIHApe2xldFt3LEFdPVN0KG0sUyk7aWYoQSE9PTApe3VbSV09QTtjb250aW51ZX1pZih3PT09dm9pZCAwKXt1W0ldPTEyO2NvbnRpbnVlfWc9ITA7Zm9yKGxldCBFIG9mIGJ0KG0sdykpdC5hZGQoRSk7bT13fWlmKGcpci5wdXNoKHBbMF0ub3AuZWlkKTtpZihtKXtsZXQgUz1vLnB1dChMdShtKSk7Uy5vbmVycm9yPShJKT0+e0kucHJldmVudERlZmF1bHQoKTtmb3IobGV0e2luZGV4Ond9b2YgcCl1W3ddPTE4fX19LGgub25lcnJvcj0oKT0+e2ZvcihsZXR7aW5kZXg6eX1vZiBwKXVbeV09MTh9fX0pfTthc3luYyBjbGVhcigpe2xldCBlO3RyeXtlPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gMTZ9bGV0IHQ9ZS50cmFuc2FjdGlvbihuZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKG5lKTtyZXR1cm4gbmV3IFByb21pc2UoKG4pPT57dC5vbmNvbXBsZXRlPSgpPT5uKDApLHQub25lcnJvcj0oKT0+bigxOCksci5jbGVhcigpfSl9YXN5bmMgZ2V0Um93KGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IHI9SyhlKSxzPXQudHJhbnNhY3Rpb24obmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobmUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSk9PntsZXQgbz1zLmdldChyKTtvLm9uc3VjY2Vzcz0oKT0+e2xldCBhPW8ucmVzdWx0O2lmKCFhKWkoZih2b2lkIDApKTtlbHNlIGkoZihCcyhhKSkpfSxvLm9uZXJyb3I9KCk9PmkoYygxOCkpfSl9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBjKHIpO2lmKHQ9PT12b2lkIDB8fCFKKHQpKXJldHVybiBmKHZvaWQgMCk7cmV0dXJuIGYodCl9YXN5bmMgZ2V0QnlVcGRhdGVkQXQoZSx0KXtsZXRbcixuXT0kdCh0KTtpZihuIT09MClyZXR1cm4gYyhuKTtpZighcilyZXR1cm4gZihbXSk7bGV0IHM7dHJ5e3M9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBjKDE2KX1sZXQgbz1zLnRyYW5zYWN0aW9uKG5lLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKG5lKS5pbmRleChVcyksYT1WdShlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgodSk9PntsZXQgZD1vLmdldEFsbChhKTtkLm9uc3VjY2Vzcz0oKT0+e2xldCBsPWQucmVzdWx0O3UoZihsLm1hcCh2dCkpKX0sZC5vbmVycm9yPSgpPT51KGMoMTgpKX0pfWFzeW5jIGdldEFsbE9mVHlwZShlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24obmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobmUpLmluZGV4KEpyKTtyZXR1cm4gbmV3IFByb21pc2UoKHMpPT57bGV0IGk9bi5nZXRBbGwoSURCS2V5UmFuZ2UuYm91bmQoW2VdLFtlLFtdXSkpO2kub25zdWNjZXNzPSgpPT57bGV0IG89aS5yZXN1bHQ7cyhmKG8ubWFwKHZ0KSkpfSxpLm9uZXJyb3I9KCk9PnMoYygxOCkpfSl9YXN5bmMgZ2V0QnlUYWcoZSx0KXtsZXRbcixuXT1HdCh0KTtpZihuIT09MClyZXR1cm4gYyhuKTtpZighcilyZXR1cm4gZihbXSk7bGV0IHM7dHJ5e3M9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBjKDE2KX1sZXQgaT1PdSh0KSxhPXMudHJhbnNhY3Rpb24obmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobmUpLmluZGV4KFV0KTtyZXR1cm4gbmV3IFByb21pc2UoKHUpPT57bGV0IGQ9YS5nZXRBbGwoaSk7ZC5vbnN1Y2Nlc3M9KCk9PntsZXQgbD1kLnJlc3VsdDt1KGYoX3UobCxlLHQpKSl9LGQub25lcnJvcj0oKT0+dShjKDE4KSl9KX1hc3luYyBnZXRBbGxFbnRpdGllcyhlKXtpZigicGlkImluIGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IHI9SyhlLnBpZCkscz10LnRyYW5zYWN0aW9uKG5lLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKG5lKS5pbmRleCh2cyk7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkoW2UudHlwZSxyXSkpO28ub25zdWNjZXNzPSgpPT57bGV0IHU9by5yZXN1bHQubWFwKHZ0KTtpKGYodSkpfSxvLm9uZXJyb3I9KCk9PmkoYygxOCkpfSl9ZWxzZSBpZigidGFnImluIGUpcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QnlUYWcoZS50eXBlLGUudGFnKTtlbHNlIGlmKCJ1cGRhdGVkQXQiaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVVwZGF0ZWRBdChlLnR5cGUsZS51cGRhdGVkQXQpO3JldHVybiBhd2FpdCB0aGlzLmdldEFsbE9mVHlwZShlLnR5cGUpfWFzeW5jIGdldEVudGl0aWVzKGUpe2xldCB0PXBlcmZvcm1hbmNlLm5vdygpLFtyLG5dPWF3YWl0IHRoaXMuZ2V0QWxsRW50aXRpZXMoZSk7aWYoWCgiaWRiIGdldEVudGl0aWVzIix7dHlwZTplLnR5cGUsbjpyPy5sZW5ndGg/PzAsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS10KX0pLG4hPT0wKXJldHVybiBjKG4pO3JldHVybiBmKHIpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG49dC50cmFuc2FjdGlvbihuZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuZSkuaW5kZXgoSnIpO3JldHVybiBuZXcgUHJvbWlzZSgocyk9PntsZXQgaT1JREJLZXlSYW5nZS5ib3VuZChbZV0sW2UsW11dKSxvPW4uY291bnQoaSk7by5vbnN1Y2Nlc3M9KCk9PnMoZihvLnJlc3VsdCkpLG8ub25lcnJvcj0oKT0+cyhjKDE4KSl9KX1hc3luYyBjaGVja3N1bShlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24obmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobmUpLHM9W107cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPW4ub3BlbkN1cnNvcigpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoYSl7bGV0IHU9YS52YWx1ZTtzLnB1c2goVXIoQnModSkpKSxhLmNvbnRpbnVlKCl9ZWxzZSBEcihzLGUpLnRoZW4oaSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX19ZnVuY3Rpb24gTnUoZSx0KXtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG5lKSllLmNyZWF0ZU9iamVjdFN0b3JlKG5lLHtrZXlQYXRoOiJlaWQiLGF1dG9JbmNyZW1lbnQ6ITF9KTtsZXQgcj10Lm9iamVjdFN0b3JlKG5lKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKEpyKSlyLmNyZWF0ZUluZGV4KEpyLFsidHlwIiwiY3JkIl0se3VuaXF1ZTohMX0pO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoVXMpKXIuY3JlYXRlSW5kZXgoVXMsWyJ0eXAiLCJ1cGQiXSx7dW5pcXVlOiExfSk7aWYoci5pbmRleE5hbWVzLmNvbnRhaW5zKElhKSlyLmRlbGV0ZUluZGV4KElhKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKHZzKSlyLmNyZWF0ZUluZGV4KHZzLFsidHlwIiwicGlkIl0se3VuaXF1ZTohMX0pO2lmKHIuaW5kZXhOYW1lcy5jb250YWlucyhVdCkpe2lmKHIuaW5kZXgoVXQpLmtleVBhdGghPT0idGdzIilyLmRlbGV0ZUluZGV4KFV0KX1pZighci5pbmRleE5hbWVzLmNvbnRhaW5zKFV0KSlyLmNyZWF0ZUluZGV4KFV0LCJ0Z3MiLHt1bmlxdWU6ITEsbXVsdGlFbnRyeTohMH0pO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoYmEpKXIuY3JlYXRlSW5kZXgoYmEsInJsbSIse3VuaXF1ZTohMX0pfWZ1bmN0aW9uIHF1KGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxyKT0+e2xldCBuPWluZGV4ZWREQi5vcGVuKGUsd2EpO24ub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpzLHRyYW5zYWN0aW9uOml9PW47aWYoIWkpe3IoRXJyb3IoIlRyYW5zYWN0aW9uIGlzIG51bGwgZHVyaW5nIEVudERCIHVwZ3JhZGUiKSk7cmV0dXJufXRyeXtOdShzLGkpfWNhdGNoKG8pe3IobyBpbnN0YW5jZW9mIEVycm9yP286RXJyb3IoU3RyaW5nKG8pKSl9fSxuLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIEVudERCIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7ZX0g4oaSIHYke3dhfSk7IHdhaXRpbmcgZm9yIG90aGVyIGNvbm5lY3Rpb25zIHRvIGNsb3NlYCl9LG4ub25zdWNjZXNzPSgpPT50KG4ucmVzdWx0KSxuLm9uZXJyb3I9KCk9PnIobi5lcnJvcj8/RXJyb3IoIkVudERCIEluZGV4ZWREQiBvcGVuIGZhaWxlZCIpKX0pfWFzeW5jIGZ1bmN0aW9uIEVhKGUpe2xldCB0PW5ldyB4YShlKTtyZXR1cm4gYXdhaXQgdC5pbml0KCksdH1jZSgpO0IoKTtNKCk7Y2xhc3MgQ3N7ZW50cz1uZXcgTWFwO3VzZUluZGV4O2J5VHlwZT1uZXcgTWFwO2J5VHlwZVBpZD1uZXcgTWFwO2J5VHlwZVRhZz1uZXcgTWFwO2NvbnN0cnVjdG9yKGU9W10sdCl7dGhpcy51c2VJbmRleD10Py5pbmRleGVzIT09ITE7Zm9yKGxldCByIG9mIGUpdGhpcy5wdXQocil9cHV0KGUpe2xldCB0PUooZSk/VHIoZSk6ZSxyPUsodC5laWQpLG49dGhpcy5lbnRzLmdldChyKTtpZihuIT09dm9pZCAwJiZKKG4pKXRoaXMudW5pbmRleChyLG4pO2lmKHRoaXMuZW50cy5zZXQocix0KSxKKHQpKXRoaXMuaW5kZXgocix0KX1kZWwoZSl7bGV0IHQ9dGhpcy5lbnRzLmdldChlKTtpZih0PT09dm9pZCAwKXJldHVybjtpZihKKHQpKXRoaXMudW5pbmRleChlLHQpO3RoaXMuZW50cy5kZWxldGUoZSl9aW5kZXgoZSx0KXtpZighdGhpcy51c2VJbmRleClyZXR1cm47bGV0IHI9dGhpcy5ieVR5cGUuZ2V0KHQudHlwZSk7aWYoIXIpcj1uZXcgTWFwLHRoaXMuYnlUeXBlLnNldCh0LnR5cGUscik7aWYoci5zZXQoZSx0KSx0LnBpZCl7bGV0IG49Syh0LnBpZCkscz10aGlzLmJ5VHlwZVBpZC5nZXQodC50eXBlKTtpZighcylzPW5ldyBNYXAsdGhpcy5ieVR5cGVQaWQuc2V0KHQudHlwZSxzKTtsZXQgaT1zLmdldChuKTtpZighaSlpPW5ldyBNYXAscy5zZXQobixpKTtpLnNldChlLHQpfWlmKHQudGFncyl7bGV0IG49dGhpcy5ieVR5cGVUYWcuZ2V0KHQudHlwZSk7aWYoIW4pbj1uZXcgTWFwLHRoaXMuYnlUeXBlVGFnLnNldCh0LnR5cGUsbik7Zm9yKGxldCBzIG9mIHQudGFncyl7bGV0IGk9bi5nZXQocyk7aWYoIWkpaT1uZXcgTWFwLG4uc2V0KHMsaSk7aS5zZXQoZSx0KX19fXVuaW5kZXgoZSx0KXtpZighdGhpcy51c2VJbmRleClyZXR1cm47bGV0IHI9dGhpcy5ieVR5cGUuZ2V0KHQudHlwZSk7aWYocil7aWYoci5kZWxldGUoZSksci5zaXplPT09MCl0aGlzLmJ5VHlwZS5kZWxldGUodC50eXBlKX1pZih0LnBpZCl7bGV0IG49Syh0LnBpZCkscz10aGlzLmJ5VHlwZVBpZC5nZXQodC50eXBlKSxpPXM/LmdldChuKTtpZihpKXtpZihpLmRlbGV0ZShlKSxpLnNpemU9PT0wKXM/LmRlbGV0ZShuKX1pZihzJiZzLnNpemU9PT0wKXRoaXMuYnlUeXBlUGlkLmRlbGV0ZSh0LnR5cGUpfWlmKHQudGFncyl7bGV0IG49dGhpcy5ieVR5cGVUYWcuZ2V0KHQudHlwZSk7aWYobil7Zm9yKGxldCBzIG9mIHQudGFncyl7bGV0IGk9bi5nZXQocyk7aWYoaSl7aWYoaS5kZWxldGUoZSksaS5zaXplPT09MCluLmRlbGV0ZShzKX19aWYobi5zaXplPT09MCl0aGlzLmJ5VHlwZVRhZy5kZWxldGUodC50eXBlKX19fWNsZWFySW5kZXhlcygpe3RoaXMuYnlUeXBlLmNsZWFyKCksdGhpcy5ieVR5cGVQaWQuY2xlYXIoKSx0aGlzLmJ5VHlwZVRhZy5jbGVhcigpfWJ1Y2tldExpc3QoZSl7aWYoIWV8fGUuc2l6ZT09PTApcmV0dXJuW107bGV0IHQ9W107Zm9yKGxldCByIG9mIGUudmFsdWVzKCkpdC5wdXNoKHIpO3JldHVybiB0fWJ5VGFnU3BlYyhlLHQpe2xldFtyLG5dPUd0KHQpO2lmKG4hPT0wKXJldHVybiBjKG4pO2lmKCFyKXJldHVybiBmKFtdKTtpZih0eXBlb2YgdD09PSJzdHJpbmciKXJldHVybiBmKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZVRhZy5nZXQoZSk/LmdldCh0KSkpO2xldCBzPXRoaXMuYnlUeXBlVGFnLmdldChlKTtpZighcylyZXR1cm4gZihbXSk7bGV0IGk9bmV3IFNldCxvPVtdO2ZvcihsZXRbYSx1XW9mIHMpe2lmKCFPbihhLHQpKWNvbnRpbnVlO2ZvcihsZXRbZCxsXW9mIHUpe2lmKGkuaGFzKGQpKWNvbnRpbnVlO2kuYWRkKGQpLG8ucHVzaChsKX19cmV0dXJuIGYobyl9YnlEYXRlU3BlYyhlLHQpe2xldFtyLG5dPSR0KHQpO2lmKG4hPT0wKXJldHVybiBjKG4pO2lmKCFyKXJldHVybiBmKFtdKTtsZXQgcz1bXSxpPXRoaXMuYnlUeXBlLmdldChlKTtpZihpKXtmb3IobGV0IG8gb2YgaS52YWx1ZXMoKSlpZihWbihvLnVwZGF0ZWRBdCx0KSlzLnB1c2gobyl9cmV0dXJuIGYocyl9YXN5bmMgYXBwbHkoZSl7bGV0IHQ9bmV3IFNldCxyPVtdLG49W107Zm9yKGxldCBzIG9mIGUpe2xldCBpPUsocy5laWQpLG89dGhpcy5lbnRzLmdldChpKSxbYSx1XT1TdChvLHMpO2lmKHUhPT0wKXtuLnB1c2godSk7Y29udGludWV9aWYoYT09PXZvaWQgMCl7bi5wdXNoKDEyKTtjb250aW51ZX1mb3IobGV0IGQgb2YgYnQobyxhKSl0LmFkZChkKTt0aGlzLnB1dChhKSxyLnB1c2gocy5laWQpLG4ucHVzaCgwKX1yZXR1cm57c3RhdHM6bix0eXBlczp0LGVpZHM6cn19YXN5bmMgY2xlYXIoKXtyZXR1cm4gdGhpcy5lbnRzLmNsZWFyKCksdGhpcy5jbGVhckluZGV4ZXMoKSwwfWFzeW5jIGdldFJvdyhlKXtsZXQgdD1LKGUpLHI9dGhpcy5lbnRzLmdldCh0KTtyZXR1cm4gZihyKX1hc3luYyBnZXRFbnQoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRSb3coZSk7aWYociE9PTApcmV0dXJuIGMocik7aWYodD09PXZvaWQgMHx8IUoodCkpcmV0dXJuIGYodm9pZCAwKTtyZXR1cm4gZih0KX1hc3luYyBnZXRBbGxFbnRpdGllcyhlKXtsZXR7dHlwZTp0fT1lO2lmKHRoaXMudXNlSW5kZXgpe2lmKCJwaWQiaW4gZSl7bGV0IG49SyhlLnBpZCk7cmV0dXJuIGYodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlUGlkLmdldCh0KT8uZ2V0KG4pKSl9aWYoInRhZyJpbiBlKXJldHVybiB0aGlzLmJ5VGFnU3BlYyh0LGUudGFnKTtpZigidXBkYXRlZEF0ImluIGUpcmV0dXJuIHRoaXMuYnlEYXRlU3BlYyh0LGUudXBkYXRlZEF0KTtyZXR1cm4gZih0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGUuZ2V0KHQpKSl9bGV0IHI9W107aWYoInBpZCJpbiBlKXtmb3IobGV0IG4gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEoobikmJm4udHlwZT09PXQmJm4ucGlkJiZZKG4ucGlkLGUucGlkKSlyLnB1c2gobil9ZWxzZSBpZigidGFnImluIGUpe2xldCBuPWUudGFnLFtzLGldPUd0KG4pO2lmKGkhPT0wKXJldHVybiBjKGkpO2lmKCFzKXJldHVybiBmKHIpO2ZvcihsZXQgbyBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoSihvKSYmby50eXBlPT09dCYmby50YWdzJiZvLnRhZ3Muc29tZSgoYSk9Pk9uKGEsbikpKXIucHVzaChvKX1lbHNlIGlmKCJ1cGRhdGVkQXQiaW4gZSl7bGV0IG49ZS51cGRhdGVkQXQsW3MsaV09JHQobik7aWYoaSE9PTApcmV0dXJuIGMoaSk7aWYoIXMpcmV0dXJuIGYocik7Zm9yKGxldCBvIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihKKG8pJiZvLnR5cGU9PT10JiZWbihvLnVwZGF0ZWRBdCxuKSlyLnB1c2gobyl9ZWxzZSBmb3IobGV0IG4gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEoobikmJm4udHlwZT09PXQpci5wdXNoKG4pO3JldHVybiBmKHIpfWFzeW5jIGdldEVudGl0aWVzKGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0QWxsRW50aXRpZXMoZSk7aWYociE9PTApcmV0dXJuIGMocik7cmV0dXJuIGYodCl9YXN5bmMgY291bnRFbnRpdGllcyh7dHlwZTplfSl7aWYodGhpcy51c2VJbmRleClyZXR1cm4gZih0aGlzLmJ5VHlwZS5nZXQoZSk/LnNpemU/PzApO2xldCB0PTA7Zm9yKGxldCByIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihKKHIpJiZyLnR5cGU9PT1lKXQrPTE7cmV0dXJuIGYodCl9YXN5bmMgY2hlY2tzdW0oZSl7bGV0IHQ9W107Zm9yKGxldCByIG9mIHRoaXMuZW50cy52YWx1ZXMoKSl0LnB1c2goVXIocikpO3JldHVybiBEcih0LGUpfX1mdW5jdGlvbiBGdShlKXtsZXQgdD1nbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZTtpZih0eXBlb2YgdCE9PSJmdW5jdGlvbiIpe3F1ZXVlTWljcm90YXNrKGUpO3JldHVybn10KCgpPT57dChlKX0pfWFzeW5jIGZ1bmN0aW9uIFBhKGUpe2lmKGU/LnZlcmJvc2UhPT12b2lkIDApY28oZS52ZXJib3NlKTtsZXQgdD1lPy5uYW1lPz9hd2FpdCBTYShlPy5sYWJlbD8/IiIpLHI9YXdhaXQgRWEodCk7aWYoZT8uY2FjaGU9PT0hMSlyZXR1cm4gcjtyZXR1cm4gbmV3IGthKHIsdm9pZCAwLHtpbmRleGVzOmU/LmluZGV4ZXMsb3B0aW1pc3RpYzplPy5vcHRpbWlzdGljfSl9Y2xhc3Mga2F7bWVtO2R1cmFibGU7d2FybWVkPW5ldyBTZXQ7bGlzdGVuZXJzPW5ldyBTZXQ7Y2hhaW49UHJvbWlzZS5yZXNvbHZlKCk7b3B0aW1pc3RpYztpbmZsaWdodD0wO3dhcm1QPW5ldyBNYXA7Y29uc3RydWN0b3IoZSx0LHIpe2lmKHRoaXMuZHVyYWJsZT1lLHRoaXMub3B0aW1pc3RpYz1yPy5vcHRpbWlzdGljIT09ITEsWCgiQ2FjaGVkRW50REIgb3BlbiIse29wdGltaXN0aWM6dGhpcy5vcHRpbWlzdGljfSksdGhpcy5tZW09bmV3IENzKHQ/P1tdLHtpbmRleGVzOnI/LmluZGV4ZXN9KSx0KWZvcihsZXQgbiBvZiB0KXRoaXMud2FybWVkLmFkZChuLnR5cGUpfXN1YnNjcmliZShlKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnMuYWRkKGUpLCgpPT57dGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUpe2lmKGUuc2l6ZTwxKXJldHVybjtsZXQgdD1wZXJmb3JtYW5jZS5ub3coKTtYKCJlbWl0IHN0YXJ0Iix7dHlwZXM6Wy4uLmVdLGxpc3RlbmVyczp0aGlzLmxpc3RlbmVycy5zaXplfSk7Zm9yKGxldCByIG9mIHRoaXMubGlzdGVuZXJzKXIoZSk7WCgiZW1pdCBkb25lIix7bXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS10KX0pfXJ1bihlKXtsZXQgdD10aGlzLmNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5jaGFpbj10LnRoZW4oKCk9PntyZXR1cm59LCgpPT57cmV0dXJufSksdH1hcHBseShlKXtsZXQgdCxyO2lmKHRoaXMub3B0aW1pc3RpYyl7cj1HdSh0aGlzLm1lbSxlKS50eXBlcyx0PW5ldyBNYXA7Zm9yKGxldCBzIG9mIGUpe2xldCBpPUsocy5laWQpO3Quc2V0KGksQWEodGhpcy5tZW0uZW50cy5nZXQoaSkpKX10aGlzLmluZmxpZ2h0Kz0xLFgoImFwcGx5IG1lbSBwYXRjaGVkIix7b3BzOmUubGVuZ3RoLHR5cGVzOnI/Wy4uLnJdOltdLGluZmxpZ2h0OnRoaXMuaW5mbGlnaHR9KX1sZXQgbj10aGlzLnJ1bihhc3luYygpPT57WCgicGVyc2lzdCBzdGFydCIse29wczplLmxlbmd0aH0pO3RyeXtsZXQgcz1wZXJmb3JtYW5jZS5ub3coKSxpPWF3YWl0IHRoaXMuZHVyYWJsZS5hcHBseShlKTtpZihYKCJwZXJzaXN0IGR1cmFibGUuYXBwbHkgZG9uZSIse21zOk1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCktcyl9KSwhdGhpcy5vcHRpbWlzdGljKXtsZXR7Y2hhbmdlZDphLHN0YXR1czp1fT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUubWFwKChkKT0+ZC5laWQpKTtpZih0aGlzLmVtaXQoYSksdSE9PTApcmV0dXJue3N0YXRzOmUubWFwKCgpPT51KSx0eXBlczppLnR5cGVzLGVpZHM6aS5laWRzfTtyZXR1cm4gaX1sZXQgbz1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKylpZihpLnN0YXRzW2FdIT09MClvLnB1c2goZVthXS5laWQpO2lmKG8ubGVuZ3RoPjApe1goInBlcnNpc3QgcHVsbCByZWplY3RlZCBlaWRzIix7bjpvLmxlbmd0aH0pO2xldHtjaGFuZ2VkOmEsc3RhdHVzOnV9PWF3YWl0IHRoaXMucHVsbEVpZHMobyx0KTtpZih0aGlzLmVtaXQoYSksdSE9PTApcmV0dXJue3N0YXRzOmUubWFwKCgpPT51KSx0eXBlczppLnR5cGVzLGVpZHM6aS5laWRzfX1yZXR1cm4gWCgicGVyc2lzdCBkb25lIiksaX1maW5hbGx5e2lmKHRoaXMub3B0aW1pc3RpYyl0aGlzLmluZmxpZ2h0LT0xfX0pO2lmKHIpRnUoKCk9PntYKCJlbWl0IGFmdGVyIHBhaW50IiksdGhpcy5lbWl0KHIpfSk7cmV0dXJuIG59Y2xlYXIoKXtyZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2xldCBlPWF3YWl0IHRoaXMuZHVyYWJsZS5jbGVhcigpO2lmKGUhPT0wKXJldHVybiBlO2xldCB0PXRoaXMubWVtLmVudHMuc2l6ZT4wO3JldHVybiBhd2FpdCB0aGlzLm1lbS5jbGVhcigpLHRoaXMud2FybWVkLmNsZWFyKCksMH0pfWluZ2VzdEZyb21EdXJhYmxlKGUpe2xldCB0PVsuLi5lXS5sZW5ndGg7cmV0dXJuIFgoImluZ2VzdCBxdWV1ZWQiLHtlaWRzOnR9KSx0aGlzLnJ1bihhc3luYygpPT57bGV0IHI9cGVyZm9ybWFuY2Uubm93KCk7WCgiaW5nZXN0IHN0YXJ0Iix7ZWlkczp0fSk7bGV0e2NoYW5nZWQ6bixzdGF0dXM6c309YXdhaXQgdGhpcy5wdWxsRWlkcyhlKTtyZXR1cm4gWCgiaW5nZXN0IGRvbmUiLHttczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXIpLGNoYW5nZWQ6Wy4uLm5dfSksdGhpcy5lbWl0KG4pLHN9KX1hc3luYyBwdWxsRWlkcyhlLHQpe2xldCByPW5ldyBTZXQsbj1uZXcgU2V0O2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1LKHMpO2lmKG4uaGFzKGkpKWNvbnRpbnVlO24uYWRkKGkpO2xldFtvLGFdPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3cocyk7aWYoYSE9PTApcmV0dXJue2NoYW5nZWQ6cixzdGF0dXM6YX07bGV0IHU9dGhpcy5tZW0uZW50cy5nZXQoaSk7aWYodSE9PXZvaWQgMCYmbyE9PXZvaWQgMCYmVHModSxvKSljb250aW51ZTtpZih0KXtpZighJHUoQWEodSksdC5nZXQoaSkpKWNvbnRpbnVlfWlmKG8pe2lmKHRoaXMubWVtLnB1dChvKSwhdXx8IVd1KHUsbykpe2lmKEoobykpci5hZGQoby50eXBlKTtpZih1IT09dm9pZCAwJiZKKHUpKXIuYWRkKHUudHlwZSl9fWVsc2UgaWYodSE9PXZvaWQgMCl7aWYodGhpcy5tZW0uZGVsKGkpLEoodSkpci5hZGQodS50eXBlKX19cmV0dXJue2NoYW5nZWQ6cixzdGF0dXM6MH19YXN5bmMgd2FybVR5cGUoZSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybiAwO2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO1goIndhcm1UeXBlIHN0YXJ0Iix7dHlwZTplfSk7bGV0W3Isbl09YXdhaXQgdGhpcy5kdXJhYmxlLmdldEVudGl0aWVzKHt0eXBlOmV9KTtpZihuIT09MClyZXR1cm4gbjtpZihyKWZvcihsZXQgcyBvZiByKXtsZXQgaT1LKHMuZWlkKSxvPXRoaXMubWVtLmVudHMuZ2V0KGkpO2lmKCFvfHxUcyhzLG8pKXRoaXMubWVtLnB1dChzKX1yZXR1cm4gdGhpcy53YXJtZWQuYWRkKGUpLFgoIndhcm1UeXBlIGRvbmUiLHt0eXBlOmUsbjpyPy5sZW5ndGg/PzAsbXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS10KX0pLDB9YmVnaW5XYXJtKGUpe2lmKHRoaXMud2FybWVkLmhhcyhlKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDApO2xldCB0PXRoaXMud2FybVAuZ2V0KGUpO2lmKHQpcmV0dXJuIHQ7bGV0IHI9dGhpcy53YXJtVHlwZShlKS5maW5hbGx5KCgpPT57dGhpcy53YXJtUC5kZWxldGUoZSl9KTtyZXR1cm4gdGhpcy53YXJtUC5zZXQoZSxyKSxyfWVuc3VyZVdhcm0oZSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybjt0aGlzLmJlZ2luV2FybShlKS50aGVuKCh0KT0+e2lmKHQ9PT0wKXRoaXMuZW1pdChuZXcgU2V0KFtlXSkpfSl9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUsoZSk7aWYodGhpcy5tZW0uZW50cy5oYXModCkpcmV0dXJuIHRoaXMubWVtLmdldFJvdyhlKTtsZXRbcixuXT1hd2FpdCB0aGlzLmR1cmFibGUuZ2V0Um93KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO2lmKHIpe2xldCBzPXRoaXMubWVtLmVudHMuZ2V0KHQpO2lmKCFzfHxUcyhyLHMpKXRoaXMubWVtLnB1dChyKX1yZXR1cm4gdGhpcy5tZW0uZ2V0Um93KGUpfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhSih0KSlyZXR1cm4gZih2b2lkIDApO3JldHVybiBmKHQpfWFzeW5jIGdldEVudGl0aWVzKGUpe2lmKHRoaXMud2FybWVkLmhhcyhlLnR5cGUpKXJldHVybiBYKCJnZXRFbnRpdGllcyBtZW0iLHt0eXBlOmUudHlwZX0pLHRoaXMubWVtLmdldEVudGl0aWVzKGUpO2lmKHRoaXMuaW5mbGlnaHQ+MClyZXR1cm4gWCgiZ2V0RW50aXRpZXMgaW5mbGlnaHQtbWVtIix7dHlwZTplLnR5cGV9KSx0aGlzLmVuc3VyZVdhcm0oZS50eXBlKSx0aGlzLm1lbS5nZXRFbnRpdGllcyhlKTtYKCJnZXRFbnRpdGllcyBiZWdpbldhcm0iLHt0eXBlOmUudHlwZX0pO2xldCB0PWF3YWl0IHRoaXMuYmVnaW5XYXJtKGUudHlwZSk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIFgoImdldEVudGl0aWVzIGFmdGVyV2FybSIse3R5cGU6ZS50eXBlfSksdGhpcy5tZW0uZ2V0RW50aXRpZXMoZSl9YXN5bmMgY291bnRFbnRpdGllcyh7dHlwZTplfSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybiB0aGlzLm1lbS5jb3VudEVudGl0aWVzKHt0eXBlOmV9KTtpZih0aGlzLmluZmxpZ2h0PjApcmV0dXJuIHRoaXMuZW5zdXJlV2FybShlKSx0aGlzLm1lbS5jb3VudEVudGl0aWVzKHt0eXBlOmV9KTtsZXQgdD1hd2FpdCB0aGlzLmJlZ2luV2FybShlKTtpZih0IT09MClyZXR1cm4gYyh0KTtyZXR1cm4gdGhpcy5tZW0uY291bnRFbnRpdGllcyh7dHlwZTplfSl9YXN5bmMgY2hlY2tzdW0oZSl7cmV0dXJuIHRoaXMuZHVyYWJsZS5jaGVja3N1bShlKX19ZnVuY3Rpb24gV3UoZSx0KXtpZihKKGUpIT09Sih0KSlyZXR1cm4hMTtpZihlLmN0ciE9PXQuY3RyKXJldHVybiExO2lmKGUudXBkYXRlZEF0LmdldFRpbWUoKSE9PXQudXBkYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZighWShlLmVpZCx0LmVpZCkpcmV0dXJuITE7aWYoIUooZSl8fCFKKHQpKXJldHVybiEwO2lmKGUuY3JlYXRlZEF0LmdldFRpbWUoKSE9PXQuY3JlYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZihlLnR5cGUhPT10LnR5cGUpcmV0dXJuITE7aWYoIWp1KGUucGlkLHQucGlkKSlyZXR1cm4hMTtpZighenUoZS50YWdzLHQudGFncykpcmV0dXJuITE7cmV0dXJuIFh1KGUuYm9keSx0LmJvZHkpfWZ1bmN0aW9uIHp1KGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYoZT09PXZvaWQgMHx8dD09PXZvaWQgMClyZXR1cm4hMTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl0hPT10W3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGp1KGUsdCl7aWYoZT09PXZvaWQgMCYmdD09PXZvaWQgMClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO3JldHVybiBZKGUsdCl9ZnVuY3Rpb24gWHUoZSx0KXtpZihPYmplY3QuaXMoZSx0KSlyZXR1cm4hMDtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIFkoZSx0KTtpZihlIGluc3RhbmNlb2YgRGF0ZSYmdCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7dHJ5e3JldHVybiBZKFllKGUpLFllKHQpKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gVHMoZSx0KXtsZXQgcj1lLnVwZGF0ZWRBdC5nZXRUaW1lKCksbj10LnVwZGF0ZWRBdC5nZXRUaW1lKCk7aWYociE9PW4pcmV0dXJuIHI+bjtyZXR1cm4gZS5jdHI+dC5jdHJ9ZnVuY3Rpb24gQWEoZSl7aWYoZT09PXZvaWQgMClyZXR1cm47cmV0dXJue3Q6ZS51cGRhdGVkQXQuZ2V0VGltZSgpLGN0cjplLmN0cn19ZnVuY3Rpb24gJHUoZSx0KXtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiBlPT09dDtyZXR1cm4gZS50PT09dC50JiZlLmN0cj09PXQuY3RyfWZ1bmN0aW9uIEd1KGUsdCl7bGV0IHI9bmV3IFNldCxuPVtdO2ZvcihsZXQgcyBvZiB0KXtsZXQgaT1LKHMuZWlkKSxvPWUuZW50cy5nZXQoaSksW2EsdV09U3QobyxzKTtpZih1IT09MCl7bi5wdXNoKHUpO2NvbnRpbnVlfWlmKGE9PT12b2lkIDApe24ucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCBkIG9mIGJ0KG8sYSkpci5hZGQoZCk7ZS5wdXQoYSksbi5wdXNoKDApfXJldHVybntzdGF0czpuLHR5cGVzOnJ9fUIoKTtZdCgpO2Z1bmN0aW9uIFF1KGUpe3JldHVybiJjbG9zZSJpbiBlJiZ0eXBlb2YgZS5jbG9zZT09PSJmdW5jdGlvbiJ9Y2xhc3MgTXN7Y2xpZW50O3N0b3JlO2VudERCO2JvdW5kTGFiZWw9IiI7cG9zdDt3aGVuUmVhZHk7cmVzb2x2ZVJlYWR5O3JlamVjdFJlYWR5O2NvbnN0cnVjdG9yKGUpe3RoaXMucG9zdD1lLHRoaXMud2hlblJlYWR5PW5ldyBQcm9taXNlKCh0LHIpPT57dGhpcy5yZXNvbHZlUmVhZHk9dCx0aGlzLnJlamVjdFJlYWR5PXJ9KX1hc3luYyBiaW5kU3RvcmVzKGUpe2lmKHRoaXMuY2xpZW50IT09dm9pZCAwKXJldHVybjt0cnl7bGV0IHQ9YXdhaXQgbWEoRXQsZS5kYXRhKSxyPWF3YWl0IFBhKHtjYWNoZTohMSxuYW1lOmUuZW50c30pLG49bmV3IEJyKHIuYXBwbHksKCk9PnIuY2xlYXIoKSwobyk9PntpZihvLmxlbmd0aDwxKXJldHVybjt0aGlzLnBvc3Qoe2tpbmQ6ImRpcnR5IixlaWRzOm8ubWFwKChhKT0+YS5zbGljZSgpKX0pfSkscz1uLmNsZWFyO24uY2xlYXI9YXN5bmMoKT0+e2xldCBvPWF3YWl0IHMoKTtpZihvPT09MCl0aGlzLnBvc3Qoe2tpbmQ6IndpcGVkIn0pO3JldHVybiBvfTtsZXQgaT1uZXcgWW4obmV3IFVuLG4sdCxHaSxFdCk7dGhpcy5jbGllbnQ9aSx0aGlzLnN0b3JlPXQsdGhpcy5lbnREQj1yLHRoaXMuYm91bmRMYWJlbD1lLmxhYmVsLGkuY2xpZW50U3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0Q2xpZW50U3RhdGUoKX0pLGkueGZlclN0YXRlLmxpc3RlbigoKT0+e3RoaXMuZW1pdFhmZXJTdGF0ZSgpfSksYXdhaXQgdGhpcy5lbWl0WGZlclN0YXRlKCksdGhpcy5wb3N0KHtraW5kOiJyZWFkeSJ9KSx0aGlzLm1hcmtSZWFkeSgpfWNhdGNoKHQpe2xldCByPXQgaW5zdGFuY2VvZiBFcnJvcj90OkVycm9yKFN0cmluZyh0KSk7dGhyb3cgdGhpcy5wb3N0KHtraW5kOiJpbml0RXJyb3IiLG1lc3NhZ2U6ci5tZXNzYWdlfSksdGhpcy5mYWlsUmVhZHkocikscn19bWFya1JlYWR5KCl7bGV0IGU9dGhpcy5yZXNvbHZlUmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLGUpZSgpfWZhaWxSZWFkeShlKXtsZXQgdD10aGlzLnJlamVjdFJlYWR5O2lmKHRoaXMucmVzb2x2ZVJlYWR5PXZvaWQgMCx0aGlzLnJlamVjdFJlYWR5PXZvaWQgMCx0KXQoZSl9cmVxdWlyZUNsaWVudCgpe2lmKCF0aGlzLmNsaWVudCl0aHJvdyBFcnJvcigiV29ya2VyUnVudGltZSBub3QgaW5pdGlhbGl6ZWQiKTtyZXR1cm4gdGhpcy5jbGllbnR9YXN5bmMgZW1pdENsaWVudFN0YXRlKCl7bGV0IGU9dGhpcy5jbGllbnQ7aWYoIWUpcmV0dXJuO2xldCB0PWF3YWl0IGUuY2xpZW50U3RhdGUuZ2V0KCk7dGhpcy5wb3N0KHtraW5kOiJjbGllbnRTdGF0ZSIsY29ubmVjdGVkOnQuY29ubmVjdGVkfSl9YXN5bmMgZW1pdFhmZXJTdGF0ZSgpe2xldCBlPXRoaXMuY2xpZW50O2lmKCFlKXJldHVybjtsZXQgdD1hd2FpdCBlLnhmZXJTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6InhmZXJTdGF0ZSIsc3RhdGU6dH0pfWhvc3RGcm9tU2VyaWFsaXplZChlKXtyZXR1cm57aGFuZGxlOm5ldyBVUkwoZS5oYW5kbGUpLGxhYmVsOmUubGFiZWwsaWR4OmUuaWR4fX1hc3luYyBoYW5kbGUoZSl7aWYoZS5vcD09PSJiaW5kIil7YXdhaXQgdGhpcy5iaW5kU3RvcmVzKGUpO3JldHVybn1hd2FpdCB0aGlzLndoZW5SZWFkeTtsZXQgdD10aGlzLnJlcXVpcmVDbGllbnQoKTtzd2l0Y2goZS5vcCl7Y2FzZSJwaW5nIjpyZXR1cm4icG9uZyI7Y2FzZSJzZXRTZWVkIjp7bGV0W3Isbl09aWUuZnJvbUJ5dGVzKGUuc2VlZCk7aWYoZS5zZWVkLmZpbGwoMCksbiE9PTApdGhyb3cgbmV3IFBlKG4pO2xldCBzPWF3YWl0IHQuYWRvcHQocix0aGlzLmJvdW5kTGFiZWwpO2lmKHMhPT0wKXRocm93IG5ldyBQZShzKTtyZXR1cm59Y2FzZSJsaW5rIjp7YXdhaXQgdC5saW5rKHRoaXMuaG9zdEZyb21TZXJpYWxpemVkKGUuaG9zdCksZS5jb25uZWN0Pz8hMCk7cmV0dXJufWNhc2UidW5saW5rIjp7YXdhaXQgdC51bmxpbmsoZS5sYWJlbCk7cmV0dXJufWNhc2UiY29ubmVjdCI6e2F3YWl0IHQuY29ubmVjdChlLmxpc3Rlbj8/ITAsZS5zeW5jPz8hMCk7cmV0dXJufWNhc2UiZGlzY29ubmVjdCI6e2F3YWl0IHQuZGlzY29ubmVjdCgpO3JldHVybn1jYXNlInN5bmMiOnJldHVybiBhd2FpdCB0LnN5bmMoKTtjYXNlInJlYnVpbGQiOnJldHVybiBhd2FpdCB0LnJlYnVpbGQoe2NoZWNrSG9zdDplLmNoZWNrSG9zdD8/ITB9KTtjYXNlInJlY29uY2lsZSI6e2xldFtyLG5dPWF3YWl0IHQucmVjb25jaWxlKGUuaG9zdExhYmVsLHtwdWxsOmUucHVsbCxwdXNoOmUucHVzaCxzeW5jOmUuc3luY30pO2lmKG4hPT0wKXRocm93IG5ldyBQZShuKTtpZighcil0aHJvdyBuZXcgUGUoMTIpO3JldHVybiByfWNhc2UibXNnY2hlY2siOnJldHVybiBhd2FpdCB0Lm1zZ2NoZWNrKCk7Y2FzZSJlbnRjaGVjayI6e2xldCByPXRoaXMuZW50REI7aWYoIXIpdGhyb3cgbmV3IFBlKDEyKTtsZXRbbixzXT1hd2FpdCByLmNoZWNrc3VtKEV0KTtpZihzIT09MCl0aHJvdyBuZXcgUGUocyk7aWYoIW4pdGhyb3cgbmV3IFBlKDEyKTtyZXR1cm4gbn1jYXNlIndpcGUiOntpZihhd2FpdCB0LndpcGUoe21zZ3M6ZS5tc2dzLGVudHM6ZS5lbnRzLG1ldGE6ZS5tZXRhLHNlZWQ6ZS5zZWVkfSksZS5zZWVkPT09ITApe3RoaXMuc3RvcmU/LmNsb3NlKCk7bGV0IHI9dGhpcy5lbnREQjtpZihyIT09dm9pZCAwJiZRdShyKSlyLmNsb3NlKCl9cmV0dXJufWNhc2UiaW1wb3J0Ijp7bGV0IHI9ZS5ieXRlcy5zbGljZSgpLG49bmV3IEJsb2IoW3JdKSxzPW5ldyBGaWxlKFtuXSwiaW1wb3J0LmRpcCIpO3JldHVybiBhd2FpdCB0LmltcG9ydChzKX1jYXNlImV4cG9ydCI6e2xldFtyLG5dPWF3YWl0IHQuZXhwb3J0Qnl0ZXMoKTtpZihuIT09MCl0aHJvdyBuZXcgUGUobik7aWYoIXIpdGhyb3cgbmV3IFBlKDEyKTtyZXR1cm4gcn1jYXNlImdldFhmZXJTdGF0ZSI6cmV0dXJuIGF3YWl0IHQueGZlclN0YXRlLmdldCgpO2RlZmF1bHQ6e2xldCByPWU7dGhyb3cgRXJyb3IoInVua25vd24gd29ya2VyIGNvbW1hbmQiKX19fX1jbGFzcyBQZSBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcihlKXtzdXBlcihgV29ya2VyU3RhdHVzRXJyb3I6ICR7UFtlXX1gKTt0aGlzLnN0YXR1cz1lO3RoaXMubmFtZT0iV29ya2VyU3RhdHVzRXJyb3IifX1mdW5jdGlvbiBacihlLHQpe3JldHVybntraW5kOiJyZXBseSIsaWQ6ZSxvazohMCxyZXN1bHQ6dH19ZnVuY3Rpb24gUnMoZSx0KXtyZXR1cm57a2luZDoicmVwbHkiLGlkOmUsb2s6ITEsc3RhdHVzOnR9fXZhciBRZT1nbG9iYWxUaGlzLFl1PW5ldyBNcygoZSx0KT0+e2lmKHQmJnQubGVuZ3RoPjApUWUucG9zdE1lc3NhZ2UoZSx0KTtlbHNlIFFlLnBvc3RNZXNzYWdlKGUpfSk7UWUub25tZXNzYWdlPShlKT0+e2xldCB0PWUuZGF0YTtpZighVnModCkpcmV0dXJuO0p1KHQpfTthc3luYyBmdW5jdGlvbiBKdShlKXt0cnl7bGV0IHQ9YXdhaXQgWXUuaGFuZGxlKGUpO2lmKChlLm9wPT09ImV4cG9ydCJ8fGUub3A9PT0ibXNnY2hlY2sifHxlLm9wPT09ImVudGNoZWNrIikmJnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtsZXQgcj10LnNsaWNlKCk7UWUucG9zdE1lc3NhZ2UoWnIoZS5pZCxyKSxbci5idWZmZXJdKTtyZXR1cm59aWYoZS5vcD09PSJyZWNvbmNpbGUiJiZ0JiZ0eXBlb2YgdD09PSJvYmplY3QiJiYibXNnY2hlY2siaW4gdCYmdC5tc2djaGVjayBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCByPXQubXNnY2hlY2suc2xpY2UoKSxuPXsuLi50LG1zZ2NoZWNrOnJ9O1FlLnBvc3RNZXNzYWdlKFpyKGUuaWQsbiksW3IuYnVmZmVyXSk7cmV0dXJufVFlLnBvc3RNZXNzYWdlKFpyKGUuaWQsdCkpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBQZSl7UWUucG9zdE1lc3NhZ2UoUnMoZS5pZCx0LnN0YXR1cykpO3JldHVybn1jb25zb2xlLmVycm9yKCJ3b3JrZXIgY29tbWFuZCBmYWlsZWQiLHQpLFFlLnBvc3RNZXNzYWdlKFJzKGUuaWQsMTIpKX19Cg==";function La(){if(typeof hs!=="string"||hs.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(hs)}function Pa(){if(bs!==void 0)return bs;let t=new Blob([La()],{type:"text/javascript"});return bs=URL.createObjectURL(t),bs}function ll(){if(Zs===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Zs(Pa(),{type:"module"})}function Xs(t,e,n){if(Ji===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)Ji.call(t,e,{transfer:n});else Ji.call(t,e)}var Zs,Ji,bs;var zi=v(()=>{Zs=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,Ji=Zs===void 0?void 0:Zs.prototype.postMessage});async function cl(t){if(t?.credId!==void 0)return m(t.credId);return rl(t)}async function Ni(t,e,n){let s=re();if(s!==0)return s;let[i,r]=ie(n);if(r!==0)return r;if(i===void 0)return 9;await ds();let o=new Uint8Array(e.byteLength);o.set(e);let l={largeBlob:{write:o.buffer}},a={publicKey:{challenge:Mt(se),rpId:i,allowCredentials:[{type:Yt,id:wt(t)}],userVerification:"required",extensions:l,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(a)}catch(h){if(!as(h))return Ct(h),30;Ee();try{d=await navigator.credentials.get(a)}catch(b){return Ct(b),30}}}catch(h){return Ct(h),30}finally{o.fill(0)}let[u,p]=oe(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}function al(t,e){return Ni(t,new Uint8Array(gt),e)}var dl=v(()=>{K();He();C();le();ys()});async function Ma(){return ms("extension:prf")}var Gs,bn="diplomatic-prf";var fs=v(()=>{le();Gs=new TextEncoder().encode("diplomatic.prf.v1")});function wa(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function Ua(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function ul(t){if(t===void 0)return;let e=cs(t);if(e.byteLength<Ei){e.fill(0);return}if(e.byteLength===Ei)return e;let n=e.slice(0,Ei);return e.fill(0),n}async function Ba(t){let e=re();if(e!==0)return c(e);let[n,s]=ie(t);if(s!==0)return c(s);let i=t?.userName??bn,r=t?.displayName??i,o=Mt(16),l=t?.authenticatorAttachment==="cross-platform",a={residentKey:l?"discouraged":"required",requireResidentKey:!l,userVerification:l?"preferred":"required"};if(t?.authenticatorAttachment!==void 0)a.authenticatorAttachment=t.authenticatorAttachment;let d={challenge:Mt(se),rp:{id:n,name:t?.rpName??os},user:{id:o,name:i,displayName:r},pubKeyCredParams:ls,authenticatorSelection:a,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((S)=>({type:Yt,id:wt(S)}))}:{}},u=t?.salt!==void 0?wt(t.salt):void 0,p=(S)=>us({publicKey:{...d,extensions:S&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),y;try{y=await p(u!==void 0)}catch(S){if(u===void 0||!Ua(S))return Ct(S),c(30);try{y=await p(!1)}catch(g){return Ct(g),c(30)}}let[h,b]=oe(y);if(b!==0)return c(b);let Z=h.getClientExtensionResults(),X=ul(Z.prf?.results?.first),f=Z.prf?.enabled===!0||X!==void 0;if(l&&X!==void 0)X.fill(0);return m({credId:new Uint8Array(h.rawId),userId:new Uint8Array(o),prfEnabled:f,prf:l?void 0:X,attachment:wi(h.authenticatorAttachment),transports:Ui(h),aaguid:il(h)})}async function pl(t){let e=re();if(e!==0)return c(e);let[n,s]=ie(t);if(s!==0)return c(s);let i=t?.salt??Gs,o={eval:{first:wt(i)}},l=t?.salts;if(l!==void 0&&l.length>0){let Z={};for(let X of l){if(X.credId.byteLength===0)continue;Z[qs(X.credId)]={first:wt(X.salt)}}o.evalByCredential=Z}let a={challenge:Mt(se),rpId:n,userVerification:"preferred",extensions:{prf:o}};if(t?.hints!==void 0)a.hints=t.hints;let d=wa(t?.credId);if(d.length>0)a.allowCredentials=d.map((Z)=>({type:Yt,id:wt(Z)}));let u;try{u=await ps({publicKey:a})}catch(Z){return Ct(Z),c(30)}let[p,y]=oe(u);if(y!==0)return c(y);let h=p.getClientExtensionResults().prf?.results;if(h?.first===void 0)return c(7);let b=ul(h.first);if(b===void 0)return c(27);return m({prf:b,credId:new Uint8Array(p.rawId),attachment:wi(p.authenticatorAttachment),transports:Ui(p)})}async function ml(t){let e=t?.salt??Gs,n=t?.credId,s=n,i=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),r,o;if(i){let[u,p]=await Ba({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??bn,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return c(p);if(!u.prfEnabled)return c(30);s=u.credId,r=u,o=u.prf}let l=(u,p,y,h)=>m({prf:u,salt:e.slice(),credId:p.slice(),userId:r?.userId===void 0?void 0:r.userId.slice(),attachment:y??r?.attachment,transports:h??r?.transports,aaguid:r?.aaguid===void 0?void 0:r.aaguid.slice()});if(o!==void 0&&r!==void 0)return l(o,r.credId,r.attachment,r.transports);let[a,d]=await pl({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return c(d);return l(a.prf,a.credId,a.attachment,a.transports)}async function yl(t,e){let n=[],s=[],i=!1;for(let d of t){if(d.credId.byteLength===0)continue;n.push(d.credId);let u=d.salt??e.salt;if(!D(u,e.salt))i=!0;s.push({credId:d.credId,salt:u})}let[r,o]=await pl({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt,salts:i?s:void 0});if(o!==0)return c(o);let l=t.find((d)=>D(d.credId,r.credId)),a=l===void 0?t:[l,...t.filter((d)=>d!==l)];return m({prf:r.prf,credId:r.credId.slice(),order:a})}var Ei=32;var hl=v(()=>{it();K();C();le();fs()});async function bl(t,e){return Wt({parent:t,purpose:nt.RealmKey,kdm:e})}async function Zl(t,e){return Wt({parent:t,purpose:nt.RealmID,kdm:e})}async function Xl(t,e){return Wt({parent:t,purpose:nt.HostRLM,kdm:e})}var Gl=v(()=>{at()});var $o={};sc($o,{Enclave:()=>rt,MUSEC_MIN_LEN:()=>Is,asMasterSeed:()=>Ss,fromSeedHosts:()=>fl});function Na(t){return t.map((e)=>({handle:e.handle,label:e.label,idx:e.idx??0}))}function fl(t){if(t.byteLength===0||t.every((l)=>l===0))return c(22);if(t.byteLength<gt+1)return c(14);let e=t.subarray(0,gt);if(e.every((l)=>l===0))return c(22);let n=new E(t.subarray(gt)),[s,i]=n.readStruct(Yi);if(i!==0)return c(i);if(s===void 0)return c(14);if(!n.done())return c(14);let[r,o]=rt.fromBytes(e);if(o!==0)return c(o);return m({enclave:r,hosts:s.hosts.map((l)=>({...l}))})}function Ss(t){if(t.byteLength!==gt)return c(10);return[t,0]}function Ea(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++){let i=t[s],r=e[s];if(i===void 0||r===void 0)return!1;n|=i^r}return n===0}class rt{#t;constructor(t){this.#t=t}static async fromRandom(t){if(t.byteLength<Is)return c(10);let e=await ni(),n=ue(e,t);try{let s=await rn(n),[i,r]=Ss(s);if(r!==0)return c(r);return m(new rt(i))}finally{e.fill(0),n.fill(0),t.fill(0)}}static fromBytes(t){let[e,n]=Ss(t);if(n!==0)return c(n);let[s,i]=Ss(e.slice());if(i!==0)return c(i);return m(new rt(s))}async sealWithPasskey(t){let[e,n]=await ml(t);if(n!==0)return c(n);try{let[s,i]=await this.#n(e.prf);if(i!==0)return c(i);return m({sealedMaster:s,salt:e.salt,credId:e.credId,userId:e.userId,attachment:e.attachment,transports:e.transports,aaguid:e.aaguid})}finally{e.prf.fill(0)}}async bind(t,e){if(e!==void 0){for(let o of e)if(!await this.#s(o.credId,o.tag))return c(10)}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return c(s);let[i,r]=await this.#e(n.credId);if(r!==0)return c(r);return m({...n,tag:i})}static async unsealWithPasskey(t,e){if(t.length===0)return c(22);let[n,s]=await yl(t,e);if(s!==0)return c(s);try{for(let i of n.order){let[r]=await rt.#r(i.sealedMaster,n.prf);if(r!==void 0)return m({enclave:r,credId:n.credId})}return c(20)}finally{n.prf.fill(0)}}async sealWithIkm(t){try{return await this.#n(t)}finally{t.fill(0)}}static async unsealWithIkm(t,e){try{return await rt.#r(t,e)}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){let[n,s]=await cl(e);if(s!==0)return c(s);let[i,r]=this.#o(t);if(r!==0)return c(r);try{let o=await Ni(n,i,e);if(o!==0)return c(o);return m(n)}finally{i.fill(0)}}static async fromLargeBlob(t){let[e,n]=await ol(t?.credId,t);if(n!==0)return c(n);try{let[s,i]=fl(e.blob);if(i!==0)return c(i);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static clearLargeBlob(t,e){return al(t,e)}async dumpToTty(){return 21}static pairRequest(){return ze.create()}async pairAccept(t,e,n){if(n.userControlsBothSidesOfPair!==!0)return c(10);let[s,i]=await qo(t);if(i!==0)return c(i);try{let[r,o]=this.#o(e);if(o!==0)return c(o);try{try{let l=await sn(r,s.key);return Hi(ue(s.pub,l))}catch{return c(12)}}finally{r.fill(0)}}finally{s.key.fill(0)}}spawnSyncWorker(t){let e=ll(),n=this.#t.slice();return Xs(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}async realmID(t){return Zl(this.#t,t)}async hostRlm(t,e){let[n,s]=await this.realmID(t);if(s!==0)return c(s);try{return await Xl(n,e)}finally{n.fill(0)}}async realmForRlm(t,e,n){for(let s of n){let[i,r]=await this.hostRlm(s,t);if(r!==0)return c(r);let o=Ea(i,e);if(i.fill(0),o)return m({label:s.label,index:s.index})}return c(13)}deriveCipher(t,e,n=F){let s=t.slice(),i={label:n.label,index:n.index},r=(a)=>this.#d(s,a,i),o=(a)=>this.#u(s,a,i);return{encrypt:Object.freeze({encrypt:r}),decrypt:Object.freeze({decrypt:o}),both:Object.freeze({encrypt:r,decrypt:o})}[e]}async deriveIdentity(t){let e={label:t.label,index:t.index},[n,s]=await this.#a(e);if(s!==0)return c(s);let i=n.publicKey;return n.privateKey.fill(0),m(Object.freeze({publicKey:i,sign:(r)=>this.#m(e,r),kdmFor:(r)=>this.#y(e,r)}))}async fingerprint(t=F){return await Wt({parent:this.#t,purpose:nt.Fingerprint,kdm:t})}async#e(t){return await Wt({parent:this.#t,purpose:nt.BindTag,kdm:t})}async#s(t,e){if(e.byteLength!==Ja)return!1;let[n,s]=await this.#e(t);if(s!==0)return!1;try{if(n.byteLength!==e.byteLength)return!1;let i=0;for(let r=0;r<n.byteLength;r++){let o=n[r],l=e[r];if(o===void 0||l===void 0)return!1;i|=o^l}return i===0}finally{n.fill(0)}}static async#i(t){if(t.byteLength<za)return c(10);return Wt({parent:t,purpose:nt.Bind,kdm:F})}async#n(t){let[e,n]=await rt.#i(t);if(n!==0)return c(n);try{let s=await sn(this.#t,e);return $t(s)}catch{return c(12)}finally{e.fill(0)}}static async#r(t,e){let[,n]=$t(t);if(n!==0)return c(n);let[s,i]=await rt.#i(e);if(i!==0)return c(i);let r;try{try{r=await Re(t,s)}catch{return c(20)}return rt.fromBytes(r)}finally{s.fill(0),r?.fill(0)}}#o(t){let e=new z,n=e.writeStruct(Yi,{hosts:Na(t)});if(n!==0)return c(n);let s=e.result(),i=new Uint8Array(gt+s.byteLength);return i.set(this.#t,0),i.set(s,gt),[i,0]}async#d(t,e,n){let[s,i]=await this.#l(t,n);if(i!==0)return c(i);try{try{return m(await sn(e,s))}catch{return c(29)}}finally{s.fill(0)}}async#u(t,e,n){let[s,i]=await this.#l(t,n);if(i!==0)return c(i);try{try{return m(await Re(e,s))}catch{return c(20)}}finally{s.fill(0)}}async#l(t,e){let[n,s]=await this.#p(e);if(s!==0)return c(s);try{return await Wt({parent:n,purpose:nt.Cipher,kdm:t})}finally{n.fill(0)}}async#p(t){return bl(this.#t,t)}async#c(t){return await Wt({parent:this.#t,purpose:nt.Identity,kdm:t})}async#a(t){let[e,n]=await this.#c(t);if(n!==0)return c(n);try{try{return m(await si(Fa(e)))}catch{return c(29)}}finally{e.fill(0)}}async#m(t,e){let[n,s]=await this.#a(t);if(s!==0)return c(s);try{try{return m(await ii(e,n.privateKey))}catch{return c(29)}}finally{n.privateKey.fill(0)}}async#y(t,e){let[n,s]=await this.#c(t);if(s!==0)return c(s);try{let[i,r]=await Wt({parent:n,purpose:nt.BagKdm,kdm:e});if(r!==0)return c(r);try{return m(i.slice(0,jt))}finally{i.fill(0)}}finally{n.fill(0)}}}function Fa(t){return t}function Sl(t){for(let e of Object.getOwnPropertyNames(t)){if(Qa.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}var Ja=32,za=16,Is=32,Qa;var Ne=v(()=>{it();st();jo();K();He();C();at();on();ki();ys();zi();dl();hl();Gl();Qa=new Set(["constructor","prototype","length","name"]);Sl(rt);Sl(rt.prototype)});function Gr(t){let e=t.length,n=0,s=0;while(s<e){let i=t.charCodeAt(s++);if((i&4294967168)===0){n++;continue}else if((i&4294965248)===0)n+=2;else{if(i>=55296&&i<=56319){if(s<e){let r=t.charCodeAt(s);if((r&64512)===56320)++s,i=((i&1023)<<10)+(r&1023)+65536}}if((i&4294901760)===0)n+=3;else n+=4}}return n}function ic(t,e,n){let s=t.length,i=n,r=0;while(r<s){let o=t.charCodeAt(r++);if((o&4294967168)===0){e[i++]=o;continue}else if((o&4294965248)===0)e[i++]=o>>6&31|192;else{if(o>=55296&&o<=56319){if(r<s){let l=t.charCodeAt(r);if((l&64512)===56320)++r,o=((o&1023)<<10)+(l&1023)+65536}}if((o&4294901760)===0)e[i++]=o>>12&15|224,e[i++]=o>>6&63|128;else e[i++]=o>>18&7|240,e[i++]=o>>12&63|128,e[i++]=o>>6&63|128}e[i++]=o&63|128}}var rc=new TextEncoder,oc=50;function lc(t,e,n){rc.encodeInto(t,e.subarray(n))}function fr(t,e,n){if(t.length>oc)lc(t,e,n);else ic(t,e,n)}var cc=4096;function Cs(t,e,n){let s=e,i=s+n,r=[],o="";while(s<i){let l=t[s++];if((l&128)===0)r.push(l);else if((l&224)===192){let a=t[s++]&63;r.push((l&31)<<6|a)}else if((l&240)===224){let a=t[s++]&63,d=t[s++]&63;r.push((l&31)<<12|a<<6|d)}else if((l&248)===240){let a=t[s++]&63,d=t[s++]&63,u=t[s++]&63,p=(l&7)<<18|a<<12|d<<6|u;if(p>65535)p-=65536,r.push(p>>>10&1023|55296),p=56320|p&1023;r.push(p)}else r.push(l);if(r.length>=cc)o+=String.fromCharCode(...r),r.length=0}if(r.length>0)o+=String.fromCharCode(...r);return o}var ac=new TextDecoder,dc=200;function uc(t,e,n){let s=t.subarray(e,e+n);return ac.decode(s)}function Sr(t,e,n){if(n>dc)return uc(t,e,n);else return Cs(t,e,n)}class Se{type;data;constructor(t,e){this.type=t,this.data=e}}class bt extends Error{constructor(t){super(t);let e=Object.create(bt.prototype);Object.setPrototypeOf(this,e),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:bt.name})}}var Ie=4294967295;function Ir(t,e,n){let s=n/4294967296,i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Wn(t,e,n){let s=Math.floor(n/4294967296),i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function gn(t,e){let n=t.getInt32(e),s=t.getUint32(e+4);return n*4294967296+s}function Vr(t,e){let n=t.getUint32(e),s=t.getUint32(e+4);return n*4294967296+s}var pc=-1,mc=4294967295,yc=17179869183;function hc({sec:t,nsec:e}){if(t>=0&&e>=0&&t<=yc)if(e===0&&t<=mc){let n=new Uint8Array(4);return new DataView(n.buffer).setUint32(0,t),n}else{let n=t/4294967296,s=t&4294967295,i=new Uint8Array(8),r=new DataView(i.buffer);return r.setUint32(0,e<<2|n&3),r.setUint32(4,s),i}else{let n=new Uint8Array(12),s=new DataView(n.buffer);return s.setUint32(0,e),Wn(s,4,t),n}}function bc(t){let e=t.getTime(),n=Math.floor(e/1000),s=(e-n*1000)*1e6,i=Math.floor(s/1e9);return{sec:n+i,nsec:s-i*1e9}}function Zc(t){if(t instanceof Date){let e=bc(t);return hc(e)}else return null}function Xc(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength);switch(t.byteLength){case 4:{let n=e.getUint32(0),s=0;return{sec:n,nsec:0}}case 8:{let n=e.getUint32(0),s=e.getUint32(4),i=(n&3)*4294967296+s,r=n>>>2;return{sec:i,nsec:r}}case 12:{let n=gn(e,4),s=e.getUint32(0);return{sec:n,nsec:s}}default:throw new bt(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${t.length}`)}}function Gc(t){let e=Xc(t);return new Date(e.sec*1000+e.nsec/1e6)}var Wr={type:pc,encode:Zc,decode:Gc};class Ve{static defaultCodec=new Ve;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(Wr)}register({type:t,encode:e,decode:n}){if(t>=0)this.encoders[t]=e,this.decoders[t]=n;else{let s=-1-t;this.builtInEncoders[s]=e,this.builtInDecoders[s]=n}}tryToEncode(t,e){for(let n=0;n<this.builtInEncoders.length;n++){let s=this.builtInEncoders[n];if(s!=null){let i=s(t,e);if(i!=null){let r=-1-n;return new Se(r,i)}}}for(let n=0;n<this.encoders.length;n++){let s=this.encoders[n];if(s!=null){let i=s(t,e);if(i!=null)return new Se(n,i)}}if(t instanceof Se)return t;return null}decode(t,e,n){let s=e<0?this.builtInDecoders[-1-e]:this.decoders[e];if(s)return s(t,e,n);else return new Se(e,t)}}function fc(t){return t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer}function Oe(t){if(t instanceof Uint8Array)return t;else if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);else if(fc(t))return new Uint8Array(t);else return Uint8Array.from(t)}var Sc=100,Ic=2048;class Kn{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??Ve.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.maxDepth=t?.maxDepth??Sc,this.initialBufferSize=t?.initialBufferSize??Ic,this.sortKeys=t?.sortKeys??!1,this.forceFloat32=t?.forceFloat32??!1,this.ignoreUndefined=t?.ignoreUndefined??!1,this.forceIntegerToFloat=t?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new Kn({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(t){if(this.entered)return this.clone().encodeSharedRef(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(t){if(this.entered)return this.clone().encode(t);try{return this.entered=!0,this.reinitializeState(),this.doEncode(t,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(t,e){if(e>this.maxDepth)throw Error(`Too deep objects in depth ${e}`);if(t==null)this.encodeNil();else if(typeof t==="boolean")this.encodeBoolean(t);else if(typeof t==="number")if(!this.forceIntegerToFloat)this.encodeNumber(t);else this.encodeNumberAsFloat(t);else if(typeof t==="string")this.encodeString(t);else if(this.useBigInt64&&typeof t==="bigint")this.encodeBigInt64(t);else this.encodeObject(t,e)}ensureBufferSizeToWrite(t){let e=this.pos+t;if(this.view.byteLength<e)this.resizeBuffer(e*2)}resizeBuffer(t){let e=new ArrayBuffer(t),n=new Uint8Array(e),s=new DataView(e);n.set(this.bytes),this.view=s,this.bytes=n}encodeNil(){this.writeU8(192)}encodeBoolean(t){if(t===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber(t){if(!this.forceIntegerToFloat&&Number.isSafeInteger(t))if(t>=0)if(t<128)this.writeU8(t);else if(t<256)this.writeU8(204),this.writeU8(t);else if(t<65536)this.writeU8(205),this.writeU16(t);else if(t<4294967296)this.writeU8(206),this.writeU32(t);else if(!this.useBigInt64)this.writeU8(207),this.writeU64(t);else this.encodeNumberAsFloat(t);else if(t>=-32)this.writeU8(224|t+32);else if(t>=-128)this.writeU8(208),this.writeI8(t);else if(t>=-32768)this.writeU8(209),this.writeI16(t);else if(t>=-2147483648)this.writeU8(210),this.writeI32(t);else if(!this.useBigInt64)this.writeU8(211),this.writeI64(t);else this.encodeNumberAsFloat(t);else this.encodeNumberAsFloat(t)}encodeNumberAsFloat(t){if(this.forceFloat32)this.writeU8(202),this.writeF32(t);else this.writeU8(203),this.writeF64(t)}encodeBigInt64(t){if(t>=BigInt(0))this.writeU8(207),this.writeBigUint64(t);else this.writeU8(211),this.writeBigInt64(t)}writeStringHeader(t){if(t<32)this.writeU8(160+t);else if(t<256)this.writeU8(217),this.writeU8(t);else if(t<65536)this.writeU8(218),this.writeU16(t);else if(t<4294967296)this.writeU8(219),this.writeU32(t);else throw Error(`Too long string: ${t} bytes in UTF-8`)}encodeString(t){let n=Gr(t);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),fr(t,this.bytes,this.pos),this.pos+=n}encodeObject(t,e){let n=this.extensionCodec.tryToEncode(t,this.context);if(n!=null)this.encodeExtension(n);else if(Array.isArray(t))this.encodeArray(t,e);else if(ArrayBuffer.isView(t))this.encodeBinary(t);else if(typeof t==="object")this.encodeMap(t,e);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(t)}`)}encodeBinary(t){let e=t.byteLength;if(e<256)this.writeU8(196),this.writeU8(e);else if(e<65536)this.writeU8(197),this.writeU16(e);else if(e<4294967296)this.writeU8(198),this.writeU32(e);else throw Error(`Too large binary: ${e}`);let n=Oe(t);this.writeU8a(n)}encodeArray(t,e){let n=t.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else if(n<4294967296)this.writeU8(221),this.writeU32(n);else throw Error(`Too large array: ${n}`);for(let s of t)this.doEncode(s,e+1)}countWithoutUndefined(t,e){let n=0;for(let s of e)if(t[s]!==void 0)n++;return n}encodeMap(t,e){let n=Object.keys(t);if(this.sortKeys)n.sort();let s=this.ignoreUndefined?this.countWithoutUndefined(t,n):n.length;if(s<16)this.writeU8(128+s);else if(s<65536)this.writeU8(222),this.writeU16(s);else if(s<4294967296)this.writeU8(223),this.writeU32(s);else throw Error(`Too large map object: ${s}`);for(let i of n){let r=t[i];if(!(this.ignoreUndefined&&r===void 0))this.encodeString(i),this.doEncode(r,e+1)}}encodeExtension(t){if(typeof t.data==="function"){let n=t.data(this.pos+6),s=n.length;if(s>=4294967296)throw Error(`Too large extension object: ${s}`);this.writeU8(201),this.writeU32(s),this.writeI8(t.type),this.writeU8a(n);return}let e=t.data.length;if(e===1)this.writeU8(212);else if(e===2)this.writeU8(213);else if(e===4)this.writeU8(214);else if(e===8)this.writeU8(215);else if(e===16)this.writeU8(216);else if(e<256)this.writeU8(199),this.writeU8(e);else if(e<65536)this.writeU8(200),this.writeU16(e);else if(e<4294967296)this.writeU8(201),this.writeU32(e);else throw Error(`Too large extension object: ${e}`);this.writeI8(t.type),this.writeU8a(t.data)}writeU8(t){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,t),this.pos++}writeU8a(t){let e=t.length;this.ensureBufferSizeToWrite(e),this.bytes.set(t,this.pos),this.pos+=e}writeI8(t){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,t),this.pos++}writeU16(t){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,t),this.pos+=2}writeI16(t){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,t),this.pos+=2}writeU32(t){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,t),this.pos+=4}writeI32(t){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,t),this.pos+=4}writeF32(t){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,t),this.pos+=4}writeF64(t){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,t),this.pos+=8}writeU64(t){this.ensureBufferSizeToWrite(8),Ir(this.view,this.pos,t),this.pos+=8}writeI64(t){this.ensureBufferSizeToWrite(8),Wn(this.view,this.pos,t),this.pos+=8}writeBigUint64(t){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,t),this.pos+=8}writeBigInt64(t){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,t),this.pos+=8}}function ce(t,e){return new Kn(e).encodeSharedRef(t)}function xn(t){return`${t<0?"-":""}0x${Math.abs(t).toString(16).padStart(2,"0")}`}var Vc=16,Wc=16;class Hs{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(t=Vc,e=Wc){this.maxKeyLength=t,this.maxLengthPerKey=e,this.caches=[];for(let n=0;n<this.maxKeyLength;n++)this.caches.push([])}canBeCached(t){return t>0&&t<=this.maxKeyLength}find(t,e,n){let s=this.caches[n-1];t:for(let i of s){let r=i.bytes;for(let o=0;o<n;o++)if(r[o]!==t[e+o])continue t;return i.str}return null}store(t,e){let n=this.caches[t.length-1],s={bytes:t,str:e};if(n.length>=this.maxLengthPerKey)n[Math.random()*n.length|0]=s;else n.push(s)}decode(t,e,n){let s=this.find(t,e,n);if(s!=null)return this.hit++,s;this.miss++;let i=Cs(t,e,n),r=Uint8Array.prototype.slice.call(t,e,e+n);return this.store(r,i),i}}var ks="array",Ae="map_key",Kr="map_value",gc=(t)=>{if(typeof t==="string"||typeof t==="number")return t;throw new bt("The type of key must be string or number but "+typeof t)};class xr{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(t){let e=this.getUninitializedStateFromPool();e.type=ks,e.position=0,e.size=t,e.array=Array(t)}pushMapState(t){let e=this.getUninitializedStateFromPool();e.type=Ae,e.readCount=0,e.size=t,e.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let t={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(t)}return this.stack[this.stackHeadPosition]}release(t){if(this.stack[this.stackHeadPosition]!==t)throw Error("Invalid stack state. Released state is not on top of the stack.");if(t.type===ks){let n=t;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(t.type===Ae||t.type===Kr){let n=t;n.size=0,n.map=void 0,n.readCount=0,n.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}}var je=-1,Ls=new DataView(new ArrayBuffer(0)),Kc=new Uint8Array(Ls.buffer);try{Ls.getInt8(0)}catch(t){if(!(t instanceof RangeError))throw Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access")}var gr=RangeError("Insufficient data"),xc=new Hs;class Rn{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=Ls;bytes=Kc;headByte=je;stack=new xr;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??Ve.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.rawStrings=t?.rawStrings??!1,this.maxStrLength=t?.maxStrLength??Ie,this.maxBinLength=t?.maxBinLength??Ie,this.maxArrayLength=t?.maxArrayLength??Ie,this.maxMapLength=t?.maxMapLength??Ie,this.maxExtLength=t?.maxExtLength??Ie,this.keyDecoder=t?.keyDecoder!==void 0?t.keyDecoder:xc,this.mapKeyConverter=t?.mapKeyConverter??gc}clone(){return new Rn({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=je,this.stack.reset()}setBuffer(t){let e=Oe(t);this.bytes=e,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.pos=0}appendBuffer(t){if(this.headByte===je&&!this.hasRemaining(1))this.setBuffer(t);else{let e=this.bytes.subarray(this.pos),n=Oe(t),s=new Uint8Array(e.length+n.length);s.set(e),s.set(n,e.length),this.setBuffer(s)}}hasRemaining(t){return this.view.byteLength-this.pos>=t}createExtraByteError(t){let{view:e,pos:n}=this;return RangeError(`Extra ${e.byteLength-n} of ${e.byteLength} byte(s) found at buffer[${t}]`)}decode(t){if(this.entered)return this.clone().decode(t);try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);let e=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return e}finally{this.entered=!1}}*decodeMulti(t){if(this.entered){yield*this.clone().decodeMulti(t);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer(t);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(t){if(this.entered)return this.clone().decodeAsync(t);try{this.entered=!0;let e=!1,n;for await(let o of t){if(e)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(o);try{n=this.doDecodeSync(),e=!0}catch(l){if(!(l instanceof RangeError))throw l}this.totalPos+=this.pos}if(e){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:s,pos:i,totalPos:r}=this;throw RangeError(`Insufficient data in parsing ${xn(s)} at ${r} (${i} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(t){return this.decodeMultiAsync(t,!0)}decodeStream(t){return this.decodeMultiAsync(t,!1)}async*decodeMultiAsync(t,e){if(this.entered){yield*this.clone().decodeMultiAsync(t,e);return}try{this.entered=!0;let n=e,s=-1;for await(let i of t){if(e&&s===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(i),n)s=this.readArraySize(),n=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--s===0)break}catch(r){if(!(r instanceof RangeError))throw r}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){t:while(!0){let t=this.readHeadByte(),e;if(t>=224)e=t-256;else if(t<192)if(t<128)e=t;else if(t<144){let s=t-128;if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t<160){let s=t-144;if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else{let s=t-160;e=this.decodeString(s,0)}else if(t===192)e=null;else if(t===194)e=!1;else if(t===195)e=!0;else if(t===202)e=this.readF32();else if(t===203)e=this.readF64();else if(t===204)e=this.readU8();else if(t===205)e=this.readU16();else if(t===206)e=this.readU32();else if(t===207)if(this.useBigInt64)e=this.readU64AsBigInt();else e=this.readU64();else if(t===208)e=this.readI8();else if(t===209)e=this.readI16();else if(t===210)e=this.readI32();else if(t===211)if(this.useBigInt64)e=this.readI64AsBigInt();else e=this.readI64();else if(t===217){let s=this.lookU8();e=this.decodeString(s,1)}else if(t===218){let s=this.lookU16();e=this.decodeString(s,2)}else if(t===219){let s=this.lookU32();e=this.decodeString(s,4)}else if(t===220){let s=this.readU16();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===221){let s=this.readU32();if(s!==0){this.pushArrayState(s),this.complete();continue t}else e=[]}else if(t===222){let s=this.readU16();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===223){let s=this.readU32();if(s!==0){this.pushMapState(s),this.complete();continue t}else e={}}else if(t===196){let s=this.lookU8();e=this.decodeBinary(s,1)}else if(t===197){let s=this.lookU16();e=this.decodeBinary(s,2)}else if(t===198){let s=this.lookU32();e=this.decodeBinary(s,4)}else if(t===212)e=this.decodeExtension(1,0);else if(t===213)e=this.decodeExtension(2,0);else if(t===214)e=this.decodeExtension(4,0);else if(t===215)e=this.decodeExtension(8,0);else if(t===216)e=this.decodeExtension(16,0);else if(t===199){let s=this.lookU8();e=this.decodeExtension(s,1)}else if(t===200){let s=this.lookU16();e=this.decodeExtension(s,2)}else if(t===201){let s=this.lookU32();e=this.decodeExtension(s,4)}else throw new bt(`Unrecognized type byte: ${xn(t)}`);this.complete();let n=this.stack;while(n.length>0){let s=n.top();if(s.type===ks)if(s.array[s.position]=e,s.position++,s.position===s.size)e=s.array,n.release(s);else continue t;else if(s.type===Ae){if(e==="__proto__")throw new bt("The key __proto__ is not allowed");s.key=this.mapKeyConverter(e),s.type=Kr;continue t}else if(s.map[s.key]=e,s.readCount++,s.readCount===s.size)e=s.map,n.release(s);else{s.key=null,s.type=Ae;continue t}}return e}}readHeadByte(){if(this.headByte===je)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=je}readArraySize(){let t=this.readHeadByte();switch(t){case 220:return this.readU16();case 221:return this.readU32();default:if(t<160)return t-144;else throw new bt(`Unrecognized array type byte: ${xn(t)}`)}}pushMapState(t){if(t>this.maxMapLength)throw new bt(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(t)}pushArrayState(t){if(t>this.maxArrayLength)throw new bt(`Max length exceeded: array length (${t}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(t)}decodeString(t,e){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String(t,e);return this.decodeBinary(t,e)}decodeUtf8String(t,e){if(t>this.maxStrLength)throw new bt(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+e+t)throw gr;let n=this.pos+e,s;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(t))s=this.keyDecoder.decode(this.bytes,n,t);else s=Sr(this.bytes,n,t);return this.pos+=e+t,s}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===Ae;return!1}decodeBinary(t,e){if(t>this.maxBinLength)throw new bt(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(t+e))throw gr;let n=this.pos+e,s=this.bytes.subarray(n,n+t);return this.pos+=e+t,s}decodeExtension(t,e){if(t>this.maxExtLength)throw new bt(`Max length exceeded: ext length (${t}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+e),s=this.decodeBinary(t,e+1);return this.extensionCodec.decode(s,n,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let t=this.view.getUint8(this.pos);return this.pos++,t}readI8(){let t=this.view.getInt8(this.pos);return this.pos++,t}readU16(){let t=this.view.getUint16(this.pos);return this.pos+=2,t}readI16(){let t=this.view.getInt16(this.pos);return this.pos+=2,t}readU32(){let t=this.view.getUint32(this.pos);return this.pos+=4,t}readI32(){let t=this.view.getInt32(this.pos);return this.pos+=4,t}readU64(){let t=Vr(this.view,this.pos);return this.pos+=8,t}readI64(){let t=gn(this.view,this.pos);return this.pos+=8,t}readU64AsBigInt(){let t=this.view.getBigUint64(this.pos);return this.pos+=8,t}readI64AsBigInt(){let t=this.view.getBigInt64(this.pos);return this.pos+=8,t}readF32(){let t=this.view.getFloat32(this.pos);return this.pos+=4,t}readF64(){let t=this.view.getFloat64(this.pos);return this.pos+=8,t}}function Ps(t,e){return new Rn(e).decode(t)}class Ot{listeners=new Map;addEventListener(t,e){let n=this.listeners.get(t);if(!n)n=new Set,this.listeners.set(t,n);return n.add(e),()=>{this.removeEventListener(t,e)}}removeEventListener(t,e){let n=this.listeners.get(t);if(n){if(n.delete(e),n.size===0)this.listeners.delete(t)}}emit(t,e){let n=this.listeners.get(t);if(n){let s=Array.from(n);for(let i of s)i(e)}}emitAll(t){let e=Array.from(this.listeners.keys());for(let n of e)this.emit(n,t)}}class Ht{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Ot}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(Ht.eventName,t))}listen(t){return this.emitter.addEventListener(Ht.eventName,t),()=>{this.emitter.removeEventListener(Ht.eventName,t)}}}st();K();C();async function Ms(t,e){let n=new z,s=n.writeDate(e);if(s!==0)return c(s);let i=n.result(),[r,o]=await t.sign(i);if(o!==0)return c(o);return m({pubKey:t.publicKey,sig:r,timestamp:e})}async function At(t,e,n){let s=n.now().getTime(),i=t.timestamp.getTime();if(Math.abs(s-i)>Tr)return 4;let o=new z;o.writeDate(t.timestamp);let l=o.result(),a;try{a=await e.importVerifyKey(t.pubKey)}catch{return 29}if(!await e.checkSigEd25519(t.sig,l,a))return 3;return 0}st();st();K();st();K();C();var ut={encode(t,e){let n=t.writeVarBytes(e.id);if(n!==0)return n;let s=t.writeDate(e.ts);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return c(n);let[s,i]=t.readDate();if(i!==0)return c(i);return m({id:e,ts:s})}};function We(t){let e=new z,n=e.writeStruct(ut,t);if(n!==0)return c(n);let s=e.result();return m(s)}async function Yc(t){return We({id:t,ts:new Date(0)})}C();var Vt={encode(t,e){let n=t.writeVarString(e.typ??"");if(n!==0)return n;let s=t.writeVarBytes(e.eid);if(s!==0)return s;let i=t.writeVarInt(e.off);if(i!==0)return i;let r=t.writeVarInt(e.ctr);if(r!==0)return r;let o=t.writeVarInt(e.len);if(o!==0)return o;if(e.hsh)t.writeBytes(e.hsh);return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let r=new E(s),[,o]=ut.decode(r);if(o!==0)return c(o);let[l,a]=t.readVarInt();if(a!==0)return c(a);let[d,u]=t.readVarInt();if(u!==0)return c(u);let[p,y]=t.readVarInt();if(y!==0)return c(y);let h;if(p>0){let[b,Z]=t.readBytes(Tn);if(Z!==0)return c(Z);h=b}return m({typ:e,eid:s,off:l,ctr:d,len:p,hsh:h})}};K();at();it();C();function Bn(t,e){return ue(t,e)}function Go(t,e,n){if(t.rlm.byteLength!==lt)return Promise.resolve(!1);return n.checkSigEd25519(t.sig,Bn(t.rlm,t.headCph),e)}async function fo(t,e,n,s,i=F,r=F){let o;if(t.bod&&t.len>0)o=await n.blake3(t.bod);let l=new z,a=Vt.encode(l,{...t,hsh:o});if(a!==0)return c(a);let d=l.result(),[u,p]=await e.kdmFor(d);if(p!==0)return c(p);let[y,h]=await s.hostRlm(r,i);if(h!==0)return c(h);let b=s.deriveCipher(u,"encrypt",r),[Z,X]=await b.encrypt(d);if(X!==0)return c(X);let f=new Uint8Array(0);if(t.bod){let[V,R]=await b.encrypt(t.bod);if(R!==0)return c(R);f=V}let[S,g]=await e.sign(Bn(y,Z));if(g!==0)return c(g);return m({rlm:y,sig:S,kdm:u,headCph:Z,bodyCph:f})}async function oi(t,e,n,s,i){let r=new E(t),[o,l]=Vt.decode(r);if(l!==0)return c(14);let a;if(e&&e.length>0){let[y,h]=await n.decrypt(e);if(h!==0)return c(h);a=y}let d=o.hsh&&a===void 0,u=o.hsh===void 0&&a!==void 0;if(d||u)return c(19);if(o.hsh&&a){let y=await s.blake3(a);if(!D(y,o.hsh))return c(19)}let p=i??await s.blake3(t);return m({msgHead:o,bod:a,headHash:p})}class qt{now(){return new Date}}function So(t,e,n,s){let i=e.getTime()-t.getTime(),r=n.getTime()-s.getTime();return(i+r)/2}st();K();C();K();C();var ln={encode(t,e){if(t.writeVarInt(e.quota),e.quota>0){if(e.usage===void 0)return 9;t.writeVarInt(e.usage)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return c(n);let s;if(e>0){let[i,r]=t.readVarInt();if(r!==0)return c(r);s=i}return m({quota:e,usage:s})}};var li={encode(t,e){t.writeBytes(new Uint8Array([e.status]));let n=t.writeDate(e.timeRcvd);if(n!==0)return n;let s=t.writeDate(e.timeSent);if(s!==0)return s;let i=t.writeVarInt(e.subscription.term);if(i!==0)return i;let r=t.writeVarInt(e.subscription.elapsed);if(r!==0)return r;let o=t.writeStruct(ln,e.subscription.stat);if(o!==0)return o;let l=t.writeStruct(ln,e.subscription.dyn);if(l!==0)return l;return 0},decode(t){let[e,n]=t.readBytes(1);if(n!==0)return c(n);let s=e[0],[i,r]=t.readDate();if(r!==0)return c(r);let[o,l]=t.readDate();if(l!==0)return c(l);let[a,d]=t.readVarInt();if(d!==0)return c(d);let[u,p]=t.readVarInt();if(p!==0)return c(p);let[y,h]=t.readStruct(ln);if(h!==0)return c(h);let[b,Z]=t.readStruct(ln);if(Z!==0)return c(Z);return m({status:s,timeRcvd:i,timeSent:o,subscription:{term:a,elapsed:u,stat:y,dyn:b}})}};K();at();st();K();K();K();C();var ci={encode(t,e){let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.seq);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return c(n);let[s,i]=t.readVarInt();if(i!==0)return c(i);return m({headCph:e,seq:s})}};K();C();var Gt={encode(t,e){t.writeBytes(e.pubKey),t.writeBytes(e.sig);let n=t.writeDate(e.timestamp);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Rr);if(n!==0)return c(n);let[s,i]=t.readBytes(Ut);if(i!==0)return c(i);let[r,o]=t.readDate();if(o!==0)return c(o);return m({pubKey:e,sig:s,timestamp:r})}};at();C();var Io={encode(t,e){if(e.rlm.byteLength!==lt)return 10;return t.writeBytes(e.rlm),t.writeVarInt(e.seq)},decode(t){let[e,n]=t.readBytes(lt);if(n!==0)return c(n);let[s,i]=Qt(e);if(i!==0)return c(i);let[r,o]=t.readVarInt();if(o!==0)return c(o);return m({rlm:s,seq:r})}},Vo={async encodeReq(t,e,n,s,i){let r=i.writeStruct(Gt,n);if(r!==0)return r;return i.writeStruct(Io,s)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(Gt);if(l!==0)return l;let a=await At(o,i,s);if(a!==0)return a;let{pubKey:d}=o,[u,p]=await r.hasUser(d);if(p!==0)return p;if(!u)return 5;let[y,h]=e.readStruct(Io);if(h!==0)return h;if(!e.done())return 8;let[b,Z]=await r.listHeads(d,y.rlm,y.seq);if(Z!==0)return Z;return n.writeStructs(ci,b)},decodeResp(t){return t.readStructs(ci)}};K();C();var ai={encode(t,e){t.writeVarInt(e.seq);let n=t.writeVarBytes(e.bodyCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);return m({seq:e,bodyCph:s})}};K();at();C();var Wo={encode(t,e){if(e.rlm.byteLength!==lt)return 10;t.writeBytes(e.rlm);for(let n of e.seqs){let s=t.writeVarInt(n);if(s!==0)return s}return 0},decode(t){let[e,n]=t.readBytes(lt);if(n!==0)return c(n);let[s,i]=Qt(e);if(i!==0)return c(i);let r=[];while(!t.done()){let[o,l]=t.readVarInt();if(l!==0)return c(l);r.push(o)}return m({rlm:s,seqs:r})}},go={async encodeReq(t,e,n,s,i){let r=i.writeStruct(Gt,n);if(r!==0)return r;return i.writeStruct(Wo,s)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(Gt);if(l!==0)return l;let a=await At(o,i,s);if(a!==0)return a;let{pubKey:d}=o,[u,p]=await r.hasUser(d);if(p!==0)return p;if(!u)return 5;let[y,h]=e.readStruct(Wo);if(h!==0)return h;console.info(`PULL: ${y.seqs.length} bags`);let[b,Z]=await r.getBodies(d,y.rlm,y.seqs);if(Z!==0)return Z;if(!b)return 17;for(let{seq:X,bodyCph:f}of b){let S={seq:X,bodyCph:f},g=n.writeStruct(ai,S);if(g!==0)return g}return 0},decodeResp(t){return t.readStructs(ai)}};st();K();at();C();var di={encode(t,e){if(e.rlm.byteLength!==lt)return 10;if(e.sig.byteLength!==Ut)return 10;t.writeBytes(e.sig),t.writeBytes(e.rlm),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarBytes(e.bodyCph);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readBytes(Ut);if(n!==0)return c(n);let[s,i]=t.readBytes(lt);if(i!==0)return c(i);let[r,o]=Qt(s);if(o!==0)return c(o);let[l,a]=t.readBytes(jt);if(a!==0)return c(a);let[d,u]=t.readVarBytes();if(u!==0)return c(u);let[p,y]=t.readVarBytes();if(y!==0)return c(y);return m({rlm:r,sig:e,kdm:l,headCph:d,bodyCph:p})}};K();at();C();var Jn={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;if(e.rlm.byteLength!==lt)return 10;t.writeBytes(e.rlm);let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let i=e.bodyCph?e.bodyCph.length:0,r=t.writeVarInt(i);if(r!==0)return r;if(i>0){if(!e.bodyCph)return 10;t.writeBytes(e.bodyCph)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return c(n);let[s,i]=t.readBytes(lt);if(i!==0)return c(i);let[r,o]=Qt(s);if(o!==0)return c(o);let[l,a]=t.readVarBytes();if(a!==0)return c(a);let[d,u]=t.readVarInt();if(u!==0)return c(u);let p;if(d>0){let[y,h]=t.readBytes(d);if(h!==0)return c(h);p=y}return m({seq:e,rlm:r,headCph:l,bodyCph:p})}};K();C();var zn={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Ut);if(n!==0)return c(n);let[s,i]=t.readBytes(jt);if(i!==0)return c(i);let[r,o]=t.readVarBytes();if(o!==0)return c(o);return m({sig:e,kdm:s,headCph:r})}};K();C();var cn={encode(t,e){if(t.writeVarInt(e.idx),t.writeBytes(new Uint8Array([e.status])),e.status===0)t.writeVarInt(e.seq);return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return c(n);let[s,i]=t.readBytes(1);if(i!==0)return c(i);let r=s[0];if(r!==0)return m({idx:e,status:r});let[o,l]=t.readVarInt();if(l!==0)return c(l);return m({idx:e,status:r,seq:o})}};K();var Ko={encode(t,e){return t.writeStructs(di,e)},decode(t){return t.readStructs(di)}},xo={async encodeReq(t,e,n,s,i){let r=i.writeStruct(Gt,n);if(r!==0)return r;return i.writeStruct(Ko,s)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r,notifier:o}=t,[l,a]=e.readStruct(Gt);if(a!==0)return a;let d=await At(l,i,s);if(d!==0)return d;let{pubKey:u}=l,[p,y]=await r.hasUser(u);if(y!==0)return y;if(!p)return 5;let[h,b]=e.readStruct(Ko);if(b!==0)return b;console.info(`PUSH: ${h.length} bags`);let Z;try{Z=await i.importVerifyKey(u)}catch{return 29}let X=[],f=[];for(let R=0;R<h.length;R++){let k=h[R];if(!await Go(k,Z,i)){let I={idx:R,status:3},H=n.writeStruct(cn,I);if(H!==0)return H;continue}X.push(R),f.push(k)}let[S,g]=await r.setBags(u,f);if(g!==0)return g;if(!S||S.length!==f.length)return 17;let V=[];for(let R=0;R<f.length;R++){let k=f[R],w=X[R],I=S[R];if(I.status!==0){let B={idx:w,status:I.status},Q=n.writeStruct(cn,B);if(Q!==0)return Q;continue}let H=I.seq,P=new z,Y=P.writeStruct(zn,k);if(Y!==0)return Y;let U=P.result(),G={seq:H,rlm:k.rlm,headCph:U};if(h.length===1&&k.bodyCph.length<=Yr)G.bodyCph=k.bodyCph;V.push(G);let M={idx:w,status:0,seq:H},J=n.writeStruct(cn,M);if(J!==0)return J}if(V.length>0){let R=new z,k=R.writeStructs(Jn,V);if(k!==0)return k;let w=R.result();await Promise.resolve(o.push(u,w))}return 0},decodeResp(t){return t.readStructs(cn)}};K();C();var Ro={async encodeReq(t,e,n,s,i){return i.writeStruct(Gt,n)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:r}=t,[o,l]=e.readStruct(Gt);if(l!==0)return l;let a=await At(o,i,s);if(a!==0)return a;let{pubKey:d}=o;if(!e.done())return 8;let[u,p]=await r.addUser(d);if(p!==0)return p;return 0},decodeResp(t){return m(void 0)}};it();st();K();class ui{url;websocket;constructor(t){this.url=t}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(t,e,n=()=>{},s=()=>{}){let{url:i}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let r=new z;r.writeStruct(Gt,t);let o=r.result(),l=Tt(o);return i.searchParams.set("t",l),this.websocket=new WebSocket(i),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),s()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,n()},this.websocket.onmessage=(a)=>{let d=new Uint8Array(a.data);e(d)},this.websocket.onerror=(a)=>{console.log(`ERROR: ${JSON.stringify(a)}`),this.websocket=void 0,n()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}C();var mt={user:{path:"/user",endpoint:Ro,name:0},push:{path:"/push",endpoint:xo,name:2},peek:{path:"/peek",endpoint:Vo,name:1},pull:{path:"/pull",endpoint:go,name:3}},la={0:mt.user,2:mt.push,1:mt.peek,3:mt.pull},oh={[mt.user.path]:mt.user,[mt.push.path]:mt.push,[mt.peek.path]:mt.peek,[mt.pull.path]:mt.pull};class pi{url;listener;constructor(t){this.url=t;this.listener=new ui(t)}async call(t,e){let{path:n}=la[t],s=new URL(n,this.url);try{return await ca(s,e)}catch{return c(25)}}}var mi=(t)=>new pi(t.handle);async function ca(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return c(24);let s=await E.fromResponse(n);return m(s)}C();class Nn{enclave;crypto;host;clock;transport;updateHostMeta;constructor(t,e,n,s,i,r){this.enclave=t;this.crypto=e;this.host=n;this.clock=s;this.transport=i;this.updateHostMeta=r}async call(t,e){let{clock:n,transport:s}=this,{endpoint:i,name:r}=t,[o,l]=await this.identity();if(l!==0)return c(l);let a=n.now(),[d,u]=await Ms(o,a);if(u!==0)return c(u);let p=new z,y=await i.encodeReq(this,o,d,e,p);if(y!==0)return c(y);let h=n.now(),[b,Z]=await s.call(r,p),X=n.now();if(Z!==0)return c(Z);let[f,S]=b.readStruct(li);if(S!==0)return c(S);if(f.status!==0)return c(f.status);let V={clockOffset:So(h,f.timeRcvd,f.timeSent,X),subscription:f.subscription},R=await this.updateHostMeta(V);if(R!==0)return c(R);return i.decodeResp(b)}#t(){return{label:this.host.label,index:this.host.idx??0}}identity=()=>this.enclave.deriveIdentity(this.#t());hostRlm=(t=F)=>this.enclave.hostRlm(t,this.#t());seal=async(t,e=F)=>{let{crypto:n,enclave:s}=this,[i,r]=await this.identity();if(r!==0)return c(r);return fo(t,i,n,s,this.#t(),e)};register=()=>this.call(mt.user,void 0);peek=async(t,e=F)=>{let[n,s]=await this.hostRlm(e);if(s!==0)return c(s);return this.call(mt.peek,{rlm:n,seq:t})};push=(t)=>this.call(mt.push,t);pull=async(t,e=F)=>{let[n,s]=await this.hostRlm(e);if(s!==0)return c(s);return this.call(mt.pull,{rlm:n,seqs:t})};listen=async(t,e,n)=>{let{clock:s,transport:i}=this,{listener:r}=i,[o,l]=await this.identity();if(l!==0)return l;let a=s.now(),[d,u]=await Ms(o,a);if(u!==0)return u;return await r.connect(d,t,e,n)};isConnected(){let t=this.transport?.listener;if(t&&typeof t.connected==="function")return t.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}st();K();at();var Ih=Symbol("DownloadKey");function En(t){if(t===void 0)return!0;return t.label===F.label&&t.index===F.index}function To(t,e){return t.label===e.label&&t.index===e.index}function _t(t){return`${t.label}\x00${t.index}`}function an(t,e=F){if(En(e))return t.lastSeq;return t.seqs?.find((s)=>s.label===e.label&&s.index===e.index)?.lastSeq??0}function Te(t){let e=[F],n=new Set([_t(F)]),s=(i,r)=>{let o=i===""&&r===0?F:{label:i,index:r},l=_t(o);if(n.has(l))return;n.add(l),e.push(o)};for(let i of t){if(s(i.label,i.index),i.prior===void 0)continue;for(let r of i.prior)s(i.label,r)}return e}function Yo(t,e){if(t===void 0||t==="")return F;for(let n of e)if(n.label===t)return{label:n.label,index:n.index};return{label:t,index:0}}function Fn(t){if(En(t))return;return t}function Ye(t,e,n){let s=n??F;return En(s)?`${t}:${e}`:`${t}:${s.label}:${s.index}:${e}`}function Qn(t,e){if(e.setLastSeq!==void 0)return e.setLastSeq;if(e.lastSeq!==void 0&&e.lastSeq>t)return e.lastSeq;return}function vn(t){let e=0,n=[];for(let s of t)if(En(s))e=s.lastSeq;else n.push(s);if(n.length===0)return{lastSeq:e};return{lastSeq:e,seqs:n}}K();C();function Xt(t){if(t===void 0)return m("");if(typeof t!=="string")return c(10);return m(t.trim())}function Co(t,e,n){let[s,i]=Xt(e);if(i!==0||s===void 0)return c(10);if(n&&t!==void 0&&t!==s)return c(10);return m(s)}it();st();K();C();K();C();var yi={encode(t,e){let n=t.writeVarString(e.lbl);if(n!==0)return n;let s=t.writeVarInt(e.idx);if(s!==0)return s;let i=t.writeVarInt(e.num);if(i!==0)return i;return t.writeBytes(e.hsh),t.writeBytes(e.sig),0},decode(t){let[e,n]=t.readVarString();if(n!==0)return c(n);let[s,i]=t.readVarInt();if(i!==0)return c(i);let[r,o]=t.readVarInt();if(o!==0)return c(o);let[l,a]=t.readBytes(Tn);if(a!==0)return c(a);let[d,u]=t.readBytes(Ut);if(u!==0)return c(u);return m({lbl:e,idx:s,num:r,hsh:l,sig:d})}};var Dn={encode(t,e){let n=t.writeStruct(yi,e.head);if(n!==0)return n;let s=t.writeVarBytes(e.indexEnc);if(s!==0)return s;let i=t.writeVarBytes(e.bodyEnc);if(i!==0)return i;return 0},decode(t){let[e,n]=t.readStruct(yi);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[r,o]=t.readVarBytes();if(o!==0)return c(o);return m({head:e,indexEnc:s,bodyEnc:r})}};K();C();var hi={encode(t,e){t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.lenBody);if(s!==0)return s;if(e.lenBody>0&&e.offBody!==void 0){let i=t.writeVarInt(e.offBody);if(i!==0)return i}return 0},decode(t){let[e,n]=t.readBytes(jt);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[r,o]=t.readVarInt();if(o!==0)return c(o);let l;if(r>0){let[a,d]=t.readVarInt();if(d!==0)return c(d);l=a}return m({kdm:e,headCph:s,lenBody:r,offBody:l})}};K();C();var On;((Ho)=>{Ho.defaultFileExtension="dpl";async function e(i,r,o,l,a){let[d,u]=await a.deriveIdentity({label:i,index:r});if(u!==0)return c(u);let p=new z,y=new z,h=0,b=0;for(let w of o){let I=new z,H=I.writeStruct(Vt,w.head);if(H!==0)return c(H);let P=I.result(),[Y,U]=await d.kdmFor(P);if(U!==0)return c(U);let G=a.deriveCipher(Y,"encrypt"),[M,J]=await G.encrypt(P);if(J!==0)return c(J);let B=new Uint8Array(0);if(w.body){let[O,et]=await G.encrypt(w.body);if(et!==0)return c(et);B=O}let Q=w.head.len>0&&w.head.hsh!==void 0?B.length:0,T={kdm:Y,headCph:M,lenBody:Q,offBody:Q>0?b:void 0},tt=p.writeStruct(hi,T);if(tt!==0)return c(tt);if(w.body)y.writeBytes(B),b+=B.length;h++}let Z=y.result(),X=p.result(),f=await l.blake3(X),[S,g]=await d.sign(f);if(g!==0)return c(g);let V={lbl:i,idx:r,num:h,hsh:f,sig:S},R=new z;R.writeStruct(Dn,{head:V,indexEnc:X,bodyEnc:Z});let k=R.result();return m(k)}Ho.encodeFile=e;async function n(i,r,o){let[l,a]=Dn.decode(new E(i));if(a!==0)return c(a);let{head:d,indexEnc:u,bodyEnc:p}=l,[y,h]=await o.deriveIdentity({label:d.lbl,index:d.idx});if(h!==0)return c(h);let b;try{b=await r.importVerifyKey(y.publicKey)}catch{return c(29)}if(!await r.checkSigEd25519(d.sig,d.hsh,b))return c(3);let X=await r.blake3(u);if(!D(X,d.hsh))return c(19);let f=new E(u),S=[];for(let V=0;V<d.num;V++){let[R,k]=f.readStruct(hi);if(k!==0)return c(k);S.push(R)}if(S.length!==d.num)return c(14);let g=[];for(let V of S){let R=o.deriveCipher(V.kdm,"decrypt"),[k,w]=await R.decrypt(V.headCph);if(w!==0)return c(w);let[I,H]=Vt.decode(new E(k));if(H!==0)return c(H);let P;if(V.lenBody>0&&V.offBody!==void 0){if(I.hsh===void 0)return c(14);let Y=p.slice(V.offBody,V.offBody+V.lenBody),[U,G]=await R.decrypt(Y);if(G!==0)return c(G);P=U;let M=await r.blake3(P);if(!D(M,I.hsh))return c(19)}g.push({head:I,body:P})}return m(g)}Ho.decodeFile=n;async function s(i,r,o,l,a){let[d,u]=await n(i,r,o);if(u!==0)return c(u);let[p,y]=Dn.decode(new E(i));if(y!==0)return c(y);let h=await a(d);return e(p.head.lbl,p.head.idx,h,r,l)}Ho.migrateFile=s})(On||={});st();K();C();async function ko({now:t,bod:e,crypto:n,typ:s=""}){let i=await n.genRandomBytes(8),r=new z,o=r.writeStruct(ut,{id:i,ts:t});if(o!==0)return c(o);let l=r.result();return jn({now:t,eid:l,ctr:0,typ:s,bod:e,crypto:n})}async function jn({now:t,eid:e,ctr:n,typ:s="",bod:i,crypto:r}){let o=new E(e),[l,a]=ut.decode(o);if(a!==0)return c(a);let d=t.getTime()-l.ts.getTime(),u,p=i?.length??0;if(i&&p>0)u=await r.blake3(i);return m({eid:e,off:d,ctr:n,typ:s,len:p,hsh:u})}it();st();K();C();function Lo(t,e){let n=t.length<e.length?t.length:e.length;for(let s=0;s<n;s++)if(t[s]!==e[s])return t[s]-e[s];return t.length-e.length}async function Ce(t,e){let n=Array.from(t);n.sort(Lo);let s=0;for(let o of n)s+=o.length;let i=new Uint8Array(s),r=0;for(let o of n)i.set(o,r),r+=o.length;return e.blake3(i)}function Po(t){let e=new z,n=e.writeVarBytes(t.eid);if(n!==0)return c(n);let s=e.writeDate(t.updatedAt);if(s!==0)return c(s);let i=e.writeVarInt(t.ctr);if(i!==0)return c(i);return m(e.result())}async function dn(t,e){let n=[];for(let s of t){let[i,r]=Po(s);if(r!==0||!i)return c(r);n.push(i)}return m(await Ce(n,e))}st();K();C();He();var ab=Symbol("EntityID");function Mo(t){return"type"in t}var db=Symbol("DerivationSeed"),ub=Symbol("PublicKey"),pb=Symbol("PrivateKey"),mb=Symbol("HostSpecificKeyPair"),yb=Symbol("Hash");K();C();function aa(t){if(!t)return!1;if(typeof t!=="object")return!1;if("body"in t===!1)return!1;return!0}function da(t){if(t===null||typeof t!=="object")return;if(!("type"in t))return;let e=t.type;if(typeof e!=="string")return;return e}function ua(t){if(!t.bod||t.bod.length===0){let r={off:t.off,ctr:t.ctr,eid:t.eid};return m(r)}let e=Ps(t.bod);if(aa(e)===!1)return console.warn("msg body invalid",e),c(14);let n=t.typ??"",s=n.length>0?n:da(e)??"",i={off:t.off,ctr:t.ctr,eid:t.eid,pid:e.pid,tags:e.tags,type:s,body:e.body};return m(i)}class un{applier;emitter=new Ot;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(t,e,n,s){this.applier=t;this.clearer=e,this.onDirtyEids=n,this.cacheDriven=s?.cacheDriven??!1,this.peerIngest=s?.peerIngest}apply=async(t)=>{let e=[],n=[];for(let l of t){let[a,d]=ua(l);if(n.push(d),d!==0)continue;e.push(a)}let{stats:s,types:i,eids:r}=await this.applier(e),o=[];for(let l=0;l<t.length;l++){let a=n[l],d=s[l];if(a!==0){o.push(a);continue}if(d!==0){o.push(d);continue}o.push(0)}if(!this.cacheDriven)for(let l of i)this.emitter.emit(l,null);if(r.length>0)this.onDirtyEids?.(r);return o};clear=async()=>{let t=await this.clearer();if(t!==0)return t;return this.emitter.emitAll(null),t};notify=(t)=>{for(let e of t)this.emitter.emit(e,null)};refresh=async(t)=>{if(this.peerIngest){await this.peerIngest(t);return}};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}var Zi={apply:async function(t){return t.map(()=>0)},clear:async function(){return 0},notify:function(t){},refresh:async function(t){},on:function(t,e){},off:function(t,e){}};function pa(t){return"subscribe"in t}function An(t){if(pa(t)){let e=new un((n)=>t.apply(n),()=>t.clear(),void 0,{cacheDriven:!0,peerIngest:async(n)=>{await t.ingestFromDurable(n)}});return t.subscribe((n)=>e.notify(n)),e}return new un((e)=>t.apply(e),()=>t.clear())}function q(t){return"type"in t}function ma(t){return!q(t)}function ya(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function pn(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return c(10);return m(!0)}function Xi(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return ya(t,e.range)}function ha(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function mn(t){if(typeof t==="string")return m(t.length>0);if("range"in t){if(t.range.start>t.range.end)return c(10);return m(!0)}return m(t.prefix.length>0)}function Gi(t,e){if(typeof e==="string")return t===e;if("range"in e)return ha(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function wo(t){if(!Array.isArray(t)||t.length===0)return;let e=new Set,n=[];for(let s of t){if(typeof s!=="string"||s.length===0)continue;if(e.has(s))continue;e.add(s),n.push(s)}return n.length>0?n:void 0}function yn(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function fi(t){let e=new E(t.eid),[n,s]=e.readStruct(ut);if(s!==0)return c(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function ke(t,e){let n=new E(e.eid),[s,i]=n.readStruct(ut);if(i!==0)return c(i);let r=new Date(s.ts.getTime()+e.off);if(t!==void 0&&r<=t.updatedAt)return c(15);if(Mo(e)){let o=wo(e.tags);return m({eid:e.eid,pid:e.pid,...o!==void 0?{tags:o}:{},type:e.type,createdAt:s.ts,updatedAt:r,ctr:e.ctr,body:e.body})}return m({eid:e.eid,updatedAt:r,ctr:e.ctr})}function Le(t,e){let n=new Set;if(t!==void 0&&q(t))n.add(t.type);if(q(e))n.add(e.type);return[...n]}var ba={getEnt:async()=>c(21),getRow:async()=>c(21),getEntities:async(t)=>c(21),countEntities:async()=>c(21),checksum:async()=>c(21),apply:async(t)=>({stats:t.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};C();class qn{inflight=null;again=!1;run(t){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(t),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(t){try{this.again=!1;let e=await t();while(this.again)this.again=!1,e=await t();return e}finally{this.inflight=null}}}var _n=100;class hn{timer=null;delayMs;work;tail=new qn;constructor(t,e){this.delayMs=t<0?0:t,this.work=e}schedule(){if(this.delayMs<=0){this.fire();return}if(this.timer!==null)clearTimeout(this.timer);this.timer=setTimeout(()=>{this.timer=null,this.fire()},this.delayMs)}async flush(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null,this.fire();await this.tail.flush()}cancel(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null}fire(){return this.tail.run(this.work)}}var Uo=!1;function $n(t){Uo=t===!0}function N(t,e){if(!Uo)return;let n=Math.round(performance.now());if(e!==void 0)console.warn(`[dip ${n}ms] ${t}`,e);else console.warn(`[dip ${n}ms] ${t}`)}st();K();function Bo(t){let e=new E(t.eid),[n,s]=ut.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function Za(t,e){let n=Bo(t),s=Bo(e);if(n===void 0&&s===void 0)return 0;if(n===void 0)return 1;if(s===void 0)return-1;if(s!==n)return s-n;return e.ctr-t.ctr}function Pe(t,e){return t.slice().sort((n,s)=>Za(e(n),e(s)))}var pe={phase:"idle"},Me=50;function ts(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}function es(t,e){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(t,e);return}let n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=e,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(n)}function Jo(t,e,n){let s=[],i=[],r=0;for(let o of t){let l=e(o);if(i.length>0&&r+l>n)s.push(i),i=[],r=0;if(i.push(o),r+=l,r>=n)s.push(i),i=[],r=0}if(i.length>0)s.push(i);return s}async function Si(t,e,n){let s=t.length;if(s<1)return[];let i=Array(s),r=0,o=Math.min(Math.max(1,e),s),l=async()=>{while(!0){let d=r;if(r+=1,d>=s)return;i[d]=await n(t[d],d)}},a=[];for(let d=0;d<o;d++)a.push(l());return await Promise.all(a),i}st();K();at();st();K();at();C();async function ns(t,e,n,s,i,r=F){if(i.byteLength!==lt)return c(10);let o=new E(t.headCph),[l,a]=o.readStruct(zn);if(a!==0)return c(a);let{sig:d,kdm:u,headCph:p}=l;if(!await s.checkSigEd25519(d,Bn(i,p),e))return c(3);let h=n.deriveCipher(u,"decrypt",r),[b,Z]=await h.decrypt(p);if(Z!==0)return c(Z);return m({kdm:u,headEnc:b})}K();C();var oZ=Symbol("EntRlm");function me(t){if(typeof t!=="string"||t==="")return;return t}function we(t){if(t.rlm!==void 0&&t.rlm!=="")return t;if(t.rlm===void 0)return t;let e={...t};return delete e.rlm,e}function Ii(t){return typeof t==="number"&&Number.isInteger(t)&&t>=0}function Xa(t){return t!==null&&typeof t==="object"}function ye(t){if(!Xa(t)||typeof t.label!=="string")return;if(!Ii(t.index))return;let e={label:t.label,index:t.index};if(t.prior===void 0)return e;if(!Array.isArray(t.prior))return;let n=[];for(let s of t.prior){if(!Ii(s))return;n.push(s)}if(n.length>0)e.prior=n;return e}function ss(t,e,n){if(typeof t!=="string"||!Ii(n))return c(10);if(e!==void 0&&n<e.index)return c(10);let s=e?.prior!==void 0?e.prior.slice():void 0;if(e!==void 0&&n>e.index){let i=s!==void 0?s:[];return i.push(e.index),m({label:t,index:n,prior:i})}return m({label:t,index:n,...s!==void 0?{prior:s}:{}})}C();it();K();var vt="f",te="t",Pt="e";function Ga(t){return t===vt||t===te||t===Pt}function Ue(t){if(t===!0||t===te)return te;if(t===Pt)return Pt;return vt}function fa(t){return Ue(t.apld)===vt}function Vi(t){return t!==0&&t!==15&&t!==18&&t!==17}function he(t,e,n){if(t.apld=e,e===Pt&&n!==void 0)t.err=n;else delete t.err}async function ee(t,e,n,s){let i=s?.body!==!1,r=Ue(e.apld),o=e.body,l=o?.length??0,a;if(i&&o&&l>0)a=await n.blake3(o);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,typ:e.typ??"",len:l,hsh:a},u={hash:t,head:d,apld:r};if(i&&o!==void 0)u.body=o;if(r===Pt&&e.err!==void 0)u.err=e.err;let p=me(e.rlm);if(p!==void 0)u.rlm=p;return u}var Wi=1048576,gi=1048576,No=64;function Sa(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}function is(t,e,n,s){let i=`${e}\x00${_t(s??F)}`,r=t.get(i);if(r){r.seqs.push(n);return}t.set(i,{host:e,realm:s,seqs:[n]})}async function Eo(t,e){for(let n of e.values())await t.downloads.deq(n.host,n.seqs,n.realm)}async function Ia(t,e,n,s,i,r=F){if(s.length<1)return 0;let[o,l]=await t.push(s);if(l!==0)return l;if(!o)return 27;for(let d of o){if(d.status!==0){console.error("push err",d);continue}let u=i[d.idx];if(!u){console.error("no hash",d);continue}await e.uploads.deq(n,[u])}let a=await e.hosts.get(n);if(a){let d=an(a,r),u=d,p=[];for(let y of o)if(y.status===0)p.push(y.seq);p.sort((y,h)=>y-h);for(let y of p)if(y===d+1)d=y;if(d>u)await e.hosts.touch(n,d,r)}return 0}async function zo(t,e){if(e.length<1)return m([]);let n=new Map;for(let i of e){let r=i.realm??F,o=_t(r),l=n.get(o);if(!l)l={realm:r,dls:new Map,seqs:[]},n.set(o,l);l.dls.set(i.seq,i),l.seqs.push(i.seq)}let s=[];for(let i of n.values()){let[r,o]=await t.pull(i.seqs,i.realm);if(o!==0)return c(o);if(!r)return c(27);for(let{seq:l,bodyCph:a}of r){let d=i.dls.get(l);if(!d)continue;s.push({dl:d,bodyCph:a})}}return m(s)}async function Va(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let i=[],r=[],o=[],l=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:y,seq:h,host:b}=d,Z=d.realm??F,[X,f]=await Fo(d,n);if(f!==0){is(l,b,h,d.realm);continue}let{headEnc:S,headEncHash:g}=X,V=e.deriveCipher(y,"decrypt",Z),[R,k]=await oi(S,u,V,n,g);if(k!==0){is(l,b,h,d.realm);continue}let w={head:p,body:R.bod},I=R.headHash;o.push({key:I,data:Do(w,Z)}),i.push(w),r.push(I),is(l,b,h,d.realm)}let a=await t.messages.add(o);await Eo(t,l);for(let d=0;d<a.length;d++){let u=a[d];if(u!==0&&u!==15)console.error("ERR storing",W[u],"for message",d)}return m({parts:i,hashes:r})}async function Fo(t,e){let n=t.headEnc;if(!n){let i=new z,r=i.writeStruct(Vt,t.head);if(r!==0)return c(r);n=i.result()}if(t.headEncHash)return m({headEnc:n,headEncHash:t.headEncHash});let s=await e.blake3(n);return m({headEnc:n,headEncHash:s})}async function Qo(t,e,n){let s=new Set;for(let o of e)s.add(L(o));if(s.size<1)return;let i=Array.from(await t.downloads.list());if(i.length<1)return;let r=new Map;for(let o of i){let l;if(o.headEncHash)l=L(o.headEncHash);else{let[a,d]=await Fo(o,n);if(d!==0)continue;l=L(a.headEncHash)}if(!s.has(l))continue;is(r,o.host,o.seq,o.realm)}await Eo(t,r)}async function Ki({conn:t,store:e,enclave:n,host:s,crypto:i,onProgress:r,peekProgressEvery:o,peekConcurrency:l,realm:a}){let d=a??F,[u,p]=await t.identity();if(p!==0)return p;let[y,h]=await t.hostRlm(d);if(h!==0)return h;let b;try{b=await i.importVerifyKey(u.publicKey)}catch{return 29}let Z=[],[X,f]=await t.peek(an(s,d),d);if(f!==0)return f;let S=X.length,g=o??Me,V=l??No;if(r&&S>0)r({phase:"peek",host:s.label,done:0,total:S});let R=0,k=await Si(X,V,async(I)=>{let[H,P]=await ns(I,b,n,i,y,d),Y;if(P!==0)Y={ok:!1,seq:I.seq,stat:P};else{let U=await i.blake3(H.headEnc);Y={ok:!0,seq:I.seq,kdm:H.kdm,headEnc:H.headEnc,headEncHash:U}}if(R+=1,r&&ts(R,S,g))r({phase:"peek",host:s.label,done:R,total:S});return Y}),w=new Set;for(let I of k){if(!I.ok){console.error("peek: decrypting item head",I.stat);continue}let H=L(I.headEncHash);if(await e.messages.has(I.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(s.label,[I.headEncHash]),await e.downloads.deq(s.label,[I.seq],d);continue}if(w.has(H)){await e.downloads.deq(s.label,[I.seq],d);continue}let Y=new E(I.headEnc),[U,G]=Y.readStruct(Vt);if(G!==0){console.error("peek: reading item head",G);continue}w.add(H);let M={kdm:I.kdm,head:U,seq:I.seq,host:s.label,headEnc:I.headEnc,headEncHash:I.headEncHash},J=Fn(d);if(J!==void 0)M.realm=J;Z.push(M)}if(await e.downloads.enq(Z),X.length>0){let I=Math.max(...X.map((H)=>H.seq));await e.hosts.recordSeqs(s.label,{lastSeq:I},d)}if(r)r({phase:"peek",host:s.label,done:S,total:S});return 0}async function vo({conn:t,store:e,host:n,maxPushBytes:s,onProgress:i}){let r=s??Wi,o=await e.uploads.list(n.label),l=o.length,a=0;if(i&&l>0)i({phase:"push",host:n.label,done:0,total:l});let d=[],u=[],p=0,y=F,h=async()=>{if(d.length<1)return 0;let X=d.length,f=await Ia(t,e,n.label,d,u,y);if(d=[],u=[],p=0,f===0){if(a+=X,i)i({phase:"push",host:n.label,done:a,total:l})}return f},b=[],Z=await e.realms.list();for(let X of o){let f=await e.messages.get(X);if(!f){a+=1;continue}b.push({hash:X,realm:Yo(f.rlm,Z),msg:{...f.head,bod:f.body}})}b.sort((X,f)=>{if(X.realm.label<f.realm.label)return-1;if(X.realm.label>f.realm.label)return 1;return X.realm.index-f.realm.index});for(let X of b){if(d.length>0&&!To(y,X.realm)){let V=await h();if(V!==0)return V}let[f,S]=await t.seal(X.msg,X.realm);if(S!==0)return S;let g=Sa(f);if(d.length>0&&p+g>r){let V=await h();if(V!==0)return V}if(d.length<1)y=X.realm;if(d.push(f),u.push(X.hash),p+=g,p>=r){let V=await h();if(V!==0)return V}}return h()}async function xi({conn:t,store:e,enclave:n,host:s,crypto:i,maxPullBytes:r,onProgress:o},l){let a=r??gi,d=await e.downloads.list(),u=Array.from(d).filter((X)=>X.host===s.label);if(u.length<1)return 15;let p=Pe(u,(X)=>X.head),y=Jo(p,(X)=>X.head.len,a),h=p.length,b=0;if(o)o({phase:"pull",host:s.label,done:0,total:h});let Z=zo(t,y[0]);for(let X=0;X<y.length;X++){let[f,S]=await Z;if(S!==0)return S;if(b+=y[X].length,o)o({phase:"pull",host:s.label,done:b,total:h});let g=y[X+1];if(g)Z=zo(t,g);if(o)o({phase:"open",host:s.label,done:b,total:h});let V=Pe(f,(k)=>k.dl.head),[,R]=await Va(e,n,i,V);if(R!==0)return R;if(l){if(o)o({phase:"exec",host:s.label,done:b,total:h});await l()}}return 0}function Do({head:t,body:e},n){let s={eid:t.eid,body:e,apld:vt};if(t.off!==0)s.off=t.off;if(t.ctr!==0)s.ctr=t.ctr;if(t.typ)s.typ=t.typ;let i=me(n?.label);if(i!==void 0)s.rlm=i;return s}async function Oo(t,{conn:e,store:n,enclave:s,host:i,crypto:r,onProgress:o},l){let a=i.label,[d,u]=await e.identity();if(u!==0)return;let p;try{p=await r.importVerifyKey(d.publicKey)}catch(I){console.error("Failed importing host verify key",I);return}let y=new E(t),[h,b]=y.readStructs(Jn);if(b!==0){console.error("Failed decoding notif",W[b]);return}let Z={label:i.label,index:i.idx??0},X=Te(await n.realms.list()),f=!1,S=await n.hosts.get(a),g=new Map,V=[],R=!1;for(let I of h){let[H,P]=await s.realmForRlm(Z,I.rlm,X);if(P!==0){console.error("notif: realm",W[P]);continue}let[Y,U]=await ns({seq:I.seq,headCph:I.headCph},p,s,r,I.rlm,H);if(U!==0){console.error("Failed decrypting notif",W[U]);continue}let G=await r.blake3(Y.headEnc);if(await n.messages.has(G))continue;let M=new E(Y.headEnc),[J,B]=M.readStruct(Vt);if(B!==0){console.error("Failed to parse head",W[B]);continue}if(!I.bodyCph&&J.len>0){R=!0;let tt={seq:I.seq,host:a,kdm:Y.kdm,head:J,headEnc:Y.headEnc,headEncHash:G},O=Fn(H);if(O!==void 0)tt.realm=O;await n.downloads.enq([tt])}else V.push({...Y,head:J,bodyCph:I.bodyCph,headEncHash:G,realm:H});if(!S){console.log("out of seq",I.seq,void 0),f=!0;continue}let Q=_t(H),T=g.get(Q);if(!T)T={realm:H,seq:an(S,H)},g.set(Q,T);if(I.seq!==T.seq+1)console.log("out of seq",I.seq,T.seq),f=!0;else T.seq=I.seq}if(S){for(let I of g.values())if(I.seq>an(S,I.realm))await n.hosts.touch(i.label,I.seq,I.realm)}let k=[];for(let I of V){let H=s.deriveCipher(I.kdm,"decrypt",I.realm),[P,Y]=await oi(I.headEnc,I.bodyCph,H,r);if(Y!==0){console.error("Failed to open body",W[Y]);continue}k.push({key:I.headEncHash,data:Do({head:I.head,body:P.bod},I.realm)})}let w=await n.messages.add(k);for(let I=0;I<w.length;I++){let H=w[I];if(H!==0&&H!==15)console.error("ERR storing",W[H],"for message",I)}if(o&&k.length>0)o({phase:"open",host:i.label,done:k.length,total:k.length});if(f||R||k.length>0)l()}async function Ri(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:i,store:r,enclave:o,host:l,crypto:a,onProgress:d,peekProgressEvery:u,peekConcurrency:p}=t,[y,h]=await i.identity();if(h!==0)return c(h);let b;try{b=await a.importVerifyKey(y.publicKey)}catch{return c(29)}let Z=new Map,X=0,f=u??Me,S=p??No,g=Te(await r.realms.list());for(let Y of g){let[U,G]=await i.hostRlm(Y);if(G!==0)return c(G);let[M,J]=await i.peek(0,Y);if(J!==0)return c(J);X+=M.length;let B=M.length;if(d&&B>0)d({phase:"peek",host:l.label,done:0,total:B});let Q=0,T=await Si(M,S,async(O)=>{let[et,j]=await ns(O,b,o,a,U,Y),It;if(j!==0)It={ok:!1,seq:O.seq,stat:j};else{let Dt=await a.blake3(et.headEnc);It={ok:!0,seq:O.seq,kdm:et.kdm,headEnc:et.headEnc,headEncHash:Dt}}if(Q+=1,d&&ts(Q,B,f))d({phase:"peek",host:l.label,done:Q,total:B});return It});for(let O of T){if(!O.ok)continue;let et=L(O.headEncHash),j=Z.get(et);if(j)j.count+=1;else Z.set(et,{hash:O.headEncHash,count:1,sample:O,realm:Y})}let tt=M.length>0?Math.max(...M.map((O)=>O.seq)):0;if(await r.hosts.recordSeqs(l.label,{setLastSeq:tt},Y),d)d({phase:"peek",host:l.label,done:B,total:B})}let V=0,R=[];for(let Y of Z.values()){if(Y.count>1)V+=Y.count-1;R.push(Y.hash)}let k=Z.size,w=await Ce(R,a),I=[],H=0;for(let Y of Z.values()){if(await r.messages.has(Y.hash)){await r.uploads.deq(l.label,[Y.hash]);continue}if(H+=1,!n)continue;let G=Y.sample,M=new E(G.headEnc),[J,B]=M.readStruct(Vt);if(B!==0){console.error("reconcile: reading msg header",B);continue}let Q={kdm:G.kdm,head:J,seq:G.seq,host:l.label,headEnc:G.headEnc,headEncHash:G.headEncHash},T=Fn(Y.realm);if(T!==void 0)Q.realm=T;I.push(Q)}if(I.length>0)await r.downloads.enq(I);let P=0;if(s){let Y=await r.messages.listKeys(),U=new Set(Z.keys()),G=[];for(let M of Y)if(!U.has(L(M)))P+=1,G.push(M);if(G.length>0)await r.uploads.enq(l.label,G)}else{let Y=await r.messages.listKeys(),U=new Set(Z.keys());for(let G of Y)if(!U.has(L(G)))P+=1}return m({msgcheck:w,numBags:X,uniqueMsgs:k,numDupes:V,missingLocal:H,missingHost:P})}function Wa(t){return t.map(({head:e,body:n})=>({...e,bod:n}))}class Be{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;#t;applyChain=Promise.resolve();syncRuns=new qn;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=Me;lastProgress=pe;scheduledSync;constructor(t,e,n,s,i,r=!0,o=Wi,l=gi,a){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=i;this.forceSkewHandlingByDefault=r;this.onScheduleSync=a;this.maxPushBytes=o,this.maxPullBytes=l,this.clientState=new Ht(()=>this.getClientState()),this.xferState=new Ht(()=>this.getXferState()),this.scheduledSync=new hn(_n,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(d){console.error("Debounced sync failed:",d)}})}emitProgress=(t)=>{this.lastProgress=t,this.xferState.emit()};selected(){return this.#t}async setSeed(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return 10;let[,i]=await this.store.account.save(t,e);if(i!==0)return i;let r=await this.#r(n,t);if(r!==0)return r;return this.clientState.emit(),0}async adopt(t,e=""){let n=await this.#r(e,t);if(n!==0)return n;return this.clientState.emit(),0}#e(){return this.#t?.enclave}async#s(){return Array.from(await this.store.hosts.list())}async#i(){if(this.#t===void 0)return;this.#t.hosts=await this.#s()}async#n(){if(this.#t===void 0)return;this.#t.realms=await this.store.realms.list()}async#r(t,e){let n=await this.store.bind(t);if(n!==0)return n;return this.#t={label:t,enclave:e,hosts:await this.#s(),realms:await this.store.realms.list()},0}async getClientState(){let{store:t,connections:e}=this,n=this.#e(),s=await t.hosts.list(),i=!1;for(let r of e.values())if(r.isConnected()){i=!0;break}return{hasSeed:n!==void 0,hasHost:Array.from(s).length>0,connected:i}}async getXferState(){let{uploads:t,downloads:e}=this.store,n=await t.count();return{numDownloads:await e.count(),numUploads:n,progress:this.lastProgress}}apply=(t,e)=>{N("apply kick",{n:t.length});let n=this.state.apply(Wa(t));return this.enqueueApplyJob(()=>this.doApply(t,e,n))};async doApply(t,e={enqueueUpload:!0,triggerUpload:!0},n){let s=[],i=[];for(let{head:o,body:l}of t){let a=new z;a.writeStruct(Vt,o);let d=a.result(),u=await this.crypto.blake3(d),p={eid:o.eid,body:l,apld:vt};if(o.off!==0)p.off=o.off;if(o.ctr!==0)p.ctr=o.ctr;if(o.typ)p.typ=o.typ;s.push(u),i.push({key:u,data:p})}N("doApply archive start"),await this.store.messages.add(i),N("doApply archive done"),await Qo(this.store,s,this.crypto),N("doApply await persist");let r=await n;if(N("doApply persist done"),await this.markApplyStats(s,r),e.enqueueUpload){let o=[];for(let l=0;l<s.length;l++){let a=r[l];if(a===0||a===15)o.push(s[l])}if(o.length>0){let l=await this.store.hosts.list();for(let a of l)await this.store.uploads.enq(a.label,o);this.xferState.emit()}}if(e.triggerUpload)this.scheduleSync();return r}enqueueApplyJob(t){let e=this.applyChain.then(t,t);return this.applyChain=e.then(()=>{return},()=>{return}),e}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let t=await this.store.messages.list({apld:vt});if(t.length<1)return[];let e=Pe(t,(n)=>n.head);return this.applyStored(e)}applyHashes=(t)=>this.enqueueApplyJob(()=>this.doApplyHashes(t));async doApplyHashes(t){let e=[];for(let i of t){let r=await this.store.messages.get(i);if(r)e.push(r)}let n=await this.applyStored(e),s=new Map;for(let i=0;i<e.length;i++)s.set(L(e[i].hash),n[i]??12);return t.map((i)=>s.get(L(i))??13)}async applyStored(t){if(t.length<1)return[];let e=t.map((s)=>({...s.head,bod:s.body})),n=await this.state.apply(e);return await this.markApplyStats(t.map((s)=>s.hash),n),n}async markApplyStats(t,e){let n=[],s=[];for(let i=0;i<t.length;i++){let r=e[i];if(r===0||r===15)n.push(t[i]);else if(r!==void 0&&Vi(r))s.push({key:t[i],err:r})}if(n.length>0)await this.store.messages.markApplied(n);if(s.length>0)await this.store.messages.markFailed(s)}async insertRaw(t,e=""){N("insertRaw");let{clock:n,crypto:s}=this,i=n.now(),[r,o]=await ko({now:i,bod:t,typ:e,crypto:s});if(o!==0)return c(o);let a=(await this.apply([{head:r,body:t}]))[0];if(a!==0&&a!==15)return c(a??12);return m(r)}async makeUpdate(t,e,n=""){let{clock:s,crypto:i}=this,r=s.now();if(t.updatedAt.getTime()>r.getTime())return c(4);let o=t.ctr+1,[l,a]=await jn({now:r,eid:t.eid,ctr:o,typ:n,bod:e,crypto:i});if(a!==0)return c(a);return m({head:l,body:e})}async updateWithSkew(t,e,n,s=""){if(n===!1)return c(4);let{clock:i,crypto:r}=this,o=i.now(),l=new E(t.eid),[a,d]=l.readStruct(ut);if(d!==0)return c(d);let u=t.updatedAt.getTime()-a.ts.getTime(),p={eid:t.eid,off:u+1,ctr:t.ctr+1,typ:"",len:0},h=(await this.apply([{head:p,body:void 0}]))[0];if(h!==0&&h!==15)return c(h??12);if(e===void 0)return m(p);let[b,Z]=We({id:a.id,ts:o});if(Z!==0)return c(Z);let[X,f]=await jn({now:o,eid:b,ctr:0,typ:s,bod:e,crypto:r});if(f!==0)return c(f);let g=(await this.apply([{head:X,body:e}]))[0];if(g!==0&&g!==15)return c(g??12);return m(X)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault,s=""){if(N("updateRaw"),t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n,s);let[i,r]=await this.makeUpdate(t,e,s);if(r!==0)return c(r);let l=(await this.apply([i]))[0];if(l!==0&&l!==15)return c(l??12);return m(i.head)}async insert(t){let{body:e,type:n,pid:s,tags:i}=t,r={body:e};if(s!==void 0)r.pid=s;if(i!==void 0)r.tags=i;let o=ce(r);return this.insertRaw(o,n)}async update(t){let{prior:e,body:n,type:s,pid:i,tags:r,force:o}=t,l={body:n};if(i!==void 0)l.pid=i;if(r!==void 0)l.tags=r;let a=ce(l);return this.updateRaw(e,a,o??this.forceSkewHandlingByDefault,s)}async delete(t){let e=t.force??!0;if("prior"in t)return this.updateRaw(t.prior,void 0,e);let[n,s]=await this.revFromArchive(t.eid);if(s!==0)return c(s);return this.updateRaw(n,void 0,e)}async revFromArchive(t){let e=await this.store.messages.last(t);if(e)return fi(e.head);let n=new E(t),[s,i]=n.readStruct(ut);if(i!==0)return c(i);return m({eid:t,ctr:-1,updatedAt:s.ts})}async genEID(t){let{clock:e,crypto:n}=this,s=e.now();if(t!==void 0)return We({id:t,ts:s});let i=await n.genRandomBytes(8);return We({id:i,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this,s=this.#e();if(!s)return 22;await this.drainApplyQueue(),await this.#n();let i=Te(this.#t?.realms??[]);for(let[r,o]of t){let l=await n.hosts.get(r);if(!l)continue;let a={conn:o,store:n,enclave:s,host:l,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};for(let p of i){let y=await Ki({...a,realm:p});if(y!==0)return console.error(`Failed to peek: ${y}`),this.emitProgress({phase:"idle"}),y;this.xferState.emit()}let d=await vo(a);if(d!==0)return console.error(`Failed to push: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await xi(a,async()=>{await this.drainApplyQueue()});if(u!==0&&u!==15)return console.error(`Failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(t){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),t?.checkHost??!0){let n=await this.repull();if(n!==0)return n}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let t=await this.store.messages.listKeys();return Ce(t,this.crypto)}listMsgs(t){return this.store.messages.list(t)}countMsgs(t){return this.store.messages.count(t)}async reconcile(t,e){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:n,crypto:s,store:i}=this,r=this.#e();if(!r)return c(22);let o=await i.hosts.get(t);if(!o)return c(13);let l=n.get(t);if(!l||!l.isConnected()){if(await this.connectToHost(o,!1,!1),o=await i.hosts.get(t),!o)return c(13);l=n.get(t)}if(!l)return c(12);let a={conn:l,store:i,enclave:r,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[d,u]=await Ri({...a,host:o},e);if(this.xferState.emit(),u!==0)return this.emitProgress({phase:"idle"}),c(u);if(!d)return this.emitProgress({phase:"idle"}),c(12);if(e?.sync===!1)return this.emitProgress({phase:"idle"}),m(d);let p=await this.sync();if(p!==0)return c(p);let y=await i.hosts.get(t);if(!y)return c(13);let[h,b]=await Ri({...a,host:y},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),b!==0)return c(b);if(!h)return c(12);return m(h)}async repull(){let{connections:t,crypto:e,store:n}=this,s=this.#e();if(!s)return 22;let i=Array.from(await n.hosts.list());if(i.length<1)return 0;await this.#n();let r=Te(this.#t?.realms??[]);for(let o of i){let l=t.get(o.label);if(!l||!l.isConnected())await this.connectToHost(o,!1,!1)}for(let[o,l]of t){let a=await n.hosts.get(o);if(!a)continue;let d={conn:l,store:n,enclave:s,host:{...a,lastSeq:0,seqs:void 0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};for(let p of r){let y=await Ki({...d,realm:p});if(y!==0)return console.error(`rebuild: failed to peek: ${y}`),this.emitProgress({phase:"idle"}),y;this.xferState.emit()}let u=await xi(d);if(u!==0&&u!==15)return console.error(`rebuild: failed to pull: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let t=await this.state.clear();if(t!==0)return t;let e=await this.store.messages.list(),n=Pe(e,(r)=>r.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let i=0;while(i<n.length){let r=0,o=0,l=i;for(let d=i;d<n.length&&o<100&&r<102400;d++)r+=n[d].head.len,o++,l=d+1;let a=n.slice(i,l);await this.applyStored(a),this.emitProgress({phase:"exec",done:l,total:s}),i=l}return this.emitProgress({phase:"idle"}),0}async wipe(t){let e=t?.msgs!==!1,n=t?.ents!==!1,s=t?.meta!==!1,i=t?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:r}=this;if(s)await r.hosts.wipe(),await r.uploads.wipe(),await r.downloads.wipe();if(e)await r.messages.wipe();if(n)await this.state.clear();if(i)await r.account.wipe(),await r.realms.wipe(),this.#t=void 0;else if(s)await this.#i(),await this.#n();this.lastProgress=pe,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n}=this,s=e?.onProgress,i=this.#e();if(!i)return 22;console.time("import: decoding file...");let r=await t.bytes(),[o,l]=await On.decodeFile(r,n,i);if(l!==0)return l;console.timeEnd("import: decoding file...");let a=0;while(a<o.length){let d=0,u=0,p=a;for(let b=a;b<o.length&&u<100&&d<102400;b++)d+=o[b].head.len,u++,p=b+1;let y=o.slice(a,p);console.time(`import: applying [${a}, ${p}]`);let h=await this.apply(y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${a}, ${p}]`);for(let b=0;b<y.length;b++){let Z=h[b];if(Z!==0&&Z!==15)console.warn(`failed to import msg ${a+b}: ${W[Z]}`)}if(s)queueMicrotask(()=>s(p,o.length,0));this.emitProgress({phase:"import",done:p,total:o.length}),a=p}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:t,store:e}=this,n=this.#e();if(!n)return c(22);let s=await e.messages.list();return On.encodeFile("export",0,s,t,n)}async export(t){let[e,n]=await this.exportBytes();if(n!==0)return n;if(!e)return 12;let s=new Blob([e.slice()]);return es(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),await this.#i(),await this.#n(),this.clientState.emit(),e){let n=await this.store.hosts.get(t.label);if(n)await this.connectToHost(n)}}async unlink(t){await this.store.hosts.del(t),await this.#i(),await this.#n(),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(t,e=!0,n=!0)=>{let{clock:s,connections:i,crypto:r,store:o,transport:l}=this,a=i.get(t.label);if(a){if(a.isConnected())return;try{a.closeListener()}catch{}i.delete(t.label)}let d=this.#e();if(!d)return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new Nn(d,r,t,s,l(t),async(p)=>{let y=await o.hosts.set(t.label,p);return await this.#i(),await this.#n(),y});if(await u.register(),e)await u.listen(async(p)=>{let y={conn:u,store:o,enclave:d,host:t,crypto:r,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return Oo(p,y,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(i.set(t.label,u),this.clientState.emit(),n)this.scheduleSync()};async connect(t=!0,e=!0){let{connectToHost:n,scheduleSync:s,store:i}=this;if(!this.#e())return;await this.drainApplyQueue();let o=await i.hosts.list();for(let l of o)await n(l,t,!1);if(e)s()}disconnect=async()=>{for(let t of this.connections.values())try{t.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}on();var ne=bo;it();K();C();it();K();Ne();C();Ne();at();K();it();He();C();fs();le();var Vl=8;class Gn{#t;#e;#s;#i;#n;#r;#o;constructor(t){this.#n=t.persistKeyring,this.#s={rpId:t.rpId,rpName:t.rpName},this.#i=t.userName??t.rpId??t.rpName??bn,this.#r=t.unlockAccount}static open(t){let e=new Gn(t);if(t.keyring===void 0)return m(e);let[n,s]=Zn(t.keyring);if(s!==0)return c(s);return e.#e=n,m(e)}get keyring(){if(this.#e===void 0)return;let[t,e]=Zn(this.#e);if(e!==0)return;return t}list(){if(this.#e===void 0)return[];return this.#e.entries.map(ja)}async save(t,e){let n=this.#t!==void 0||this.#e!==void 0&&this.#e.entries.length>0,[s,i]=Co(this.#o,e?.label,n);if(i!==0||s===void 0)return c(10);if(e?.persist===!0)return c(10);return this.#o=s,this.#t=t,m(this.#t)}async bindAndSave(t,e){let n=this.#e,s=e?.credId,i=s instanceof Uint8Array?s.byteLength>0:s!==void 0&&s.length>0;if(!i&&n!==void 0&&n.entries.length>=Vl)return c(26);let r=Il(e?.nick),o=e?.excludeCredentials??(i?void 0:Kl(n)),l=e?.salt??n?.salt,a=n===void 0?void 0:n.entries.map((f)=>({credId:f.credId,tag:f.tag})),[d,u]=await t.bind({...this.#s,salt:l,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!i,excludeCredentials:o,userName:this.#i,displayName:r??this.#s.rpName??this.#i,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},a);if(u!==0)return c(u);let p=Date.now(),y={type:"prf",sealedMaster:d.sealedMaster,credId:d.credId,tag:d.tag,userId:d.userId,nick:r,enrolledAt:p,lastUsedAt:p,attachment:d.attachment,transports:d.transports,aaguid:d.aaguid,enrolledOs:va()},h=n===void 0?{salt:d.salt.slice(),entries:[]}:n,[b,Z]=Aa(h,y);if(Z!==0)return c(Z);let X=await this.#n(b);if(X!==0)return c(X);return this.#e=b,this.#t=t,m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#r;if(t!==void 0){let[o,l]=await t();if(l!==0)return c(l);if(o===void 0)return c(13);if(o.keyring===void 0)this.#e=void 0;else{let[a,d]=Zn(o.keyring);if(d!==0)return c(d);this.#e=a}return this.#t=o.enclave,m(o.enclave)}let e=this.#e;if(e===void 0||e.entries.length===0)return c(22);let[n,s]=await rt.unsealWithPasskey(e.entries.map((o)=>({sealedMaster:o.sealedMaster,credId:o.credId})),{...this.#s,salt:e.salt});if(s!==0)return c(s);this.#t=n.enclave;let[i,r]=Fi(e,n.credId);if(r!==0)return c(r);if(i!==void 0){let o=await this.#n(i);if(o!==0)return c(o);this.#e=i}return m(n.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return c(22);let s=n.entries.findIndex((u)=>D(u.credId,t));if(s<0)return c(13);let[i,r]=Xn(n.entries);if(r!==0)return c(r);let o=i[s];if(o===void 0)return c(13);let l=Il(e);i[s]={...o,nick:l};let a={salt:n.salt.slice(),entries:i},d=await this.#n(a);if(d!==0)return c(d);return this.#e=a,m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return c(22);let n=e.entries.filter((l)=>!D(l.credId,t));if(n.length===e.entries.length)return c(13);if(n.length===0){let l=await this.#n(void 0);if(l!==0)return c(l);return this.#e=void 0,m(void 0)}let[s,i]=Xn(n);if(i!==0)return c(i);let r={salt:e.salt.slice(),entries:s},o=await this.#n(r);if(o!==0)return c(o);return this.#e=r,m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,this.#o=void 0,await this.#n(void 0)}}function Il(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function va(){if(typeof navigator>"u")return;return sl(navigator.userAgent)}function Da(t){let[e,n]=$t(t.sealedMaster.slice());if(n!==0)return c(n);let[s,i]=Ft(t.tag.slice(),nt.BindTag);if(i!==0)return c(i);return m({type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:s,userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs})}function Xn(t){let e=[];for(let n of t){let[s,i]=Da(n);if(i!==0)return c(i);e.push(s)}return m(e)}function Zn(t){let[e,n]=Xn(t.entries);if(n!==0)return c(n);return m({salt:t.salt.slice(),entries:e})}function Wl(t){return t!==null&&typeof t==="object"}function Oa(t){if(!Wl(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=$t(t.sealedMaster);if(n!==0)return;let[s,i]=Ft(t.tag.slice(),nt.BindTag);if(i!==0)return;let r=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,o=t.enrolledOs,l=o==="ios"||o==="macos"||o==="android"||o==="windows"||o==="linux"||o==="other"?o:void 0,a=Array.isArray(t.transports)?t.transports.filter((d)=>typeof d==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:s,userId:t.userId instanceof Uint8Array?t.userId.slice():void 0,nick:typeof t.nick==="string"?t.nick:void 0,enrolledAt:t.enrolledAt,lastUsedAt:typeof t.lastUsedAt==="number"&&Number.isFinite(t.lastUsedAt)?t.lastUsedAt:void 0,attachment:r,transports:a===void 0||a.length===0?void 0:a,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:l}}function gl(t){if(!Wl(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=Oa(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function ja(t){return{type:"prf",credId:t.credId.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function Kl(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function Aa(t,e){let[n,s]=Xn(t.entries);if(s!==0)return c(s);let i=n.findIndex((r)=>D(r.credId,e.credId));if(i>=0){let r=n[i];n[i]={...e,enrolledAt:r?.enrolledAt??e.enrolledAt,nick:e.nick??r?.nick}}else n.push(e);return m({salt:t.salt.slice(),entries:n})}function Fi(t,e){if(e.byteLength===0)return m(void 0);let n=t.entries.findIndex((o)=>D(o.credId,e));if(n<0)return m(void 0);let[s,i]=Xn(t.entries);if(i!==0)return c(i);let r=s[n];if(r===void 0)return c(13);return s[n]={...r,lastUsedAt:Date.now()},m({salt:t.salt.slice(),entries:s})}var qa=Vs("fbfc3007154e4ecc8c0b6e020557d7bd"),_a=Vs("ea9b8d664d011d213ce4b6b48cb575d4"),$a=Vs("08987058cadc4b81b6e130de50dcbe96"),td=Vs("2fc0579f811347eab116bb5a8db9202a");function Vs(t){let e=new Uint8Array(16);for(let n=0;n<16;n++)e[n]=Number.parseInt(t.slice(n*2,n*2+2),16);return e}function ed(t){if(t===void 0||t.byteLength!==16)return;if(D(t,qa))return"Apple Passkey";if(D(t,_a))return"GPM";if(D(t,$a))return"Windows Hello";if(D(t,td))return"YubiKey";return}function nd(t){if(t.attachment==="cross-platform")return!0;if(t.transports===void 0)return!1;return t.transports.some((e)=>e==="usb"||e==="nfc"||e==="ble")}function xl(t){let e=ed(t.aaguid);if(e!==void 0)return e;if(nd(t))return"Security key";if(t.attachment==="platform"){if(t.enrolledOs==="ios"||t.enrolledOs==="macos")return"Apple Passkey";if(t.enrolledOs==="android")return"GPM";if(t.enrolledOs==="windows")return"Windows Hello";return"Passkey"}return"Passkey"}function sd(t){if(t.byteLength===0)return"";let e=Math.min(4,t.byteLength),n="";for(let s=t.byteLength-e;s<t.byteLength;s++){let i=t[s];if(i===void 0)continue;n+=i.toString(16).padStart(2,"0")}return n}function id(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=xl(t),n=sd(t.credId);return n===""?e:`${e} ${n}`}K();at();C();async function Rl(t,e){let[n,s]=await t.fingerprint(e);if(s!==0)return c(s);return Ft(n.slice(),nt.Fingerprint)}async function Ws(t,e){let n=await t.gen256BitSecureRandomSeed(),[s,i]=await Rl(e,n);if(i!==0)return c(i);return m({n,h:s})}async function fn(t,e){let[n,s]=await Rl(t,e.n);if(s!==0)return!1;return rd(n,e.h)}function Tl(t){if(t===void 0||t===null||typeof t!=="object")return;let e=t;if(!(e.n instanceof Uint8Array)||!(e.h instanceof Uint8Array))return;if(e.n.byteLength<1)return;let[n,s]=Ft(e.h.slice(),nt.Fingerprint);if(s!==0)return;return{n:e.n.slice(),h:n}}function gs(t){let e=t.n.slice(),[n,s]=Ft(t.h.slice(),nt.Fingerprint);if(s!==0)return{n:e,h:t.h};return{n:e,h:n}}function rd(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++)n|=t[s]^e[s];return n===0}function Qi(t){if(t===""||typeof indexedDB>"u")return Promise.resolve();return new Promise((e,n)=>{let s=indexedDB.deleteDatabase(t);s.onsuccess=()=>e(),s.onerror=()=>n(s.error??Error(`[DIPLOMATIC] deleteDatabase failed (${t})`)),s.onblocked=()=>{console.warn(`[DIPLOMATIC] deleteDatabase blocked (${t})`)}})}function vi(t,e,n){return new Promise((s,i)=>{let r=indexedDB.open(t,e);r.onupgradeneeded=()=>{let{result:o,transaction:l}=r;if(l===null){i(Error(`[DIPLOMATIC] missing upgrade transaction (${t})`));return}try{n(o,l)}catch(a){i(a instanceof Error?a:Error(String(a)))}},r.onblocked=()=>{console.warn(`[DIPLOMATIC] IDB upgrade blocked (${t} → v${e})`)},r.onsuccess=()=>{let o=r.result;o.onversionchange=()=>{o.close()},s(o)},r.onerror=()=>{i(r.error??Error(`[DIPLOMATIC] IDB open failed (${t})`))}})}it();var Yl="meta",Cl=1,Hl=9;function od(){let t=new Uint8Array(16);return globalThis.crypto.getRandomValues(t),Tt(t)}function ld(t){return`data-${t}`}function cd(t){return`ents-${t}`}function Di(t,e){let n=t!==void 0&&t!==""?t:od();if(e!==void 0&&e!=="")return{acct:n,data:e};return{acct:n,data:ld(n)}}function kl(t,e){if(e!==void 0&&e!=="")return e;return cd(t)}K();C();class Oi{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(ft,"readwrite"),s=n.objectStore(ft);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e)s.put(o,Ye(o.host,o.seq,o.realm))})}async deq(t,e,n){let s=[...e];if(s.length===0)return;let i=this.db.transaction(ft,"readwrite"),r=i.objectStore(ft);return new Promise((o,l)=>{i.oncomplete=()=>o(),i.onerror=()=>l(i.error);for(let a of s)r.delete(Ye(t,a,n))})}async list(){let e=this.db.transaction(ft,"readonly").objectStore(ft);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async count(){let e=this.db.transaction(ft,"readonly").objectStore(ft);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(ft,"readwrite"),e=t.objectStore(ft);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}K();at();function ji(t){return t!==null&&typeof t==="object"}function Ai(t){if(!ji(t))return!1;return typeof t.host==="string"&&typeof t.label==="string"&&typeof t.index==="number"&&Number.isInteger(t.index)&&typeof t.lastSeq==="number"&&Number.isInteger(t.lastSeq)&&t.lastSeq>=0}function ad(t){let e=[];if(!Array.isArray(t))return e;for(let n of t){if(!Ai(n))continue;e.push({label:n.label,index:n.index,lastSeq:n.lastSeq})}return e}function dd(t){let e=new Map;if(!Array.isArray(t))return e;for(let n of t){if(!Ai(n))continue;let s=e.get(n.host)??[];s.push({label:n.label,index:n.index,lastSeq:n.lastSeq}),e.set(n.host,s)}return e}function Ll(t,e){let n=vn(e),s={label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:n.lastSeq,clockOffset:t.clockOffset,subscription:t.subscription};if(n.seqs!==void 0)s.seqs=n.seqs;return s}function Pl(t){let e={label:t.label,handle:t.handle.toString()};if(t.idx!==void 0)e.idx=t.idx;if(t.clockOffset!==void 0)e.clockOffset=t.clockOffset;if(t.subscription!==void 0)e.subscription=t.subscription;return e}class qi{db;constructor(t){this.db=t}async add(t){let e=await this.get(t.label),n=e!==void 0&&e.handle.href===t.handle.href&&(e.idx??0)===(t.idx??0),s=Pl(n&&e!==void 0?{...t,clockOffset:e.clockOffset,subscription:e.subscription}:t),i=this.db.transaction([dt,ht],"readwrite"),r=i.objectStore(dt),o=i.objectStore(ht);return new Promise((l,a)=>{if(i.oncomplete=()=>l(),i.onerror=()=>a(i.error),n){r.put(s);return}let d=o.index("host").getAllKeys(t.label);d.onsuccess=()=>{for(let u of d.result)o.delete(u);r.put(s)}})}async touch(t,e,n){return this.recordSeqs(t,{lastSeq:e},n)}async recordSeqs(t,e,n){let s=n??F,i=this.db.transaction([dt,ht],"readwrite"),r=i.objectStore(dt),o=i.objectStore(ht),l=[t,s.label,s.index];return new Promise((a,d)=>{i.oncomplete=()=>a(),i.onerror=()=>d(i.error);let u=r.get(t);u.onsuccess=()=>{if(!u.result)return;let p=o.get(l);p.onsuccess=()=>{let y=p.result,h=Ai(y)?y.lastSeq:0,b=Qn(h,e);if(b===void 0)return;o.put({host:t,label:s.label,index:s.index,lastSeq:b})}}})}async get(t){let e=this.db.transaction([dt,ht],"readonly"),n=e.objectStore(dt),s=e.objectStore(ht);return new Promise((i,r)=>{e.onerror=()=>r(e.error);let o,l,a=2,d=()=>{if(a-=1,a>0)return;if(!ji(o)){i(void 0);return}i(Ll(o,ad(l)))},u=n.get(t);u.onsuccess=()=>{o=u.result,d()};let p=s.index("host").getAll(t);p.onsuccess=()=>{l=p.result,d()}})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put(Pl({...n,...e})),0}catch{return 18}}async del(t){let e=this.db.transaction([dt,ht],"readwrite"),n=e.objectStore(dt),s=e.objectStore(ht);return new Promise((i,r)=>{e.oncomplete=()=>i(),e.onerror=()=>r(e.error),n.delete(t);let o=s.index("host").getAllKeys(t);o.onsuccess=()=>{for(let l of o.result)s.delete(l)}})}async list(){let t=this.db.transaction([dt,ht],"readonly"),e=t.objectStore(dt),n=t.objectStore(ht);return new Promise((s,i)=>{t.onerror=()=>i(t.error);let r,o,l=2,a=()=>{if(l-=1,l>0)return;let p=dd(o),y=[];if(Array.isArray(r))for(let h of r){if(!ji(h)||typeof h.label!=="string")continue;y.push(Ll(h,p.get(h.label)??[]))}s(y)},d=e.getAll();d.onsuccess=()=>{r=d.result,a()};let u=n.getAll();u.onsuccess=()=>{o=u.result,a()}})}async wipe(){let t=this.db.transaction([dt,ht],"readwrite"),e=t.objectStore(dt),n=t.objectStore(ht);return new Promise((s,i)=>{t.oncomplete=()=>s(),t.onerror=()=>i(t.error),e.clear(),n.clear()})}put(t){let e=this.db.transaction(dt,"readwrite"),n=e.objectStore(dt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.put(t)})}}function Ks(){return vi(Yl,Cl,(t)=>{if(!t.objectStoreNames.contains(Kt))t.createObjectStore(Kt,{keyPath:"label"})})}function Ml(t){return vi(t,Hl,ud)}function ud(t,e){if(!t.objectStoreNames.contains(dt))t.createObjectStore(dt,{keyPath:"label"});if(!t.objectStoreNames.contains(St))t.createObjectStore(St,{keyPath:["host","hash"]});if(!t.objectStoreNames.contains(ft))t.createObjectStore(ft);let n;if(!t.objectStoreNames.contains(_))n=t.createObjectStore(_);else n=e.objectStore(_);if(!n.indexNames.contains(Fe))n.createIndex(Fe,"apld",{unique:!1});if(!n.indexNames.contains(_i))n.createIndex(_i,"rlm",{unique:!1});if(!t.objectStoreNames.contains(xt))t.createObjectStore(xt,{keyPath:"label"});if(!t.objectStoreNames.contains(ht))t.createObjectStore(ht,{keyPath:["host","label","index"]}).createIndex("host","host",{unique:!1})}it();K();class $i{db;crypto;constructor(t,e){this.db=t;this.crypto=e}async add(t){let e=this.db.transaction(_,"readwrite"),n=e.objectStore(_);return new Promise((s)=>{if(t.length===0){s([]);return}let i=Array(t.length).fill(0);e.oncomplete=()=>s(i),e.onerror=()=>{for(let r=0;r<i.length;r++)i[r]=18;s(i)};for(let r=0;r<t.length;r++){let{key:o,data:l}=t[r],a=L(o),d=n.put(we(l),a);d.onerror=(u)=>{u.preventDefault(),i[r]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(_,"readwrite"),s=n.objectStore(_);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e){let l=L(o);s.delete(l)}})}async get(t){let n=this.db.transaction(_,"readonly").objectStore(_);return new Promise((s,i)=>{let r=L(t),o=n.get(r);o.onsuccess=async()=>{let l=o.result;if(l)s(await ee(t,l,this.crypto));else s(void 0)},o.onerror=()=>i(o.error)})}async has(t){return await this.get(t)!==void 0}async list(t){let e=t?.apld,n=t?.body!==!1,i=this.db.transaction(_,"readonly").objectStore(_);return new Promise((r,o)=>{let l=[],a=e===void 0?i.openCursor():i.index(Fe).openCursor(IDBKeyRange.only(e));a.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,y=u.value;l.push({hash:yt(p),data:y}),u.continue()}else Promise.all(l.map(({hash:p,data:y})=>ee(p,y,this.crypto,{body:n}))).then(r).catch(o)},a.onerror=()=>o(a.error)})}async count(t){let n=this.db.transaction(_,"readonly").objectStore(_);return new Promise((s,i)=>{let r=t===void 0?n.count():n.index(Fe).count(IDBKeyRange.only(t));r.onsuccess=()=>s(r.result),r.onerror=()=>i(r.error)})}async listKeys(){let e=this.db.transaction(_,"readonly").objectStore(_);return new Promise((n,s)=>{let i=[],r=e.openKeyCursor();r.onsuccess=(o)=>{let l=o.target.result;if(l)i.push(yt(l.key)),l.continue();else n(i)},r.onerror=()=>s(r.error)})}async last(t){let n=this.db.transaction(_,"readonly").objectStore(_);return new Promise((s,i)=>{let r,o=n.openCursor();o.onsuccess=async(l)=>{let a=l.target.result;if(a){let{key:d,value:u}=a;if(D(t,u.eid)){if(!r||(u.ctr??0)>(r.data.ctr??0)||(u.ctr??0)===(r.data.ctr??0)&&(u.off??0)>(r.data.off??0))r={key:d,data:u}}a.continue()}else if(r){let d=yt(r.key);s(await ee(d,r.data,this.crypto))}else s(void 0)},o.onerror=()=>i(o.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(_,"readwrite"),s=n.objectStore(_);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let o of e){let l=L(o),a=s.get(l);a.onsuccess=()=>{let d=a.result;if(!d)return;he(d,te),s.put(d,l)},a.onerror=(d)=>{d.preventDefault()}}})}async markFailed(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(_,"readwrite"),s=n.objectStore(_);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);for(let{key:o,err:l}of e){let a=L(o),d=s.get(a);d.onsuccess=()=>{let u=d.result;if(!u)return;he(u,Pt,l),s.put(u,a)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(_,"readwrite"),e=t.objectStore(_);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}K();class tr{db;constructor(t){this.db=t}async list(){let e=this.db.transaction(xt,"readonly").objectStore(xt);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>{let r=i.result,o=[];if(Array.isArray(r))for(let l of r){let a=ye(l);if(a!==void 0)o.push(a)}n(o)},i.onerror=()=>s(i.error)})}async get(t){let n=this.db.transaction(xt,"readonly").objectStore(xt);return new Promise((s,i)=>{let r=n.get(t);r.onsuccess=()=>s(ye(r.result)),r.onerror=()=>i(r.error)})}async put(t,e){let n=this.db.transaction(xt,"readwrite"),s=n.objectStore(xt);return new Promise((i,r)=>{let o=0;n.oncomplete=()=>i(o),n.onerror=()=>r(n.error);let l=s.get(t);l.onsuccess=()=>{let[a,d]=ss(t,ye(l.result),e);if(d!==0){o=d;return}s.put(a)}})}async wipe(){let t=this.db.transaction(xt,"readwrite"),e=t.objectStore(xt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}it();class er{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(St,"readwrite"),i=s.objectStore(St);return new Promise((r,o)=>{s.oncomplete=()=>r(),s.onerror=()=>o(s.error);for(let l of n){let a=Tt(l);i.put({host:t,hash:a})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(St,"readwrite"),i=s.objectStore(St);return new Promise((r,o)=>{s.oncomplete=()=>r(),s.onerror=()=>o(s.error);for(let l of n){let a=Tt(l);i.delete([t,a])}})}async list(t){let n=this.db.transaction(St,"readonly").objectStore(St);return new Promise((s,i)=>{let r=n.getAll();r.onsuccess=()=>{let l=r.result.filter((a)=>a.host===t).map((a)=>a.hash);s(l.map((a)=>nn(a)))},r.onerror=()=>i(r.error)})}async count(){let e=this.db.transaction(St,"readonly").objectStore(St);return new Promise((n,s)=>{let i=e.count();i.onsuccess=()=>n(i.result),i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(St,"readwrite"),e=t.objectStore(St);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var Kt="accounts",dt="hosts",ht="host_seqs",St="uploadQueue",ft="downloadQueue",_="messages",Fe="apld",_i="rlm",xt="realms";function pd(t,e){return{realms:new tr(t),hosts:new qi(t),uploads:new er(t),downloads:new Oi(t),messages:new $i(t,e)}}function wl(){return{realms:{async list(){return[]},async get(){return},async put(){return 13},async wipe(){}},hosts:{async add(){},async get(){return},async del(){},async set(){return 13},async list(){return[]},async wipe(){},async touch(){},async recordSeqs(){}},uploads:{async enq(){},async deq(){},async list(){return[]},async count(){return 0},async wipe(){}},downloads:{async enq(){},async deq(){},async list(){return[]},async count(){return 0},async wipe(){}},messages:{async add(t){return t.map(()=>18)},async get(){return},async has(){return!1},async del(){},async list(){return[]},async count(){return 0},async listKeys(){return[]},async last(){return},async markApplied(){},async markFailed(){},async wipe(){}}}}class Sn{account;realms;hosts;uploads;downloads;messages;#t;#e;#s;constructor(t,e,n,s){this.account=t,this.#e=e,this.#s=n;let i=wl();if(this.realms=i.realms,this.hosts=i.hosts,this.uploads=i.uploads,this.downloads=i.downloads,this.messages=i.messages,s!==void 0)this.#i(s)}#i(t){let e=this.#t;if(this.#t=t,t.onversionchange=()=>{if(this.#t!==t)return;this.#n()},this.#r(pd(t,this.#e)),e!==void 0&&e!==t)e.close()}#n(){let t=this.#t;if(this.#t=void 0,this.#r(wl()),t!==void 0)t.close()}#r(t){this.realms=t.realms,this.hosts=t.hosts,this.uploads=t.uploads,this.downloads=t.downloads,this.messages=t.messages}async bind(t){if(this.#s===void 0)return this.#t===void 0?13:0;let e=await this.#s(t);if(e===void 0)return 13;if(this.#t!==void 0&&this.#t.name===e)return 0;let n=await Ml(e);return this.#i(n),0}async prepareWorker(t){let e=await this.#s?.(t);if(e===void 0)return c(13);if(!(this.account instanceof be))return c(10);let n=await this.account.ensureEnts(t);return m({data:e,ents:n})}close(){this.#n()}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function nr(t){await md();let e=await Ks(),n=new be(e,t),s=new Sn(n,t,(r)=>n.dataName(r));if(n.setCloser(()=>s.close()),await n.dataName("")!==void 0)await s.bind("");return s}async function md(){if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((t)=>{setTimeout(()=>t(!1),2000)})])}catch{}}function Ul(t){return t!==null&&typeof t==="object"}function sr(t,e){let n=t[e];if(typeof n!=="string"||n==="")return;return n}function yd(t,e){if(t===void 0)return e;if(e.acct===void 0)e.acct=t.acct;if(e.data===void 0)e.data=t.data;if(e.ents===void 0)e.ents=t.ents;return e}function ir(t){if(!Ul(t)||typeof t.label!=="string")return;let e={label:t.label},n=sr(t,"acct"),s=sr(t,"data"),i=sr(t,"ents");if(n!==void 0)e.acct=n;if(s!==void 0)e.data=s;if(i!==void 0)e.ents=i;let r=Tl(t.keyTag),o=gl(t.keyring);if(r!==void 0)e.keyTag=r;if(o!==void 0)e.keyring=o;return e}function hd(t){let e=[];for(let n of t){let s=n.keyring;if(s===void 0)continue;for(let i of s.entries){if(i.credId.byteLength===0)continue;let r=!1;for(let o of e){if(!D(o.credId,i.credId))continue;if(o.label!==n.label)return c(10);r=!0;break}if(r)continue;e.push({label:n.label,salt:s.salt,sealedMaster:i.sealedMaster,credId:i.credId})}}return m(e)}function bd(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let s=ir(n);if(s!==void 0)e.push(s)}return e}function Zd(t,e,n,s){let i={label:e.label};if(e.acct!==void 0)i.acct=e.acct;if(e.data!==void 0)i.data=e.data;if(e.ents!==void 0)i.ents=e.ents;if(n!==void 0)i.keyTag=n;if(s!==void 0)i.keyring=s;t.put(i)}class be{db;#t;#e;constructor(t,e){this.db=t,this.#t=e}setCloser(t){this.#e=t}async create(t,e){let[n,s]=Xt(t);if(s!==0||n===void 0)return e.fill(0),c(10);if((await this.#n(n))?.keyTag!==void 0)return e.fill(0),c(19);if(e.byteLength<Is)return e.fill(0),c(10);let[r,o]=await rt.fromRandom(e);if(o!==0)return c(o);return this.save(r,{label:n})}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return c(10);let i=await this.#s(t,n);if(i!==0)return c(i);return m(t)}async dataName(t){let e=await this.#n(t);if(e===void 0)return;if(e.data!==void 0&&e.data!=="")return e.data;return await this.#o(t,(s)=>{if(s===void 0)return;return{...s}}),(await this.#n(t))?.data}async ensureEnts(t){let[e,n]=Xt(t);if(n!==0||e===void 0)throw Error("[DIPLOMATIC] invalid account label");let s=await this.#n(e),i=Di(s?.acct,s?.data),r=kl(i.acct,s?.ents);return await this.#o(e,(o)=>({...o===void 0?{label:e}:{...o},acct:i.acct,data:i.data,ents:r})),r}async wipe(){let t=await this.#r();this.#e?.();for(let s of t){if(s.data!==void 0)await Qi(s.data);if(s.ents!==void 0)await Qi(s.ents)}let e=this.db.transaction(Kt,"readwrite"),n=e.objectStore(Kt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.clear()})}async loadKeyring(t){let[e,n]=await this.#i(t);if(n!==0||e===void 0)return;return(await this.#n(e))?.keyring}async persistKeyring(t,e){let n;if(t!==void 0){let[r,o]=Zn(t);if(o!==0)return o;n=r}let[s,i]=await this.#i(e);if(i!==0)return i;if(s===void 0)return 13;return await this.#o(s,(r)=>{if(n===void 0){if(r?.keyTag===void 0)return;return{label:s,keyTag:r.keyTag}}let o={label:s,keyring:n};if(r?.keyTag!==void 0)o.keyTag=r.keyTag;return o}),0}async hasKeyring(t){let e=await this.loadKeyring(t);return e!==void 0&&e.entries.length>0}async unlock(t){let[e,n]=hd(await this.#r());if(n!==0)return c(n);if(e===void 0||e.length===0)return c(22);let s=e[0];if(s===void 0)return c(22);let[i,r]=await rt.unsealWithPasskey(e.map((y)=>({sealedMaster:y.sealedMaster,credId:y.credId,salt:y.salt})),{rpId:t.rpId,rpName:t.rpName,salt:s.salt});if(r!==0)return c(r);if(i===void 0)return c(20);let o=e.find((y)=>D(y.credId,i.credId));if(o===void 0)return c(13);let l=await this.#n(o.label),a=l?.keyTag;if(a!==void 0){if(!await fn(i.enclave,a))return c(19)}let d=l?.keyring;if(d===void 0)return c(13);let[u,p]=Fi(d,i.credId);if(p!==0)return c(p);if(u!==void 0)await this.#o(o.label,(y)=>{let h={label:o.label,keyring:u};if(y?.keyTag!==void 0)h.keyTag=y.keyTag;return h});return m({enclave:i.enclave,label:o.label})}async openPrfStore(t,e){let[n,s]=await this.#i(e),i=s===0?await this.loadKeyring(n):void 0,r=s===0?n:void 0;return Gn.open({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:i,persistKeyring:(o)=>this.persistKeyring(o,r),unlockAccount:async()=>{let[o,l]=await this.unlock(t);if(l!==0)return c(l);if(o===void 0)return c(13);return r=o.label,m({enclave:o.enclave,keyring:await this.loadKeyring(o.label)})}})}async#s(t,e){let n=await this.#n(e);if(n?.keyTag!==void 0){if(!await fn(t,n.keyTag))return 19;return 0}let[s,i]=await Ws(this.#t,t);if(i!==0)return i;let r=gs(s),o=!1;if(await this.#o(e,(l)=>{if(l?.keyTag!==void 0)return o=!0,l;let a={label:e,keyTag:r};if(l?.keyring!==void 0)a.keyring=l.keyring;return a}),!o)return 0;return this.#s(t,e)}async#i(t){if(t!==void 0){let[s,i]=Xt(t);if(i!==0||s===void 0)return c(10);return m(s)}let e=await this.#r(),n=e.length===1?e[0]:void 0;if(n!==void 0)return m(n.label);if(e.length===0)return c(13);return c(10)}#n(t){let n=this.db.transaction(Kt,"readonly").objectStore(Kt);return new Promise((s,i)=>{let r=n.get(t);r.onsuccess=()=>s(ir(r.result)),r.onerror=()=>i(r.error)})}#r(){let e=this.db.transaction(Kt,"readonly").objectStore(Kt);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>n(bd(i.result)),i.onerror=()=>s(i.error)})}async#o(t,e){let n=this.db.transaction(Kt,"readwrite"),s=n.objectStore(Kt);return new Promise((i,r)=>{n.oncomplete=()=>i(),n.onerror=()=>r(n.error);let o=s.get(t);o.onsuccess=()=>{let l=Ul(o.result)?o.result:void 0,a=ir(o.result),d=e(a);if(d===void 0){if(a!==void 0)s.delete(t);return}let u=yd(a,d===a?{...d}:d),p=Di(u.acct,u.data);if(u.acct=p.acct,u.data=p.data,d===a&&a?.acct===u.acct&&a?.data===u.data&&a?.ents===u.ents)return;let y=void 0;if(u.keyTag!==void 0)y=u.keyTag===a?.keyTag&&l?.keyTag!==void 0?l.keyTag:u.keyTag;let h=void 0;if(u.keyring!==void 0)h=u.keyring===a?.keyring&&l?.keyring!==void 0?l.keyring:u.keyring;Zd(s,u,y,h)}})}}async function Bl(t){let e=await Ks();try{return await new be(e,ne).ensureEnts(t)}finally{e.close()}}K();C();it();var ot="entities",xs="entity_type_created_at",or="entity_type_updated_at",lr="entity_type_parent_id",Qe="entity_tags",Jl="entity_rlm",zl="entity_type_group_id";var Nl=15;function Xd(t){return"typ"in t}function Gd(t){let e=me(t.rlm),n={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:L(t.eid),pid:t.pid?L(t.pid):void 0,...e!==void 0?{rlm:e}:{},tgs:t.tags,typ:t.type,upd:t.updatedAt};if(n.pid===void 0)delete n.pid;if(n.tgs===void 0)delete n.tgs;if(n.ctr===void 0)delete n.ctr;return n}function fd(t){if(!q(t))return{eid:L(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return Gd(t)}function ve(t){let e=me(t.rlm);return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:yt(t.eid),pid:t.pid?yt(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{},...e!==void 0?{rlm:e}:{}}}function rr(t){if(Xd(t))return ve(t);return{eid:yt(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function Sd(t,e){if(e instanceof Date)return IDBKeyRange.only([t,e]);let n=e.range;return IDBKeyRange.bound([t,n.start],[t,n.end],n.excludeStart===!0,n.excludeEnd===!0)}function Id(t){if(typeof t==="string")return IDBKeyRange.only(t);if("range"in t){let e=t.range;return IDBKeyRange.bound(e.start,e.end,e.excludeStart===!0,e.excludeEnd===!0)}return IDBKeyRange.bound(t.prefix,t.prefix+"￿")}function Vd(t,e,n){let s=[];if(typeof n==="string"){for(let o of t)if(o.typ===e)s.push(ve(o));return s}let i=new Set,r="prefix"in n?n.prefix:void 0;for(let o of t){if(o.typ!==e)continue;if(i.has(o.eid))continue;if(r!==void 0){let l=o.tgs;if(!l||!l.some((a)=>a.startsWith(r)))continue}i.add(o.eid),s.push(ve(o))}return s}class cr{name;db;opening;constructor(t){this.name=t}async init(){await this.ensureDb()}close(){let t=this.db;if(this.db=void 0,this.opening=void 0,t!==void 0)t.close()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=gd(this.name).then((t)=>(t.onversionchange=()=>{if(t.close(),this.db===t)this.db=void 0},this.db=t,this.opening=void 0,t),(t)=>{throw this.opening=void 0,t}),this.opening}apply=async(t)=>{let e=new Set,n=[],s=performance.now();N("idb apply start",{ops:t.length});let i;try{i=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let r=i.transaction(ot,"readwrite"),o=r.objectStore(ot);return new Promise((l)=>{let a=Array(t.length).fill(0);if(t.length<1){l({stats:[],types:e,eids:n});return}r.oncomplete=()=>{N("idb apply complete",{ops:t.length,ms:Math.round(performance.now()-s)}),l({stats:a,types:e,eids:n})},r.onerror=()=>{for(let u=0;u<a.length;u++)if(a[u]===void 0)a[u]=18;l({stats:a,types:e,eids:n})};let d=new Map;for(let u=0;u<t.length;u++){let p=t[u],y=L(p.eid),h={op:p,index:u},b=d.get(y);if(b)b.push(h);else d.set(y,[h])}for(let[u,p]of d){if(p.length<1)continue;let y=o.get(u);y.onsuccess=()=>{let h=y.result,b=h?rr(h):void 0,Z=!1;for(let{op:X,index:f}of p){let[S,g]=ke(b,X);if(g!==0){a[f]=g;continue}if(S===void 0){a[f]=12;continue}Z=!0;for(let V of Le(b,S))e.add(V);b=S}if(Z)n.push(p[0].op.eid);if(b){let X=o.put(fd(b));X.onerror=(f)=>{f.preventDefault();for(let{index:S}of p)a[S]=18}}},y.onerror=()=>{for(let{index:h}of p)a[h]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(ot,"readwrite"),n=e.objectStore(ot);return new Promise((s)=>{e.oncomplete=()=>s(0),e.onerror=()=>s(18),n.clear()})}async getRow(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let n=L(t),i=e.transaction(ot,"readonly").objectStore(ot);return new Promise((r)=>{let o=i.get(n);o.onsuccess=()=>{let l=o.result;if(!l)r(m(void 0));else r(m(rr(l)))},o.onerror=()=>r(c(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=pn(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let o=i.transaction(ot,"readonly").objectStore(ot).index(or),l=Sd(t,e);return new Promise((a)=>{let d=o.getAll(l);d.onsuccess=()=>{let u=d.result;a(m(u.map(ve)))},d.onerror=()=>a(c(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(ot,"readonly").objectStore(ot).index(xs);return new Promise((i)=>{let r=s.getAll(IDBKeyRange.bound([t],[t,[]]));r.onsuccess=()=>{let o=r.result;i(m(o.map(ve)))},r.onerror=()=>i(c(18))})}async getByTag(t,e){let[n,s]=mn(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let r=Id(e),l=i.transaction(ot,"readonly").objectStore(ot).index(Qe);return new Promise((a)=>{let d=l.getAll(r);d.onsuccess=()=>{let u=d.result;a(m(Vd(u,t,e)))},d.onerror=()=>a(c(18))})}async getAllEntities(t){if("pid"in t){let e;try{e=await this.ensureDb()}catch{return c(16)}let n=L(t.pid),i=e.transaction(ot,"readonly").objectStore(ot).index(lr);return new Promise((r)=>{let o=i.getAll(IDBKeyRange.only([t.type,n]));o.onsuccess=()=>{let a=o.result.map(ve);r(m(a))},o.onerror=()=>r(c(18))})}else if("tag"in t)return await this.getByTag(t.type,t.tag);else if("updatedAt"in t)return await this.getByUpdatedAt(t.type,t.updatedAt);return await this.getAllOfType(t.type)}async getEntities(t){let e=performance.now(),[n,s]=await this.getAllEntities(t);if(N("idb getEntities",{type:t.type,n:n?.length??0,ms:Math.round(performance.now()-e)}),s!==0)return c(s);return m(n)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(ot,"readonly").objectStore(ot).index(xs);return new Promise((i)=>{let r=IDBKeyRange.bound([t],[t,[]]),o=s.count(r);o.onsuccess=()=>i(m(o.result)),o.onerror=()=>i(c(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(ot,"readonly").objectStore(ot),i=[];return new Promise((r)=>{let o=s.openCursor();o.onsuccess=()=>{let l=o.result;if(l){let a=l.value;i.push(yn(rr(a))),l.continue()}else dn(i,t).then(r)},o.onerror=()=>r(c(18))})}}function Wd(t,e){if(!t.objectStoreNames.contains(ot))t.createObjectStore(ot,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(ot);if(!n.indexNames.contains(xs))n.createIndex(xs,["typ","crd"],{unique:!1});if(!n.indexNames.contains(or))n.createIndex(or,["typ","upd"],{unique:!1});if(n.indexNames.contains(zl))n.deleteIndex(zl);if(!n.indexNames.contains(lr))n.createIndex(lr,["typ","pid"],{unique:!1});if(n.indexNames.contains(Qe)){if(n.index(Qe).keyPath!=="tgs")n.deleteIndex(Qe)}if(!n.indexNames.contains(Qe))n.createIndex(Qe,"tgs",{unique:!1,multiEntry:!0});if(!n.indexNames.contains(Jl))n.createIndex(Jl,"rlm",{unique:!1})}function gd(t){return new Promise((e,n)=>{let s=indexedDB.open(t,Nl);s.onupgradeneeded=()=>{let{result:i,transaction:r}=s;if(!r){n(Error("Transaction is null during EntDB upgrade"));return}try{Wd(i,r)}catch(o){n(o instanceof Error?o:Error(String(o)))}},s.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${t} → v${Nl}); waiting for other connections to close`)},s.onsuccess=()=>e(s.result),s.onerror=()=>n(s.error??Error("EntDB IndexedDB open failed"))})}async function El(t){let e=new cr(t);return await e.init(),e}it();K();C();class Rs{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeTag=new Map;constructor(t=[],e){this.useIndex=e?.indexes!==!1;for(let n of t)this.put(n)}put(t){let e=q(t)?we(t):t,n=L(e.eid),s=this.ents.get(n);if(s!==void 0&&q(s))this.unindex(n,s);if(this.ents.set(n,e),q(e))this.index(n,e)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(q(e))this.unindex(t,e);this.ents.delete(t)}index(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(!n)n=new Map,this.byType.set(e.type,n);if(n.set(t,e),e.pid){let s=L(e.pid),i=this.byTypePid.get(e.type);if(!i)i=new Map,this.byTypePid.set(e.type,i);let r=i.get(s);if(!r)r=new Map,i.set(s,r);r.set(t,e)}if(e.tags){let s=this.byTypeTag.get(e.type);if(!s)s=new Map,this.byTypeTag.set(e.type,s);for(let i of e.tags){let r=s.get(i);if(!r)r=new Map,s.set(i,r);r.set(t,e)}}}unindex(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(n){if(n.delete(t),n.size===0)this.byType.delete(e.type)}if(e.pid){let s=L(e.pid),i=this.byTypePid.get(e.type),r=i?.get(s);if(r){if(r.delete(t),r.size===0)i?.delete(s)}if(i&&i.size===0)this.byTypePid.delete(e.type)}if(e.tags){let s=this.byTypeTag.get(e.type);if(s){for(let i of e.tags){let r=s.get(i);if(r){if(r.delete(t),r.size===0)s.delete(i)}}if(s.size===0)this.byTypeTag.delete(e.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeTag.clear()}bucketList(t){if(!t||t.size===0)return[];let e=[];for(let n of t.values())e.push(n);return e}byTagSpec(t,e){let[n,s]=mn(e);if(s!==0)return c(s);if(!n)return m([]);if(typeof e==="string")return m(this.bucketList(this.byTypeTag.get(t)?.get(e)));let i=this.byTypeTag.get(t);if(!i)return m([]);let r=new Set,o=[];for(let[l,a]of i){if(!Gi(l,e))continue;for(let[d,u]of a){if(r.has(d))continue;r.add(d),o.push(u)}}return m(o)}byDateSpec(t,e){let[n,s]=pn(e);if(s!==0)return c(s);if(!n)return m([]);let i=[],r=this.byType.get(t);if(r){for(let o of r.values())if(Xi(o.updatedAt,e))i.push(o)}return m(i)}async apply(t){let e=new Set,n=[],s=[];for(let i of t){let r=L(i.eid),o=this.ents.get(r),[l,a]=ke(o,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of Le(o,l))e.add(d);this.put(l),n.push(i.eid),s.push(0)}return{stats:s,types:e,eids:n}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(t){let e=L(t),n=this.ents.get(e);return m(n)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=L(t.pid);return m(this.bucketList(this.byTypePid.get(e)?.get(s)))}if("tag"in t)return this.byTagSpec(e,t.tag);if("updatedAt"in t)return this.byDateSpec(e,t.updatedAt);return m(this.bucketList(this.byType.get(e)))}let n=[];if("pid"in t){for(let s of this.ents.values())if(q(s)&&s.type===e&&s.pid&&D(s.pid,t.pid))n.push(s)}else if("tag"in t){let s=t.tag,[i,r]=mn(s);if(r!==0)return c(r);if(!i)return m(n);for(let o of this.ents.values())if(q(o)&&o.type===e&&o.tags&&o.tags.some((l)=>Gi(l,s)))n.push(o)}else if("updatedAt"in t){let s=t.updatedAt,[i,r]=pn(s);if(r!==0)return c(r);if(!i)return m(n);for(let o of this.ents.values())if(q(o)&&o.type===e&&Xi(o.updatedAt,s))n.push(o)}else for(let s of this.ents.values())if(q(s)&&s.type===e)n.push(s);return m(n)}async getEntities(t){let[e,n]=await this.getAllEntities(t);if(n!==0)return c(n);return m(e)}async countEntities({type:t}){if(this.useIndex)return m(this.byType.get(t)?.size??0);let e=0;for(let n of this.ents.values())if(q(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(yn(n));return dn(e,t)}}function Kd(t){let e=globalThis.requestAnimationFrame;if(typeof e!=="function"){queueMicrotask(t);return}e(()=>{e(t)})}async function dr(t){if(t?.verbose!==void 0)$n(t.verbose);let e=t?.name??await Bl(t?.label??""),n=await El(e);if(t?.cache===!1)return n;return new ur(n,void 0,{indexes:t?.indexes,optimistic:t?.optimistic})}class ur{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();optimistic;inflight=0;warmP=new Map;constructor(t,e,n){if(this.durable=t,this.optimistic=n?.optimistic!==!1,N("CachedEntDB open",{optimistic:this.optimistic}),this.mem=new Rs(e??[],{indexes:n?.indexes}),e)for(let s of e)this.warmed.add(s.type)}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}emit(t){if(t.size<1)return;let e=performance.now();N("emit start",{types:[...t],listeners:this.listeners.size});for(let n of this.listeners)n(t);N("emit done",{ms:Math.round(performance.now()-e)})}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){let e,n;if(this.optimistic){n=Hd(this.mem,t).types,e=new Map;for(let i of t){let r=L(i.eid);e.set(r,Fl(this.mem.ents.get(r)))}this.inflight+=1,N("apply mem patched",{ops:t.length,types:n?[...n]:[],inflight:this.inflight})}let s=this.run(async()=>{N("persist start",{ops:t.length});try{let i=performance.now(),r=await this.durable.apply(t);if(N("persist durable.apply done",{ms:Math.round(performance.now()-i)}),!this.optimistic){let{changed:l,status:a}=await this.pullEids(t.map((d)=>d.eid));if(this.emit(l),a!==0)return{stats:t.map(()=>a),types:r.types,eids:r.eids};return r}let o=[];for(let l=0;l<t.length;l++)if(r.stats[l]!==0)o.push(t[l].eid);if(o.length>0){N("persist pull rejected eids",{n:o.length});let{changed:l,status:a}=await this.pullEids(o,e);if(this.emit(l),a!==0)return{stats:t.map(()=>a),types:r.types,eids:r.eids}}return N("persist done"),r}finally{if(this.optimistic)this.inflight-=1}});if(n)Kd(()=>{N("emit after paint"),this.emit(n)});return s}clear(){return this.run(async()=>{let t=await this.durable.clear();if(t!==0)return t;let e=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(t){let e=[...t].length;return N("ingest queued",{eids:e}),this.run(async()=>{let n=performance.now();N("ingest start",{eids:e});let{changed:s,status:i}=await this.pullEids(t);return N("ingest done",{ms:Math.round(performance.now()-n),changed:[...s]}),this.emit(s),i})}async pullEids(t,e){let n=new Set,s=new Set;for(let i of t){let r=L(i);if(s.has(r))continue;s.add(r);let[o,l]=await this.durable.getRow(i);if(l!==0)return{changed:n,status:l};let a=this.mem.ents.get(r);if(a!==void 0&&o!==void 0&&ar(a,o))continue;if(e){if(!Cd(Fl(a),e.get(r)))continue}if(o){if(this.mem.put(o),!a||!xd(a,o)){if(q(o))n.add(o.type);if(a!==void 0&&q(a))n.add(a.type)}}else if(a!==void 0){if(this.mem.del(r),q(a))n.add(a.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let e=performance.now();N("warmType start",{type:t});let[n,s]=await this.durable.getEntities({type:t});if(s!==0)return s;if(n)for(let i of n){let r=L(i.eid),o=this.mem.ents.get(r);if(!o||ar(i,o))this.mem.put(i)}return this.warmed.add(t),N("warmType done",{type:t,n:n?.length??0,ms:Math.round(performance.now()-e)}),0}beginWarm(t){if(this.warmed.has(t))return Promise.resolve(0);let e=this.warmP.get(t);if(e)return e;let n=this.warmType(t).finally(()=>{this.warmP.delete(t)});return this.warmP.set(t,n),n}ensureWarm(t){if(this.warmed.has(t))return;this.beginWarm(t).then((e)=>{if(e===0)this.emit(new Set([t]))})}async getRow(t){let e=L(t);if(this.mem.ents.has(e))return this.mem.getRow(t);let[n,s]=await this.durable.getRow(t);if(s!==0)return c(s);if(n){let i=this.mem.ents.get(e);if(!i||ar(n,i))this.mem.put(n)}return this.mem.getRow(t)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getEntities(t){if(this.warmed.has(t.type))return N("getEntities mem",{type:t.type}),this.mem.getEntities(t);if(this.inflight>0)return N("getEntities inflight-mem",{type:t.type}),this.ensureWarm(t.type),this.mem.getEntities(t);N("getEntities beginWarm",{type:t.type});let e=await this.beginWarm(t.type);if(e!==0)return c(e);return N("getEntities afterWarm",{type:t.type}),this.mem.getEntities(t)}async countEntities({type:t}){if(this.warmed.has(t))return this.mem.countEntities({type:t});if(this.inflight>0)return this.ensureWarm(t),this.mem.countEntities({type:t});let e=await this.beginWarm(t);if(e!==0)return c(e);return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function xd(t,e){if(q(t)!==q(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!D(t.eid,e.eid))return!1;if(!q(t)||!q(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(!Td(t.pid,e.pid))return!1;if(!Rd(t.tags,e.tags))return!1;return Yd(t.body,e.body)}function Rd(t,e){if(t===e)return!0;if(t===void 0||e===void 0)return!1;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Td(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return D(t,e)}function Yd(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return D(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();try{return D(ce(t),ce(e))}catch{return!1}}function ar(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Fl(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function Cd(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function Hd(t,e){let n=new Set,s=[];for(let i of e){let r=L(i.eid),o=t.ents.get(r),[l,a]=ke(o,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of Le(o,l))n.add(d);t.put(l),s.push(0)}return{stats:s,types:n}}import{useEffect as Ys,useState as pr}from"react";K();C();zi();function Ql(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function vl(t){if(typeof t!=="number")return;return t}function kd(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=Ld(t.phase);if(e===void 0)return;let n={phase:e};if("host"in t&&typeof t.host==="string")n.host=t.host;if("done"in t&&typeof t.done==="number")n.done=t.done;if("total"in t&&typeof t.total==="number")n.total=t.total;if("bytesDone"in t&&typeof t.bytesDone==="number")n.bytesDone=t.bytesDone;if("bytesTotal"in t&&typeof t.bytesTotal==="number")n.bytesTotal=t.bytesTotal;return n}function Ld(t){if(t==="peek"||t==="pull"||t==="open"||t==="exec"||t==="push"||t==="import"||t==="idle"||t==="apply")return t==="apply"?"exec":t;return}function Dl(t){if(!t||typeof t!=="object")return;if(!("numUploads"in t)||!("numDownloads"in t))return;if(typeof t.numUploads!=="number"||typeof t.numDownloads!=="number")return;let e={phase:"idle"};if("progress"in t){let n=kd(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var Rt="[DIPLOMATIC]";class Vn{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:pe};clientState;xferState;constructor(t,e,n,s,i){this.state=t,this.store=e,this.readyTimeoutMs=i,this.clientState=new Ht(async()=>this.cachedClientState),this.xferState=new Ht(async()=>this.cachedXferState),this.scheduledSync=new hn(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(r){console.error(`${Rt} worker sync after local write failed`,r)}}),this.local=new Be(n,t,e,()=>{throw Error(`${Rt} local writer has no transport (use worker for network)`)},ne,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.local.xferState.listen((r)=>{this.cachedXferState={numUploads:r.numUploads,numDownloads:r.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(t){let e=this.worker;if(e){e.onmessage=null,e.onerror=null,e.onmessageerror=null;try{e.terminate()}catch{}}this.worker=t,t.onmessage=(n)=>{this.onMessage(n.data)},t.onerror=(n)=>{console.error(`${Rt} worker error`,n),this.failPending(Error(`${Rt} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${Rt} worker message error`))}}failPending(t){for(let[,e]of this.pending)e.reject(t);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(t,e,n={}){let s=n.clock??new qt,i=n.syncDebounceMs??_n,r=n.readyTimeoutMs??15000,o=new Vn(t,e,s,i,r);return await o.hydrateStateFromStore(e),o}async hydrateStateFromStore(t){await this.loadSession(!1);let e=await t.uploads.count(),n=await t.downloads.count();this.cachedXferState={numUploads:e,numDownloads:n,progress:pe}}async loadSession(t){let e=this.local.selected()?.enclave,n=await this.store.hosts.list();this.cachedClientState={hasSeed:e!==void 0,hasHost:Array.from(n).length>0,connected:t}}async pullRemoteXfer(){let t=await this.request({id:this.allocId(),op:"getXferState"}),e=Dl(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${Rt} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${Rt} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${Rt} worker terminated`))}onMessage(t){if(!Ql(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${Rt} worker init failed: ${e.message}`));return}case"clientState":{if(this.cachedClientState.connected===e.connected)return;this.cachedClientState={...this.cachedClientState,connected:e.connected},this.clientState.emit();return}case"xferState":{this.cachedXferState=e.state,this.xferState.emit();return}case"dirty":{N("worker dirty",{eids:e.eids.length}),this.state.refresh(e.eids.map(Md));return}case"wiped":{this.state.clear();return}case"reply":{let n=this.pending.get(e.id);if(!n)return;if(this.pending.delete(e.id),e.ok)n.resolve(e.result);else n.reject(new In(e.status));return}default:return}}allocId(){let t=this.nextId;return this.nextId+=1,t}request(t,e){let n=this.requireWorker();return new Promise((s,i)=>{if(this.pending.set(t.id,{resolve:s,reject:i}),e&&e.length>0)n.postMessage(t,e);else n.postMessage(t)})}async requestStatus(t,e){try{let n=await this.request(t,e),s=vl(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof In)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){let n=await this.local.setSeed(t,e);if(n!==0)return n;await this.loadSession(!1),this.clientState.emit();let s=this.local.selected()?.label??"",i;if(this.store instanceof Sn){let[l,a]=await this.store.prepareWorker(s);if(a!==0)return a;i=l}let r=this.allocId(),o=this.readyTimeoutMs;await new Promise((l,a)=>{let d=void 0,u=(p)=>{if(d!==void 0)clearTimeout(d);p()};this.pending.set(r,{resolve:(p)=>u(()=>l(p)),reject:(p)=>u(()=>a(p))}),d=setTimeout(()=>{this.pending.delete(r),a(Error(`${Rt} setSeed worker timeout after ${o}ms`))},o);try{let p=t.spawnSyncWorker({id:r,persist:e?.persist});if(this.bindWorker(p),i!==void 0)Xs(p,{id:0,op:"bind",label:s,data:i.data,ents:i.ents})}catch(p){if(this.pending.delete(r),d!==void 0)clearTimeout(d);a(p instanceof Error?p:Error(String(p)))}});try{await this.pullRemoteXfer()}catch{}return 0}async link(t,e=!0){await this.local.link(t,!1),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(t),connect:e})}async unlink(t){if(await this.local.unlink(t),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:t})}async hosts(){return this.local.hosts()}async connect(t=!0,e=!0){if(!this.worker)return;await this.request({id:this.allocId(),op:"connect",listen:t,sync:e})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(t,e){return this.local.insertRaw(t,e)}async updateRaw(t,e,n,s){return this.local.updateRaw(t,e,n,s)}async insert(t){return this.local.insert(t)}async update(t){return this.local.update(t)}async delete(t){return this.local.delete(t)}async genEID(t){return this.local.genEID(t)}async sync(){if(!this.worker)return 0;return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(t){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:t?.checkHost})}async listMsgs(t){return this.local.listMsgs(t)}async countMsgs(t){return this.local.countMsgs(t)}async reconcile(t,e){try{let n=await this.request({id:this.allocId(),op:"reconcile",hostLabel:t,pull:e?.pull,push:e?.push,sync:e?.sync});if(!Pd(n))return c(12);return m(n)}catch(n){if(n instanceof In&&n.status!==0)return c(n.status);return c(12)}}async msgcheck(){let t=await this.request({id:this.allocId(),op:"msgcheck"});if(!(t instanceof Uint8Array))throw Error(`${Rt} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${Rt} entcheck: expected Uint8Array`);return t}async wipe(t){let e=()=>this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});if(t?.seed===!0&&this.worker)await e();if(await this.local.wipe(t),t?.seed!==!0&&this.worker)await e();await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(t){let e=new Uint8Array(await t.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:e},[e.buffer])}async export(t,e){try{let n=await this.request({id:this.allocId(),op:"export"});if(!(n instanceof Uint8Array))return 12;let s=new Blob([n.slice()]);return es(s,t),0}catch(n){if(n instanceof In)return n.status;return 12}}}class In extends Error{status;constructor(t){super(`WorkerReplyError: ${W[t]}`);this.status=t;this.name="WorkerReplyError"}}function Pd(t){if(!t||typeof t!=="object")return!1;let e=t;return e.msgcheck instanceof Uint8Array&&e.msgcheck.length===32&&typeof e.numBags==="number"&&typeof e.numDupes==="number"}function Md(t){return t}var De="[DIPLOMATIC]";async function Ts(t){if(t.verbose!==void 0)$n(t.verbose);let e=t.clock??new qt;if(t.worker===!0&&wd(t)!==void 0)throw Error(`${De} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${De} sync on main thread `+"(no worker — app did not request a worker)");let i=await Ol(t.store);return Ud(e,t.state,i)}if(typeof Worker>"u")throw Error(`${De} worker: true but Worker API is unavailable`);let n=await Ol(void 0),s=await Vn.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${De} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${De} terminating sync worker`),s.terminate()}}}function wd(t){if("store"in t)return t.store;return}async function Ud(t,e,n){let s=new Be(t,e,n,mi,ne);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function Ol(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${De} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return nr(ne)}K();function Bd(t){let[e,n]=pr();return Ys(()=>{async function s(){let r=await t.clientState.get();n(r)}let i=t.clientState.listen(s);return s(),()=>{i()}},[t]),e}function Jd(t){let[e,n]=pr();return Ys(()=>{async function s(){let r=await t.xferState.get();n(r)}let i=t.xferState.listen(s);return s(),()=>{i()}},[t]),e}function zd(t){Ys(()=>{async function e(){try{if(!(await t.clientState.get()).hasSeed)return;await t.connect(),await t.sync()}catch(r){console.error("reconnectAndSync failed",r)}}function n(){e()}function s(){if(typeof document<"u"&&document.visibilityState==="visible")e()}function i(){e()}if(globalThis.addEventListener("online",n),typeof document<"u")document.addEventListener("visibilitychange",s);return globalThis.addEventListener("focus",i),globalThis.addEventListener("pageshow",i),()=>{if(globalThis.removeEventListener("online",n),typeof document<"u")document.removeEventListener("visibilitychange",s);globalThis.removeEventListener("focus",i),globalThis.removeEventListener("pageshow",i)}},[t])}function Nd(t={}){let e=t.clock??new qt,{seed:n,host:s,readyTimeoutMs:i,optimistic:r,verbose:o}=t,l=t.worker===!0,a="store"in t?t.store:void 0,[d,u]=pr({stateMgr:Zi});return Ys(()=>{let p=!1,y;return(async()=>{let h=await dr({optimistic:r,verbose:o});if(p)return;let b=An(h),Z=l?await Ts({state:b,clock:e,worker:!0,readyTimeoutMs:i,verbose:o}):await Ts({state:b,clock:e,store:a,readyTimeoutMs:i,verbose:o});if(p){Z.dispose();return}y=Z.dispose;let{client:X,mode:f}=Z;if(n){let S=await X.setSeed(n);if(S!==0){y(),u({stateMgr:b,error:Error(`setSeed ${W[S]}`)});return}}if(s)await X.link(s);if(p){y();return}u({client:X,entDB:h,stateMgr:b,mode:f,error:void 0})})().catch((h)=>{let b=h instanceof Error?h:Error(String(h));if(console.error("[DIPLOMATIC] useClient init failed",b),!p)u((Z)=>({...Z,client:void 0,error:b}))}),()=>{p=!0,y?.()}},[e,n,s,l,a,i,r,o]),d}import{use as Ed,useEffect as jl,useRef as Fd,useState as Qd}from"react";function Al(t,e,n){let[s,i]=Qd();return jl(()=>{async function r(){let o=performance.now();N(`watcher ${e} start`);let l=await n();N(`watcher ${e} setVal`,{ms:Math.round(performance.now()-o)}),i(l)}return r(),t.on(e,r),()=>{t.off(e,r)}},[t,e,n]),s}function vd(t,e,n){let s=Fd(n());return jl(()=>{async function i(){s.current=n()}return t.on(e,i),()=>{t.off(e,i)}},[t,e,n]),Ed(s.current)}it();st();K();He();Ne();at();K();class mr{queue=new Map;async enq(t){for(let e of t){let n=Ye(e.host,e.seq,e.realm);this.queue.set(n,e)}}async deq(t,e,n){for(let s of e)this.queue.delete(Ye(t,s,n))}async list(){let t=[];for(let e of this.queue.values())t.push(e);return t}async count(){return this.queue.size}async wipe(){this.queue.clear()}}K();at();class yr{hosts=new Map;#t=new Map;async add(t){let e=this.hosts.get(t.label);if(e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0)){this.hosts.set(t.label,{...t,lastSeq:0,clockOffset:e.clockOffset,subscription:e.subscription});return}this.#t.delete(t.label),this.hosts.set(t.label,{...t,lastSeq:0})}async touch(t,e,n){await this.recordSeqs(t,{lastSeq:e},n)}async recordSeqs(t,e,n){if(!this.hosts.has(t))return;let s=n??F,i=_t(s),r=this.#t.get(t),o=r?.get(i)?.lastSeq??0,l=Qn(o,e);if(l===void 0)return;let a=r??new Map;if(r===void 0)this.#t.set(t,a);a.set(i,{label:s.label,index:s.index,lastSeq:l})}async get(t){let e=this.hosts.get(t);if(e===void 0)return;return this.#e(e),e}async set(t,e){let n=this.hosts.get(t);if(!n)return 13;return this.hosts.set(t,{...n,...e}),0}async del(t){this.hosts.delete(t),this.#t.delete(t)}async list(){let t=[];for(let e of this.hosts.values())this.#e(e),t.push(e);return t}async wipe(){this.hosts.clear(),this.#t.clear()}#e(t){let e=this.#t.get(t.label),n=[];if(e!==void 0)for(let i of e.values())n.push(i);let s=vn(n);if(t.lastSeq=s.lastSeq,s.seqs!==void 0)t.seqs=s.seqs;else delete t.seqs}}it();K();class hr{crypto;messages=new Map;constructor(t){this.crypto=t}async add(t){let e=[];for(let{key:n,data:s}of t)this.messages.set(L(n),we(s)),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(L(e))}async get(t){let e=this.messages.get(L(t));if(e)return await ee(t,e,this.crypto);return}async has(t){return this.messages.has(L(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[i,r]of this.messages){if(e!==void 0&&Ue(r.apld)!==e)continue;let o=yt(i);s.push(await ee(o,r,this.crypto,{body:n}))}return s}async count(t){if(t===void 0)return this.messages.size;let e=0;for(let n of this.messages.values())if(Ue(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(yt(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(D(t,s.eid)===!1)continue;let i=yt(n);if(e===void 0)e={hash:i,data:s};else if((s.ctr??0)>(e.data.ctr??0)||(s.ctr??0)===(e.data.ctr??0)&&(s.off??0)>(e.data.off??0))e={hash:i,data:s}}if(e)return await ee(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(L(e));if(!n)continue;he(n,te)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(L(e));if(!s)continue;he(s,Pt,n)}}async wipe(){this.messages.clear()}}K();C();class br{#t;#e=new Map;constructor(t){this.#t=t}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return c(10);let i=this.#e.get(n)??{};if(i.tag!==void 0){if(!await fn(t,i.tag))return c(19)}else{let[r,o]=await Ws(this.#t,t);if(o!==0)return c(o);i.tag=r}return this.#e.set(n,i),m(t)}async wipe(){this.#e.clear()}peekKeyTag(t=""){let e=this.#e.get(t)?.tag;return e===void 0?void 0:gs(e)}}K();class Zr{#t=new Map;async list(){let t=[];for(let e of this.#t.values()){let n=ye(e);if(n!==void 0)t.push(n)}return t}async get(t){return ye(this.#t.get(t))}async put(t,e){let[n,s]=ss(t,await this.get(t),e);if(s!==0)return s;return this.#t.set(t,n),0}async wipe(){this.#t.clear()}}it();class Xr{queue=new Map;async enq(t,e){let n=this.queue.get(t)||new Set;this.queue.set(t,n);for(let s of e)n.add(Tt(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(Tt(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(nn(s));return n}async count(){let t=0;for(let e of this.queue.values())t+=e.size;return t}async wipe(){this.queue.clear()}}class ql{account;realms=new Zr;hosts=new yr;uploads=new Xr;downloads=new mr;messages;constructor(t){this.account=new br(t),this.messages=new hr(t)}async bind(){return 0}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}st();K();C();class _l{singletonType;latest;latestOff=-1;emitter=new Ot;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new E(e.eid),[s,i]=n.readStruct(ut);if(i!==0)continue;let r=new z;r.writeVarString(this.singletonType);let o=r.result();if(s.id.length===o.length&&s.id.every((l,a)=>l===o[a])){if(this.latest===void 0||e.off>this.latestOff)this.latestOff=e.off,this.latest=e.bod,this.emitter.emit(this.singletonType,null)}}return t.map(()=>0)}clear=async()=>(this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0);notify=(t)=>{for(let e of t)if(e===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(t)=>{this.notify([this.singletonType])};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}Ne();K();C();class $l{#t=new Map;#e;#s;#i;constructor(t){if(this.#s=t.rpId,this.#i=t.rpName,t.credId===void 0)return;let[e,n]=Xt(t.label);if(n!==0||e===void 0)return;this.#t.set(e,{credId:t.credId.slice()}),this.#e=e}get credId(){let t=this.#n(this.#e)?.credId;return t===void 0?void 0:t.slice()}setCredId(t,e){let[n,s]=Xt(e??this.#e);if(s!==0||n===void 0)return;let i=this.#t.get(n)??{};i.credId=t===void 0?void 0:t.slice(),this.#r(n,i),this.#e=n}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return c(10);let i=this.#t.get(n)??{};if(e?.persist!==!0)return i.enclave=t,this.#r(n,i),this.#e=n,m(t);let[r,o]=await t.persistToLargeBlob([],{rpId:this.#s,rpName:this.#i,credId:i.credId});if(o!==0)return c(o);if(r===void 0)return c(30);return i.credId=r,i.enclave=t,this.#r(n,i),this.#e=n,m(t)}async load(){return this.#n(this.#e)?.enclave}async unlock(t){let e;if(t?.label===void 0&&this.#e!==void 0)e=this.#e;else{let[o,l]=Xt(t?.label);if(l!==0||o===void 0)return c(10);e=o}let n=this.#t.get(e)??{},s=n.credId;if(s===void 0)return c(22);let[i,r]=await rt.fromLargeBlob({rpId:this.#s,rpName:this.#i,credId:s});if(r!==0)return c(r);if(i===void 0)return c(22);return n.credId=i.credId,n.enclave=i.enclave,this.#r(e,n),this.#e=e,m(i.enclave)}async wipe(){for(let t of this.#t.values()){let e=t.credId;if(e===void 0)continue;let n=await rt.clearLargeBlob(e,{rpId:this.#s});if(n!==0)return Promise.reject(Error(`clearLargeBlob status ${n}`))}this.#t.clear(),this.#e=void 0}#n(t){if(t===void 0)return;return this.#t.get(t)}#r(t,e){if(e.enclave===void 0&&e.credId===void 0){this.#t.delete(t);return}this.#t.set(t,e)}}le();fs();ki();ys();le();export{te as APLD_APPLIED,Pt as APLD_ERROR,vt as APLD_PENDING,ur as CachedEntDB,qt as Clock,Gs as DEFAULT_PRF_SALT,E as Decoder,rt as Enclave,z as Encoder,Rs as EntDBMemory,cr as EntIDB,pi as HTTPTransport,be as IDBAccountStore,Sn as IDBStore,Vl as KEYRING_MAX,gt as MASTER_SEED_LEN,ql as MemoryStore,$l as PasskeySeedStore,Gn as PrfSeedStore,nt as Purpose,bi as SEALED_MASTER_KEY_LEN,_l as SingletonStateManager,un as StateManager,W as Status,Be as SyncClient,Ot as TypedEventEmitter,Vn as WorkerClient,Ue as apldFromStored,Ft as asChildKey,Ci as asDHKEReq,Hi as asDHKEResp,Qt as asHostRlm,$t as asSealedMasterKey,yt as b64tob,_s as b64urltob,L as btob64,qs as btob64url,Tt as btoh,dn as checksumEntRevs,Ce as checksumSet,Lo as cmpBytes,ne as crypto,Me as defaultPeekProgressEvery,nl as defaultWebAuthnRpId,ut as eidCodec,Po as encodeEntRev,An as entStateManager,Yc as genSingletonEID,mi as hostHTTPTransport,nn as htob,pe as idleProgress,Ga as isApldState,q as isLiveEnt,fa as isPendingApply,Vi as isTerminalApplyFailure,ma as isTombstone,Kl as keyringCredIds,xl as keyringKind,id as keyringLabel,ka as largeBlobCapable,wo as normalizeTags,ba as nullEntDB,F as nullKDM,Zi as nullStateManager,Ts as openDiplomaticClient,dr as openEntDB,nr as openIDBStore,Ma as prfCapable,yn as revFromEntity,fi as revFromHead,he as setApld,ts as shouldEmitItemProgress,Nd as useClient,Bd as useClientState,Jd as useClientXferState,Al as useStateWatcher,vd as useStateWatcherSuspense,zd as useSyncOnResume,Ya as webAuthnLastError};
1
+ var Al=Object.defineProperty;var jl=(t)=>t;function ql(t,e){this[t]=jl.bind(null,e)}var _l=(t,e)=>{for(var n in e)Al(t,n,{get:e[n],enumerable:!0,configurable:!0,set:ql.bind(e,n)})};var z=(t,e)=>()=>(t&&(e=t(t=0)),e);var Tt=64,j=32,Zo=32,vt=8,Dt=32,Xo=30000,Go=512,g;var W=z(()=>{((f)=>{f[f.Success=0]="Success";f[f.InvalidSignature=3]="InvalidSignature";f[f.ClockOutOfSync=4]="ClockOutOfSync";f[f.UserNotRegistered=5]="UserNotRegistered";f[f.ServerMisconfigured=6]="ServerMisconfigured";f[f.MissingBody=7]="MissingBody";f[f.ExtraBodyContent=8]="ExtraBodyContent";f[f.MissingParam=9]="MissingParam";f[f.InvalidParam=10]="InvalidParam";f[f.InvalidRequest=11]="InvalidRequest";f[f.InternalError=12]="InternalError";f[f.NotFound=13]="NotFound";f[f.InvalidMessage=14]="InvalidMessage";f[f.NoChange=15]="NoChange";f[f.DatabaseClosed=16]="DatabaseClosed";f[f.StorageError=17]="StorageError";f[f.DatabaseError=18]="DatabaseError";f[f.HashMismatch=19]="HashMismatch";f[f.DecryptionError=20]="DecryptionError";f[f.NotImplemented=21]="NotImplemented";f[f.MissingSeed=22]="MissingSeed";f[f.OutOfBounds=23]="OutOfBounds";f[f.HostError=24]="HostError";f[f.CommunicationError=25]="CommunicationError";f[f.VarLimitExceeded=26]="VarLimitExceeded";f[f.InvalidResponse=27]="InvalidResponse";f[f.ConnectionClosed=28]="ConnectionClosed";f[f.CryptoError=29]="CryptoError";f[f.WebAuthnError=30]="WebAuthnError"})(g||={})});function m(t){return[t,0]}function l(t){return[void 0,t]}var C=z(()=>{W()});function $l(t){if(t<0)console.info("N",t),console.trace();if(typeof t!=="bigint")t=BigInt(t);if(t<0n)return l(10);let e=[];while(t>0n){let n=Number(t&0x7fn);if(t>>=7n,t>0n)e.push(n|128);else e.push(n)}if(e.length===0)return m(new Uint8Array([0]));if(e.length>8)return l(26);return m(new Uint8Array(e))}function tc(t,e=0){let n=0n,s=0,r=e;while(!0){if(r>=t.length)return l(14);let o=t[r++];if(o===void 0)return l(14);if(n|=BigInt(o&127)<<BigInt(s),(o&128)===0){if(r-e>8)return l(26);return m({value:n>0x1fffffffffffffn?n:Number(n),bytesRead:r-e})}if(s+=7,s>=56)return l(26)}}class M{data;pos=0;constructor(t){this.data=t}static async fromResponse(t){let e=await t.arrayBuffer(),n=new Uint8Array(e);return new M(n)}readBigInt(){if(this.pos+8>this.data.length)return l(7);let t=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,m(t)}readDate(){let[t,e]=this.readVarInt();if(e!==0)return l(e);return m(new Date(t))}readVarInt(){let[t,e]=tc(this.data,this.pos);if(e!==0)return l(e);this.pos+=t.bytesRead;let n=t.value;return m(typeof n==="bigint"?Number(n):n)}readVarString(){let[t,e]=this.readVarInt();if(e!==0)return l(e);let[n,s]=this.readBytes(t);if(s!==0)return l(s);let r=new TextDecoder().decode(n);return m(r)}readVarStrings(){let[t,e]=this.readVarInt();if(e!==0)return l(e);if(t<0||t>this.remaining())return l(14);let n=[];for(let s=0;s<t;s++){let[r,o]=this.readVarString();if(o!==0)return l(o);n.push(r)}return m(n)}readBytes(t){if(t<0)return l(10);if(this.pos+t>this.data.length)return l(23);let e=this.data.slice(this.pos,this.pos+t);return this.pos+=t,m(e)}readVarBytes(){let[t,e]=this.readVarInt();if(e!==0)return l(e);return this.readBytes(t)}readStruct(t){return t.decode(this)}readStructs(t){let e=[];while(!this.done()){let[n,s]=this.readStruct(t);if(s!==0)return l(s);e.push(n)}return m(e)}readBytesSeq(t){let e=[];while(!this.done()){let[n,s]=this.readBytes(t);if(s!==0)return l(s);e.push(n)}return m(e)}done(){return this.pos>=this.data.length}remaining(){return this.data.length-this.pos}readRest(){let t=this.data.subarray(this.pos);return this.pos=this.data.length,t}consumed(){return this.pos}}class U{parts=[];writeBigInt(t){let e=new Uint8Array(8);new DataView(e.buffer).setBigUint64(0,t,!1),this.parts.push(e)}writeDate(t){let e=t.getTime();return this.writeVarInt(e)}writeVarInt(t){let[e,n]=$l(t);if(n!==0)return n;return this.parts.push(e),0}writeVarString(t){let e=new TextEncoder().encode(t),n=this.writeVarInt(e.length);if(n!==0)return n;return this.writeBytes(e),0}writeVarStrings(t){let e=this.writeVarInt(t.length);if(e!==0)return e;for(let n of t){let s=this.writeVarString(n);if(s!==0)return s}return 0}prependBytes(t){this.parts.unshift(t.slice())}writeBytes(t){this.parts.push(t.slice())}writeVarBytes(t){let e=this.writeVarInt(t.length);if(e!==0)return e;return this.writeBytes(t),0}writeStruct(t,e){return t.encode(this,e)}writeStructs(t,e){for(let n of e){let s=this.writeStruct(t,n);if(s!==0)return s}return 0}writeBytesSeq(t){for(let e of t)this.writeBytes(e)}result(){let t=this.parts.reduce((s,r)=>s+r.length,0),e=new Uint8Array(t),n=0;for(let s of this.parts)e.set(s,n),n+=s.length;return e}wipe(){for(let t of this.parts)t.fill(0);this.parts.length=0}*scan(){for(let t of this.parts)yield t}}var tt=z(()=>{C();W()});function xn(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++){let r=t[s],o=e[s];if(r===void 0||o===void 0)return!1;n|=r^o}return n===0}function xt(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function tn(t){if(t.length%2!==0)throw Error("Invalid hex string");let e=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2)e[n/2]=Number.parseInt(t.substr(n,2),16);return e}function E(t,e){return xn(t,e)}function Ts(t){return L(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Ys(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return bt(n)}function We(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}var L,bt;var ot=z(()=>{if(typeof Uint8Array.prototype.toBase64==="function")L=(t)=>t.toBase64();else L=(t)=>btoa(String.fromCharCode(...t));if(typeof Uint8Array.fromBase64==="function")bt=(t)=>Uint8Array.fromBase64(t);else bt=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0))});function qt(t,e){return t.label===e.label&&t.index===e.index}var en;var ue=z(()=>{W();C();en={encode(t,e){let n=t.writeVarString(e.label);if(n!==0)return n;let s=t.writeVarInt(e.index);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return l(n);let[s,r]=t.readVarInt();if(r!==0)return l(r);return m({label:e,index:s})}}});var me;var go=z(()=>{me=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0});function Rn(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Ls(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function dt(t,...e){if(!Ls(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function ws(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function Vo(t,e){dt(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Ms(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}var sn=()=>{};function sc(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Cn(t){if(typeof t==="string")t=sc(t);else if(Ls(t))t=Tn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function Ko(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function Wo(t,e){if(t.length!==e.length)return!1;let n=0;for(let s=0;s<t.length;s++)n|=t[s]^e[s];return n===0}function Us(t,e,n=!0){if(e===void 0)return new Uint8Array(t);if(e.length!==t)throw Error("invalid output length, expected "+t+", got: "+e.length);if(n&&!rc(e))throw Error("invalid output, must be aligned");return e}function rc(t){return t.byteOffset%4===0}function Tn(t){return Uint8Array.from(t)}function Yt(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}var Ut=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4)),nc,xo=(t,e)=>{function n(s,...r){if(dt(s),t.nonceLength!==void 0){let u=r[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)dt(u);else dt(u,t.nonceLength)}let o=t.tagLength;if(o&&r[1]!==void 0)dt(r[1]);let i=e(s,...r),c=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");dt(p)}},a=!1;return{encrypt(u,p){if(a)throw Error("cannot encrypt() twice with same key + nonce");return a=!0,dt(u),c(i.encrypt.length,p),i.encrypt(u,p)},decrypt(u,p){if(dt(u),o&&u.length<o)throw Error("invalid ciphertext length: smaller than tagLength="+o);return c(i.decrypt.length,p),i.decrypt(u,p)}}}return Object.assign(n,t),n};var Yn=z(()=>{sn();/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */nc=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!nc)throw Error("Non little-endian hardware is not supported")});function rn(t=32){if(me&&typeof me.getRandomValues==="function")return me.getRandomValues(new Uint8Array(t));if(me&&typeof me.randomBytes==="function")return me.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var Ho=z(()=>{go()});function H(t,e){return t<<e|t>>>32-e}function Js(t){return t.byteOffset%4===0}function dc(t,e,n,s,r,o,i,c){let a=r.length,d=new Uint8Array(kn),u=Ut(d),p=Js(r)&&Js(o),y=p?Ut(r):Ro,b=p?Ut(o):Ro;for(let h=0;h<a;i++){if(t(e,n,s,u,i,c),i>=To)throw Error("arx: counter overflow");let Z=Math.min(kn,a-h);if(p&&Z===kn){let X=h/4;if(h%4!==0)throw Error("arx: invalid block position");for(let G=0,S;G<ac;G++)S=X+G,b[S]=y[S]^u[G];h+=kn;continue}for(let X=0,G;X<Z;X++)G=h+X,o[G]=r[G]^d[X];h+=Z}}function Yo(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:r,counterRight:o,rounds:i}=Ko({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return Rn(r),Rn(i),Ms(o),Ms(n),(c,a,d,u,p=0)=>{dt(c),dt(a),dt(d);let y=d.length;if(u===void 0)u=new Uint8Array(y);if(dt(u),Rn(p),p<0||p>=To)throw Error("arx: counter overflow");if(u.length<y)throw Error(`arx: output (${u.length}) is shorter than data (${y})`);let b=[],h=c.length,Z,X;if(h===32)b.push(Z=Tn(c)),X=cc;else if(h===16&&n)Z=new Uint8Array(32),Z.set(c),Z.set(c,16),X=lc,b.push(Z);else throw Error(`arx: invalid 32-byte key, got length=${h}`);if(!Js(a))b.push(a=Tn(a));let G=Ut(Z);if(s){if(a.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(X,G,Ut(a.subarray(0,16)),G),a=a.subarray(16)}let S=16-r;if(S!==a.length)throw Error(`arx: nonce must be ${S} or 16 bytes`);if(S!==12){let V=new Uint8Array(12);V.set(a,o?0:12-a.length),a=V,b.push(a)}let K=Ut(a);return dc(t,X,G,K,d,u,p,i),Yt(...b),u}}var Co=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),oc,ic,lc,cc,kn=64,ac=16,To=4294967295,Ro;var ko=z(()=>{sn();Yn();oc=Co("expand 16-byte k"),ic=Co("expand 32-byte k"),lc=Ut(oc),cc=Ut(ic);Ro=new Uint32Array});class Po{constructor(t){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,t=Cn(t),dt(t,32);let e=pt(t,0),n=pt(t,2),s=pt(t,4),r=pt(t,6),o=pt(t,8),i=pt(t,10),c=pt(t,12),a=pt(t,14);this.r[0]=e&8191,this.r[1]=(e>>>13|n<<3)&8191,this.r[2]=(n>>>10|s<<6)&7939,this.r[3]=(s>>>7|r<<9)&8191,this.r[4]=(r>>>4|o<<12)&255,this.r[5]=o>>>1&8190,this.r[6]=(o>>>14|i<<2)&8191,this.r[7]=(i>>>11|c<<5)&8065,this.r[8]=(c>>>8|a<<8)&8191,this.r[9]=a>>>5&127;for(let d=0;d<8;d++)this.pad[d]=pt(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:r,r:o}=this,i=o[0],c=o[1],a=o[2],d=o[3],u=o[4],p=o[5],y=o[6],b=o[7],h=o[8],Z=o[9],X=pt(t,e+0),G=pt(t,e+2),S=pt(t,e+4),K=pt(t,e+6),V=pt(t,e+8),I=pt(t,e+10),x=pt(t,e+12),R=pt(t,e+14),Y=r[0]+(X&8191),w=r[1]+((X>>>13|G<<3)&8191),k=r[2]+((G>>>10|S<<6)&8191),J=r[3]+((S>>>7|K<<9)&8191),P=r[4]+((K>>>4|V<<12)&8191),f=r[5]+(V>>>1&8191),Q=r[6]+((V>>>14|I<<2)&8191),N=r[7]+((I>>>11|x<<5)&8191),v=r[8]+((x>>>8|R<<8)&8191),D=r[9]+(R>>>5|s),T=0,nt=T+Y*i+w*(5*Z)+k*(5*h)+J*(5*b)+P*(5*y);T=nt>>>13,nt&=8191,nt+=f*(5*p)+Q*(5*u)+N*(5*d)+v*(5*a)+D*(5*c),T+=nt>>>13,nt&=8191;let st=T+Y*c+w*i+k*(5*Z)+J*(5*h)+P*(5*b);T=st>>>13,st&=8191,st+=f*(5*y)+Q*(5*p)+N*(5*u)+v*(5*d)+D*(5*a),T+=st>>>13,st&=8191;let at=T+Y*a+w*c+k*i+J*(5*Z)+P*(5*h);T=at>>>13,at&=8191,at+=f*(5*b)+Q*(5*y)+N*(5*p)+v*(5*u)+D*(5*d),T+=at>>>13,at&=8191;let _=T+Y*d+w*a+k*c+J*i+P*(5*Z);T=_>>>13,_&=8191,_+=f*(5*h)+Q*(5*b)+N*(5*y)+v*(5*p)+D*(5*u),T+=_>>>13,_&=8191;let Mt=T+Y*u+w*d+k*a+J*c+P*i;T=Mt>>>13,Mt&=8191,Mt+=f*(5*Z)+Q*(5*h)+N*(5*b)+v*(5*y)+D*(5*p),T+=Mt>>>13,Mt&=8191;let Se=T+Y*p+w*u+k*d+J*a+P*c;T=Se>>>13,Se&=8191,Se+=f*i+Q*(5*Z)+N*(5*h)+v*(5*b)+D*(5*y),T+=Se>>>13,Se&=8191;let Ie=T+Y*y+w*p+k*u+J*d+P*a;T=Ie>>>13,Ie&=8191,Ie+=f*c+Q*i+N*(5*Z)+v*(5*h)+D*(5*b),T+=Ie>>>13,Ie&=8191;let ge=T+Y*b+w*y+k*p+J*u+P*d;T=ge>>>13,ge&=8191,ge+=f*a+Q*c+N*i+v*(5*Z)+D*(5*h),T+=ge>>>13,ge&=8191;let Ve=T+Y*h+w*b+k*y+J*p+P*u;T=Ve>>>13,Ve&=8191,Ve+=f*d+Q*a+N*c+v*i+D*(5*Z),T+=Ve>>>13,Ve&=8191;let Ke=T+Y*Z+w*h+k*b+J*y+P*p;T=Ke>>>13,Ke&=8191,Ke+=f*u+Q*d+N*a+v*c+D*i,T+=Ke>>>13,Ke&=8191,T=(T<<2)+T|0,T=T+nt|0,nt=T&8191,T=T>>>13,st+=T,r[0]=nt,r[1]=st,r[2]=at,r[3]=_,r[4]=Mt,r[5]=Se,r[6]=Ie,r[7]=ge,r[8]=Ve,r[9]=Ke}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let i=2;i<10;i++)t[i]+=s,s=t[i]>>>13,t[i]&=8191;t[0]+=s*5,s=t[0]>>>13,t[0]&=8191,t[1]+=s,s=t[1]>>>13,t[1]&=8191,t[2]+=s,n[0]=t[0]+5,s=n[0]>>>13,n[0]&=8191;for(let i=1;i<10;i++)n[i]=t[i]+s,s=n[i]>>>13,n[i]&=8191;n[9]-=8192;let r=(s^1)-1;for(let i=0;i<10;i++)n[i]&=r;r=~r;for(let i=0;i<10;i++)t[i]=t[i]&r|n[i];t[0]=(t[0]|t[1]<<13)&65535,t[1]=(t[1]>>>3|t[2]<<10)&65535,t[2]=(t[2]>>>6|t[3]<<7)&65535,t[3]=(t[3]>>>9|t[4]<<4)&65535,t[4]=(t[4]>>>12|t[5]<<1|t[6]<<14)&65535,t[5]=(t[6]>>>2|t[7]<<11)&65535,t[6]=(t[7]>>>5|t[8]<<8)&65535,t[7]=(t[8]>>>8|t[9]<<5)&65535;let o=t[0]+e[0];t[0]=o&65535;for(let i=1;i<8;i++)o=(t[i]+e[i]|0)+(o>>>16)|0,t[i]=o&65535;Yt(n)}update(t){ws(this);let{buffer:e,blockLen:n}=this;t=Cn(t);let s=t.length;for(let r=0;r<s;){let o=Math.min(n-this.pos,s-r);if(o===n){for(;n<=s-r;r+=n)this.process(t,r);continue}if(e.set(t.subarray(r,r+o),this.pos),this.pos+=o,r+=o,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){Yt(this.h,this.r,this.buffer,this.pad)}digestInto(t){ws(this),Vo(t,this),this.finished=!0;let{buffer:e,h:n}=this,{pos:s}=this;if(s){e[s++]=1;for(;s<16;s++)e[s]=0;this.process(e,0,!0)}this.finalize();let r=0;for(let o=0;o<8;o++)t[r++]=n[o]>>>0,t[r++]=n[o]>>>8;return t}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}}function uc(t){let e=(s,r)=>t(r).update(Cn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var pt=(t,e)=>t[e++]&255|(t[e++]&255)<<8,Bs;var Lo=z(()=>{sn();Yn();Bs=uc((t)=>new Po(t))});function mc(t,e,n,s,r,o=20){let i=t[0],c=e[0],a=e[1],d=e[2],u=e[3],p=t[1],y=n[0],b=n[1],h=r,Z=0,X=t[2],G=e[4],S=e[5],K=e[6],V=e[7],I=t[3],x=i,R=c,Y=a,w=d,k=u,J=p,P=y,f=b,Q=h,N=Z,v=X,D=G,T=S,nt=K,st=V,at=I;for(let Mt=0;Mt<o;Mt+=2)k^=H(x+T|0,7),Q^=H(k+x|0,9),T^=H(Q+k|0,13),x^=H(T+Q|0,18),N^=H(J+R|0,7),nt^=H(N+J|0,9),R^=H(nt+N|0,13),J^=H(R+nt|0,18),st^=H(v+P|0,7),Y^=H(st+v|0,9),P^=H(Y+st|0,13),v^=H(P+Y|0,18),w^=H(at+D|0,7),f^=H(w+at|0,9),D^=H(f+w|0,13),at^=H(D+f|0,18),R^=H(x+w|0,7),Y^=H(R+x|0,9),w^=H(Y+R|0,13),x^=H(w+Y|0,18),P^=H(J+k|0,7),f^=H(P+J|0,9),k^=H(f+P|0,13),J^=H(k+f|0,18),D^=H(v+N|0,7),Q^=H(D+v|0,9),N^=H(Q+D|0,13),v^=H(N+Q|0,18),T^=H(at+st|0,7),nt^=H(T+at|0,9),st^=H(nt+T|0,13),at^=H(st+nt|0,18);let _=0;s[_++]=i+x|0,s[_++]=c+R|0,s[_++]=a+Y|0,s[_++]=d+w|0,s[_++]=u+k|0,s[_++]=p+J|0,s[_++]=y+P|0,s[_++]=b+f|0,s[_++]=h+Q|0,s[_++]=Z+N|0,s[_++]=X+v|0,s[_++]=G+D|0,s[_++]=S+T|0,s[_++]=K+nt|0,s[_++]=V+st|0,s[_++]=I+at|0}function pc(t,e,n,s){let r=t[0],o=e[0],i=e[1],c=e[2],a=e[3],d=t[1],u=n[0],p=n[1],y=n[2],b=n[3],h=t[2],Z=e[4],X=e[5],G=e[6],S=e[7],K=t[3];for(let I=0;I<20;I+=2)a^=H(r+X|0,7),y^=H(a+r|0,9),X^=H(y+a|0,13),r^=H(X+y|0,18),b^=H(d+o|0,7),G^=H(b+d|0,9),o^=H(G+b|0,13),d^=H(o+G|0,18),S^=H(h+u|0,7),i^=H(S+h|0,9),u^=H(i+S|0,13),h^=H(u+i|0,18),c^=H(K+Z|0,7),p^=H(c+K|0,9),Z^=H(p+c|0,13),K^=H(Z+p|0,18),o^=H(r+c|0,7),i^=H(o+r|0,9),c^=H(i+o|0,13),r^=H(c+i|0,18),u^=H(d+a|0,7),p^=H(u+d|0,9),a^=H(p+u|0,13),d^=H(a+p|0,18),Z^=H(h+b|0,7),y^=H(Z+h|0,9),b^=H(y+Z|0,13),h^=H(b+y|0,18),X^=H(K+S|0,7),G^=H(X+K|0,9),S^=H(G+X|0,13),K^=H(S+G|0,18);let V=0;s[V++]=r,s[V++]=d,s[V++]=h,s[V++]=K,s[V++]=u,s[V++]=p,s[V++]=y,s[V++]=b}var Fs,Ns;var wo=z(()=>{ko();sn();Lo();Yn();Fs=Yo(mc,{counterRight:!0,extendNonceFn:pc}),Ns=xo({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=Us(n.length+32,s,!1);let r=s.subarray(0,32),o=s.subarray(32);s.set(n,32),Yt(r),Fs(t,e,s,s);let i=Bs(o,r);return s.set(i,16),Yt(s.subarray(0,16),i),s.subarray(16)},decrypt(n,s){dt(n),s=Us(n.length+32,s,!1);let r=s.subarray(0,32),o=s.subarray(32,48),i=s.subarray(48);s.set(n,32),Yt(r);let c=Fs(t,e,r,r),a=Bs(i,c);if(!Wo(o,a))throw Error("invalid tag");return Fs(t,e,s.subarray(16),s.subarray(16)),Yt(r,o,a),i}}))});function yc(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function on(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function pe(t,...e){if(!yc(t))throw Error("Uint8Array expected");if(e.length>0&&!e.includes(t.length))throw Error("Uint8Array expected of length "+e+", got length="+t.length)}function ln(t,e=!0){if(t.destroyed)throw Error("Hash instance has been destroyed");if(e&&t.finished)throw Error("Hash#digest() has already been called")}function Pn(t,e){pe(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Mo(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function xe(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function He(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function cn(t,e){return t<<32-e|t>>>e}function Jo(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}function bc(t){for(let e=0;e<t.length;e++)t[e]=Jo(t[e]);return t}function hc(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Re(t){if(typeof t==="string")t=hc(t);return pe(t),t}class Es{}function Fo(t){let e=(s,r)=>t(r).update(Re(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var Uo,Bo,Zt;var Ln=z(()=>{/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */Uo=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();Bo=Uo?(t)=>t:(t)=>Jo(t);Zt=Uo?(t)=>t:bc});var No;var Eo=z(()=>{No=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225])});function zs(t,e=!1){if(e)return{h:Number(t&wn),l:Number(t>>zo&wn)};return{h:Number(t>>zo&wn)|0,l:Number(t&wn)|0}}var wn,zo;var Qo=z(()=>{wn=BigInt(4294967295),zo=BigInt(32)});function Jt(t,e,n,s,r){return t=t+e+r|0,s=cn(s^t,16),n=n+s|0,e=cn(e^n,12),{a:t,b:e,c:n,d:s}}function Bt(t,e,n,s,r){return t=t+e+r|0,s=cn(s^t,8),n=n+s|0,e=cn(e^n,7),{a:t,b:e,c:n,d:s}}var vo=z(()=>{Ln()});function vs(t,e,n,s,r,o,i,c,a,d,u,p,y,b,h,Z,X,G,S,K){let V=0;for(let I=0;I<s;I++)({a:r,b:a,c:y,d:X}=Jt(r,a,y,X,n[e+t[V++]])),{a:r,b:a,c:y,d:X}=Bt(r,a,y,X,n[e+t[V++]]),{a:o,b:d,c:b,d:G}=Jt(o,d,b,G,n[e+t[V++]]),{a:o,b:d,c:b,d:G}=Bt(o,d,b,G,n[e+t[V++]]),{a:i,b:u,c:h,d:S}=Jt(i,u,h,S,n[e+t[V++]]),{a:i,b:u,c:h,d:S}=Bt(i,u,h,S,n[e+t[V++]]),{a:c,b:p,c:Z,d:K}=Jt(c,p,Z,K,n[e+t[V++]]),{a:c,b:p,c:Z,d:K}=Bt(c,p,Z,K,n[e+t[V++]]),{a:r,b:d,c:h,d:K}=Jt(r,d,h,K,n[e+t[V++]]),{a:r,b:d,c:h,d:K}=Bt(r,d,h,K,n[e+t[V++]]),{a:o,b:u,c:Z,d:X}=Jt(o,u,Z,X,n[e+t[V++]]),{a:o,b:u,c:Z,d:X}=Bt(o,u,Z,X,n[e+t[V++]]),{a:i,b:p,c:y,d:G}=Jt(i,p,y,G,n[e+t[V++]]),{a:i,b:p,c:y,d:G}=Bt(i,p,y,G,n[e+t[V++]]),{a:c,b:a,c:b,d:S}=Jt(c,a,b,S,n[e+t[V++]]),{a:c,b:a,c:b,d:S}=Bt(c,a,b,S,n[e+t[V++]]);return{v0:r,v1:o,v2:i,v3:c,v4:a,v5:d,v6:u,v7:p,v8:y,v9:b,v10:h,v11:Z,v12:X,v13:G,v14:S,v15:K}}var Qs;var Do=z(()=>{vo();Ln();Qs=class Qs extends Es{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,on(t),on(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=xe(this.buffer)}update(t){ln(this),t=Re(t),pe(t);let{blockLen:e,buffer:n,buffer32:s}=this,r=t.length,o=t.byteOffset,i=t.buffer;for(let c=0;c<r;){if(this.pos===e)Zt(s),this.compress(s,0,!1),Zt(s),this.pos=0;let a=Math.min(e-this.pos,r-c),d=o+c;if(a===e&&!(d%4)&&c+a<r){let u=new Uint32Array(i,d,Math.floor((r-c)/4));Zt(u);for(let p=0;c+e<r;p+=s.length,c+=e)this.length+=e,this.compress(u,p,!1);Zt(u);continue}n.set(t.subarray(c,c+a),this.pos),this.pos+=a,this.length+=a,c+=a}return this}digestInto(t){ln(this),Pn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,He(this.buffer.subarray(e)),Zt(n),this.compress(n,0,!0),Zt(n);let s=xe(t);this.get().forEach((r,o)=>s[o]=Bo(r))}digest(){let{buffer:t,outputLen:e}=this;this.digestInto(t);let n=t.slice(0,e);return this.destroy(),n}_cloneInto(t){let{buffer:e,length:n,finished:s,destroyed:r,outputLen:o,pos:i}=this;return t||(t=new this.constructor({dkLen:o})),t.set(...this.get()),t.buffer.set(e),t.destroyed=r,t.finished=s,t.length=n,t.pos=i,t.outputLen=o,t}clone(){return this._cloneInto()}}});var kt,Ft,Oo,Ds,Os;var Ao=z(()=>{Eo();Qo();Do();Ln();kt={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},Ft=No.slice(),Oo=(()=>{let t=Array.from({length:16},(s,r)=>r),e=(s)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((r)=>s[r]),n=[];for(let s=0,r=t;s<7;s++,r=e(r))n.push(...r);return Uint8Array.from(n)})();Ds=class Ds extends Qs{constructor(t={},e=0){super(64,t.dkLen===void 0?32:t.dkLen);this.chunkPos=0,this.chunksDone=0,this.flags=0,this.stack=[],this.posOut=0,this.bufferOut32=new Uint32Array(16),this.chunkOut=0,this.enableXOF=!0;let{key:n,context:s}=t,r=s!==void 0;if(n!==void 0){if(r)throw Error('Only "key" or "context" can be specified at same time');let o=Re(n).slice();pe(o,32),this.IV=xe(o),Zt(this.IV),this.flags=e|kt.KEYED_HASH}else if(r){let o=Re(s),i=new Ds({dkLen:32},kt.DERIVE_KEY_CONTEXT).update(o).digest();this.IV=xe(i),Zt(this.IV),this.flags=e|kt.DERIVE_KEY_MATERIAL}else this.IV=Ft.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=Mo(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:r,pos:o}=this,{h:i,l:c}=zs(BigInt(t),!0),{v0:a,v1:d,v2:u,v3:p,v4:y,v5:b,v6:h,v7:Z,v8:X,v9:G,v10:S,v11:K,v12:V,v13:I,v14:x,v15:R}=vs(Oo,s,n,7,r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],Ft[0],Ft[1],Ft[2],Ft[3],i,c,o,e);r[0]=a^X,r[1]=d^G,r[2]=u^S,r[3]=p^K,r[4]=y^V,r[5]=b^I,r[6]=h^x,r[7]=Z^R}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=kt.CHUNK_START;if(this.chunkPos===15||n)s|=kt.CHUNK_END;if(!n)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,s,t,e),this.chunkPos+=1,this.chunkPos===16||n){let r=this.state;this.state=this.IV.slice();for(let o,i=this.chunksDone+1;n||!(i&1);i>>=1){if(!(o=this.stack.pop()))break;this.buffer32.set(o,0),this.buffer32.set(r,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|kt.PARENT,this.buffer32,0),r=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(r)}this.pos=0}_cloneInto(t){t=super._cloneInto(t);let{IV:e,flags:n,state:s,chunkPos:r,posOut:o,chunkOut:i,stack:c,chunksDone:a}=this;return t.state.set(s.slice()),t.stack=c.map((d)=>Uint32Array.from(d)),t.IV.set(e),t.flags=n,t.chunkPos=r,t.chunksDone=a,t.posOut=o,t.chunkOut=i,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,He(this.state,this.buffer32,this.IV,this.bufferOut32),He(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:r}=this,{h:o,l:i}=zs(BigInt(this.chunkOut++));Zt(s);let{v0:c,v1:a,v2:d,v3:u,v4:p,v5:y,v6:b,v7:h,v8:Z,v9:X,v10:G,v11:S,v12:K,v13:V,v14:I,v15:x}=vs(Oo,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],Ft[0],Ft[1],Ft[2],Ft[3],i,o,e,n);r[0]=c^Z,r[1]=a^X,r[2]=d^G,r[3]=u^S,r[4]=p^K,r[5]=y^V,r[6]=b^I,r[7]=h^x,r[8]=t[0]^Z,r[9]=t[1]^X,r[10]=t[2]^G,r[11]=t[3]^S,r[12]=t[4]^K,r[13]=t[5]^V,r[14]=t[6]^I,r[15]=t[7]^x,Zt(s),Zt(r),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,He(this.buffer.subarray(this.pos));let t=this.flags|kt.ROOT;if(this.stack.length)t|=kt.PARENT,Zt(this.buffer32),this.compress(this.buffer32,0,!0),Zt(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?kt.CHUNK_START:0)|kt.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){ln(this,!1),pe(t),this.finish();let{blockLen:e,bufferOut:n}=this;for(let s=0,r=t.length;s<r;){if(this.posOut>=e)this.b2CompressOut();let o=Math.min(e-this.posOut,r-s);t.set(n.subarray(this.posOut,this.posOut+o),s),this.posOut+=o,s+=o}return t}xofInto(t){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(t)}xof(t){return on(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(Pn(t,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}};Os=Fo((t)=>new Ds(t))});function jo(t){if(t.byteLength!==Zc)return l(10);return m(t)}function _o(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function Gc(t){let e=new Uint8Array(32),n=(t%O+O)%O;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function fc(t){let e=t.slice();return e[31]&=127,_o(e)}function Sc(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function Mn(t,e,n){let s=-t,r=(e^n)&s;return[e^r,n^r]}function Ic(t){let e=O-2n,n=(t%O+O)%O,s=1n;while(e>0n){if(e&1n)s=s*n%O;n=n*n%O,e>>=1n}return s}function As(t,e){let n=Sc(t),s=fc(e),r=1n,o=0n,i=s,c=1n,a=0n,d=_o(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;a^=p,[r,i]=Mn(a,r,i),[o,c]=Mn(a,o,c),a=p;let y=(r+o)%O,b=y*y%O,h=(r-o+O)%O,Z=h*h%O,X=(b-Z+O)%O,G=(i+c)%O,K=(i-c+O)%O*y%O,V=G*h%O,I=(K+V)%O,x=(K-V+O)%O;i=I*I%O,c=s*x*x%O,r=b*Z%O,o=X*(b+Xc*X)%O}return[r,i]=Mn(a,r,i),[o,c]=Mn(a,o,c),n.fill(0),Gc(r*Ic(o)%O)}function $o(t){return As(t,qo)}var Zc=32,tm,O,Xc=121665n,qo;var ti=z(()=>{W();C();tm=Symbol("X25519Sk");O=(1n<<255n)-19n,qo=new Uint8Array(32);qo[0]=9});function ei(t){let e=new Uint8Array(js.length+32);return e.set(js),e.set(t.subarray(0,32),js.length),e}function ni(t){let e=new Uint8Array(qs.length+32);return e.set(qs),e.set(t.subarray(0,32),qs.length),e}function si(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Nt(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}async function gc(t){return rn(t)}async function _s(){return rn(32)}async function Ce(t,e){let n=rn(24),r=Ns(e,n).encrypt(t);return new Uint8Array([...n,...r])}async function ye(t,e){let n=t.slice(0,24),s=t.slice(24);return Ns(e,n).decrypt(s)}async function Un(t){let e=t,n=ei(e),s=Nt(n),r;try{let d=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!0,["sign"]);r=await globalThis.crypto.subtle.exportKey("jwk",d)}finally{n.fill(0),new Uint8Array(s).fill(0)}if(typeof r.x!=="string")throw Error("Ed25519 JWK missing x");let o=r.x;r.d=void 0;let i=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:o},{name:"Ed25519"},!0,["verify"]),c=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",i)),a=new Uint8Array(64);return a.set(e,0),a.set(c,32),{keyType:"ed25519",privateKey:a,publicKey:c}}async function Vc(t){let e=t.subarray(0,32),n=ei(e),s=Nt(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async function Kc(t){return await globalThis.crypto.subtle.importKey("raw",Nt(t),{name:"Ed25519"},!1,["verify"])}async function $s(t,e){let n=si(t),s=await Vc(e),r=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Nt(n));return new Uint8Array(r)}async function Wc(t,e,n){let s=si(e);try{return await globalThis.crypto.subtle.verify({name:"Ed25519"},n,Nt(t),Nt(s))}catch{return!1}}async function an(t,e){if(e===void 0)return Os(t);return Os(t,e)}async function tr(){let t=await rn(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=jo(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=$o(e),r=ni(e),o=Nt(r);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",o,{name:"X25519"},!0,["deriveBits"]),c=await globalThis.crypto.subtle.exportKey("jwk",i);if(typeof c.x!=="string")throw Error("X25519 JWK missing x");let a=Ys(c.x);if(c.d=void 0,!E(a,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(i){throw e.fill(0),i}finally{r.fill(0),new Uint8Array(o).fill(0)}}async function ri(t,e){let n=ni(t),s=Nt(n);try{let r=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),o=await globalThis.crypto.subtle.importKey("raw",Nt(e),{name:"X25519"},!1,[]),i=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:o},r,256);return new Uint8Array(i)}catch{return As(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}function xc(t){return Object.freeze(t),t}var js,qs,oi;var Te=z(()=>{Ho();wo();Ao();ot();W();ti();js=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);qs=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);oi=xc({genRandomBytes:gc,gen256BitSecureRandomSeed:_s,encryptXSalsa20Poly1305Combined:Ce,decryptXSalsa20Poly1305Combined:ye,deriveEd25519KeyPair:Un,signEd25519:$s,importVerifyKey:Kc,checkSigEd25519:Wc,blake3:an})});function Hc(t,e){return t}function ii(t){return t}function Et(t,e){if(t.byteLength!==j)return l(10);return m(ii(t))}function zt(t){return Et(t,A.HostRLM)}function Rc(t){if(t instanceof Uint8Array)return m(t);let e=new U,n=en.encode(e,t);if(n!==0)return l(n);return m(e.result())}async function li(t,e){try{return m(await an(t,e))}catch{return l(29)}}async function Cc({parent:t,purpose:e}){let[n,s]=await li(t,{context:e});if(s!==0)return l(s);return m(Hc(n,e))}async function Tc({pdk:t,kdm:e}){let[n,s]=Rc(e);if(s!==0)return l(s);let[r,o]=await li(n,{key:t});if(o!==0)return l(o);return m(ii(r))}async function lt({parent:t,purpose:e,kdm:n}){let[s,r]=await Cc({parent:t,purpose:e});if(r!==0)return l(r);try{return await Tc({pdk:s,kdm:n})}finally{s.fill(0)}}var A,ym,bm,B;var ct=z(()=>{tt();ue();W();C();Te();A={Identity:"diplomatic.identity.v1",Cipher:"diplomatic.cipher.v1",Bind:"diplomatic.bind.v1",BindTag:"diplomatic.bindtag.v1",Fingerprint:"diplomatic.fingerprint.v1",Pair:"diplomatic.qrpair.v1",BagKdm:"diplomatic.bagkdm.v1",RealmKey:"diplomatic.realmKey.v1",RealmID:"diplomatic.realmID.v1",HostRLM:"diplomatic.hostRLM.v1",Export:"diplomatic.export.v1"},ym=Symbol("PurposeDerivedKey"),bm=Symbol("ChildKey"),B=Object.freeze({label:"",index:0})});function Gi(t){return t}class $t{publicKey;idnt;realm;rlm;idKDM;realmKDM;constructor(t,e,n,s,r,o){this.publicKey=t;this.idnt=e;this.realm=n;this.rlm=s;this.idKDM=r;this.realmKDM=o}static async init(t,e,n,s,r){try{let o=await Un(Gi(t)),i=o.publicKey;o.privateKey.fill(0);let c=Object.freeze({...s}),a=Object.freeze({...r}),d=new $t(i,t,e,n,c,a);return m(d)}catch{return t.fill(0),e.fill(0),n.fill(0),l(29)}}async sign(t){let e;try{e=await Un(Gi(this.idnt))}catch{return l(29)}try{return m(await $s(t,e.privateKey))}catch{return l(29)}finally{e.privateKey.fill(0)}}async bagKDM(t){let[e,n]=await lt({parent:this.idnt,purpose:A.BagKdm,kdm:t});if(n!==0)return l(n);try{return m(e.slice(0,vt))}finally{e.fill(0)}}async encrypt(t,e){let[n,s]=await this.#t(t.slice());if(s!==0)return l(s);try{return m(await Ce(e,n))}catch{return l(29)}finally{n.fill(0)}}async decrypt(t,e){let[n,s]=await this.#t(t.slice());if(s!==0)return l(s);try{return m(await ye(e,n))}catch{return l(20)}finally{n.fill(0)}}async#t(t){return lt({parent:this.realm,purpose:A.Cipher,kdm:t})}}function fi(t){for(let e of Object.getOwnPropertyNames(t)){if(wc.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}var wc;var dr=z(()=>{W();C();ct();Te();wc=new Set(["constructor","prototype","length","name"]);fi($t);fi($t.prototype)});async function Si(t,e){return lt({parent:t,purpose:A.RealmKey,kdm:e})}async function Ii(t,e){return lt({parent:t,purpose:A.RealmID,kdm:e})}async function Dn(t,e){return lt({parent:t,purpose:A.HostRLM,kdm:e})}var ur=z(()=>{ct()});function te(t){if(t.byteLength!==mr)return l(10);return m(t)}var yb,bb,gt=32,mr;var Ue=z(()=>{W();C();yb=Symbol("MasterSeed"),bb=Symbol("SealedMasterKey"),mr=24+gt+16});var rs;var Wr=z(()=>{W();C();rs={encode(t,e){let n=t.writeVarString(e.handle);if(n!==0)return n;let s=t.writeVarString(e.label);if(s!==0)return s;return t.writeVarInt(e.idx??0)},decode(t){let[e,n]=t.readVarString();if(n!==0)return l(n);let[s,r]=t.readVarString();if(r!==0)return l(r);let[o,i]=t.readVarInt();if(i!==0)return l(i);return m({handle:e,label:s,idx:o})}}});var xr;var Oi=z(()=>{W();C();Wr();Wr();xr={encode(t,e){let n=t.writeVarInt(e.hosts.length);if(n!==0)return n;for(let s of e.hosts){let r=t.writeStruct(rs,s);if(r!==0)return r}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);if(e===void 0||e<0)return l(10);let s=[];for(let r=0;r<e;r++){let[o,i]=t.readStruct(rs);if(i!==0)return l(i);if(o===void 0)return l(14);s.push(o)}return m({hosts:s})}}});function Hr(t){if(t.byteLength!==ve)return l(10);return m(t)}function Rr(t){if(t.byteLength<ia)return l(10);return m(t)}async function Ai(t,e,n,s){if(e.byteLength!==ve)return l(10);let r;try{r=await ri(t,e)}catch{return l(29)}try{if(r.byteLength!==ve||r.every((i)=>i===0))return l(10);let o=We(n,s);try{let[i,c]=await lt({parent:r,purpose:A.Pair,kdm:o});if(c!==0)return l(c);return m(i)}finally{o.fill(0)}}finally{r.fill(0)}}async function ji(t){let e;try{e=await tr()}catch{return l(29)}try{let[n,s]=await Ai(e.priv,t,t,e.pub);if(s!==0)return l(s);return m({key:n,pub:e.pub})}finally{e.priv.fill(0)}}function qi(t){for(let e of Object.getOwnPropertyNames(t)){if(la.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}class De{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await tr();t=e.priv;let[n,s]=Hr(e.pub);if(s!==0)return l(s);let r=new De(t,n);return t=void 0,m(r)}catch{return l(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}dhkeReq(){let t=this.#e.slice(),[e,n]=Hr(t);if(n!==0)return l(n);return m(e)}async finish(t){let e=t.subarray(0,ve),n=t.subarray(ve),[s,r]=await Ai(this.#t,e,this.#e,e);if(r!==0)return l(r);let o;try{try{o=await ye(n,s)}catch{return l(20)}let{fromSeedHosts:i}=await Promise.resolve().then(() => (Oe(),_i)),c=i(o);if(c[1]===0)this.wipe();return c}finally{s.fill(0),o?.fill(0)}}}var ve=32,ia,i0,l0,la;var Cr=z(()=>{ot();W();C();ct();Te();ia=ve+24+16,i0=Symbol("DHKEReq"),l0=Symbol("DHKEResp");la=new Set(["constructor","prototype","length","name"]);qi(De);qi(De.prototype)});function Lt(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}function el(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function wt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function ls(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function ie(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return l(9);return m(el(location.hostname))}function ua(){return Yr}function Rt(t){if(t instanceof Error){Yr=t.message===""?t.name:`${t.name}: ${t.message}`;return}Yr=String(t)}function cs(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function $i(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function Ae(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function as(t=2500){if($i())return Ae(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(r),document.removeEventListener("visibilitychange",s),Ae(),e()},s=()=>{if($i())n()},r=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function ds(t){await as();try{return await navigator.credentials.create(t)}catch(e){if(!cs(e))throw e;return Ae(),await navigator.credentials.create(t)}}async function us(t){await as();try{return await navigator.credentials.get(t)}catch(e){if(!cs(e))throw e;return Ae(),await navigator.credentials.get(t)}}function le(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function ce(t){if(t===null||t.type!==Ht||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return l(27);return m(t)}async function ms(t){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!=="function")return!0;let n=await e.call(PublicKeyCredential);if(t in n)return n[t]===!0;return!0}function kr(t){if(t==="platform"||t==="cross-platform")return t;return}function nl(t){if(/iPhone|iPad|iPod/i.test(t))return"ios";if(/Android/i.test(t))return"android";if(/Mac OS X|Macintosh/i.test(t))return"macos";if(/Windows/i.test(t))return"windows";if(/Linux/i.test(t))return"linux";return"other"}function Pr(t){let e=t.response;if(!("getTransports"in e))return;let n=e.getTransports;if(typeof n!=="function")return;let s=n.call(e);if(!Array.isArray(s))return;let r=[];for(let o of s)if(typeof o==="string"&&o.length>0)r.push(o);return r.length===0?void 0:r}function sl(t){let e=t.response;if(!("getAuthenticatorData"in e))return;let n=e.getAuthenticatorData;if(typeof n!=="function")return;let s=n.call(e);if(!(s instanceof ArrayBuffer))return;let r=new Uint8Array(s);if(r.byteLength<Tr+tl)return;let o=r[ma];if(o===void 0||(o&pa)===0)return;return r.slice(Tr,Tr+tl)}var oe=32,os="DIPLOMATIC",Ht="public-key",ca=-7,aa=-8,da=-257,is,Yr="",ma=32,pa=64,Tr=37,tl=16;var ae=z(()=>{W();C();is=[{type:Ht,alg:ca},{type:Ht,alg:aa},{type:Ht,alg:da}]});function ya(){return ms("extension:largeBlob")}async function rl(t){let e=le();if(e!==0)return l(e);let[n,s]=ie(t);if(s!==0)return l(s);if(n===void 0)return l(9);let r=t?.userName??t?.rpName??n,o={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)o.authenticatorAttachment=t.authenticatorAttachment;let i={largeBlob:{support:"required"}},c;try{c=await ds({publicKey:{challenge:Lt(oe),rp:{id:n,name:t?.rpName??os},user:{id:Lt(16),name:r,displayName:r},pubKeyCredParams:is,authenticatorSelection:o,extensions:i,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Rt(p),l(30)}let[a,d]=ce(c);if(d!==0)return l(d);if(a===void 0)return l(27);if(a.getClientExtensionResults().largeBlob?.supported!==!0)return l(30);return m(new Uint8Array(a.rawId))}async function Lr(t,e,n,s){let r={challenge:Lt(oe),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)r.hints=e.hints;if(n!==void 0)r.allowCredentials=[{type:Ht,id:wt(n)}];if(s!==void 0)r.extensions=s;let o;try{o=await us({publicKey:r})}catch(a){return Rt(a),l(30)}let[i,c]=ce(o);if(c!==0)return l(c);if(i===void 0)return l(27);return m(i)}async function ol(t,e){let n=le();if(n!==0)return l(n);let[s,r]=ie(e);if(r!==0)return l(r);if(s===void 0)return l(9);let o=t;if(o===void 0){let[p,y]=await Lr(s,e);if(y!==0&&e?.hints!==void 0)[p,y]=await Lr(s,{rpId:e.rpId,rpName:e.rpName});if(y!==0)return l(y);if(p===void 0)return l(27);o=new Uint8Array(p.rawId)}let[i,c]=await Lr(s,e,o,{largeBlob:{read:!0}});if(c!==0)return l(c);if(i===void 0)return l(27);let d=i.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return l(7);let u=ls(d.blob);if(u.byteLength===0)return l(7);return m({blob:u,credId:new Uint8Array(i.rawId)})}var ps=z(()=>{W();C();ae()});var ys="dmFyIHhhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgUGE9KGUpPT5lO2Z1bmN0aW9uIEVhKGUsdCl7dGhpc1tlXT1QYS5iaW5kKG51bGwsdCl9dmFyIEFhPShlLHQpPT57Zm9yKHZhciByIGluIHQpeGEoZSxyLHtnZXQ6dFtyXSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxzZXQ6RWEuYmluZCh0LHIpfSl9O3ZhciBfPShlLHQpPT4oKT0+KGUmJih0PWUoZT0wKSksdCk7dmFyIEJlPTY0LHo9MzIsVXM9MzIsT2U9OCxxZT0zMixScz0zMDAwMCxIcz01MTIsQTt2YXIgRD1fKCgpPT57KChJKT0+e0lbSS5TdWNjZXNzPTBdPSJTdWNjZXNzIjtJW0kuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7SVtJLkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7SVtJLlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7SVtJLlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO0lbSS5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO0lbSS5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50IjtJW0kuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO0lbSS5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO0lbSS5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0IjtJW0kuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO0lbSS5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjtJW0kuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7SVtJLk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO0lbSS5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjtJW0kuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjtJW0kuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO0lbSS5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO0lbSS5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO0lbSS5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjtJW0kuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7SVtJLk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO0lbSS5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO0lbSS5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO0lbSS5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7SVtJLkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7SVtJLkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIjtJW0kuQ3J5cHRvRXJyb3I9MjldPSJDcnlwdG9FcnJvciI7SVtJLldlYkF1dGhuRXJyb3I9MzBdPSJXZWJBdXRobkVycm9yIn0pKEF8fD17fSl9KTtmdW5jdGlvbiBmKGUpe3JldHVybltlLDBdfWZ1bmN0aW9uIGEoZSl7cmV0dXJuW3ZvaWQgMCxlXX12YXIgQz1fKCgpPT57RCgpfSk7ZnVuY3Rpb24ga2EoZSl7aWYoZTwwKWNvbnNvbGUuaW5mbygiTiIsZSksY29uc29sZS50cmFjZSgpO2lmKHR5cGVvZiBlIT09ImJpZ2ludCIpZT1CaWdJbnQoZSk7aWYoZTwwbilyZXR1cm4gYSgxMCk7bGV0IHQ9W107d2hpbGUoZT4wbil7bGV0IHI9TnVtYmVyKGUmMHg3Zm4pO2lmKGU+Pj03bixlPjBuKXQucHVzaChyfDEyOCk7ZWxzZSB0LnB1c2gocil9aWYodC5sZW5ndGg9PT0wKXJldHVybiBmKG5ldyBVaW50OEFycmF5KFswXSkpO2lmKHQubGVuZ3RoPjgpcmV0dXJuIGEoMjYpO3JldHVybiBmKG5ldyBVaW50OEFycmF5KHQpKX1mdW5jdGlvbiBEYShlLHQ9MCl7bGV0IHI9MG4sbj0wLHM9dDt3aGlsZSghMCl7aWYocz49ZS5sZW5ndGgpcmV0dXJuIGEoMTQpO2xldCBvPWVbcysrXTtpZihvPT09dm9pZCAwKXJldHVybiBhKDE0KTtpZihyfD1CaWdJbnQobyYxMjcpPDxCaWdJbnQobiksKG8mMTI4KT09PTApe2lmKHMtdD44KXJldHVybiBhKDI2KTtyZXR1cm4gZih7dmFsdWU6cj4weDFmZmZmZmZmZmZmZmZmbj9yOk51bWJlcihyKSxieXRlc1JlYWQ6cy10fSl9aWYobis9NyxuPj01NilyZXR1cm4gYSgyNil9fWNsYXNzIEx7ZGF0YTtwb3M9MDtjb25zdHJ1Y3RvcihlKXt0aGlzLmRhdGE9ZX1zdGF0aWMgYXN5bmMgZnJvbVJlc3BvbnNlKGUpe2xldCB0PWF3YWl0IGUuYXJyYXlCdWZmZXIoKSxyPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBuZXcgTChyKX1yZWFkQmlnSW50KCl7aWYodGhpcy5wb3MrOD50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBhKDcpO2xldCBlPW5ldyBEYXRhVmlldyh0aGlzLmRhdGEuYnVmZmVyLHRoaXMuZGF0YS5ieXRlT2Zmc2V0K3RoaXMucG9zKS5nZXRCaWdVaW50NjQoMCwhMSk7cmV0dXJuIHRoaXMucG9zKz04LGYoZSl9cmVhZERhdGUoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gYSh0KTtyZXR1cm4gZihuZXcgRGF0ZShlKSl9cmVhZFZhckludCgpe2xldFtlLHRdPURhKHRoaXMuZGF0YSx0aGlzLnBvcyk7aWYodCE9PTApcmV0dXJuIGEodCk7dGhpcy5wb3MrPWUuYnl0ZXNSZWFkO2xldCByPWUudmFsdWU7cmV0dXJuIGYodHlwZW9mIHI9PT0iYmlnaW50Ij9OdW1iZXIocik6cil9cmVhZFZhclN0cmluZygpe2xldFtlLHRdPXRoaXMucmVhZFZhckludCgpO2lmKHQhPT0wKXJldHVybiBhKHQpO2xldFtyLG5dPXRoaXMucmVhZEJ5dGVzKGUpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldCBzPW5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyKTtyZXR1cm4gZihzKX1yZWFkVmFyU3RyaW5ncygpe2xldFtlLHRdPXRoaXMucmVhZFZhckludCgpO2lmKHQhPT0wKXJldHVybiBhKHQpO2lmKGU8MHx8ZT50aGlzLnJlbWFpbmluZygpKXJldHVybiBhKDE0KTtsZXQgcj1bXTtmb3IobGV0IG49MDtuPGU7bisrKXtsZXRbcyxvXT10aGlzLnJlYWRWYXJTdHJpbmcoKTtpZihvIT09MClyZXR1cm4gYShvKTtyLnB1c2gocyl9cmV0dXJuIGYocil9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gYSgxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBhKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLGYodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGEodCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBhKG4pO3QucHVzaChyKX1yZXR1cm4gZih0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYShuKTt0LnB1c2gocil9cmV0dXJuIGYodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1yZW1haW5pbmcoKXtyZXR1cm4gdGhpcy5kYXRhLmxlbmd0aC10aGlzLnBvc31yZWFkUmVzdCgpe2xldCBlPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zPXRoaXMuZGF0YS5sZW5ndGgsZX1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgT3twYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09a2EoZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH13cml0ZVZhclN0cmluZ3MoZSl7bGV0IHQ9dGhpcy53cml0ZVZhckludChlLmxlbmd0aCk7aWYodCE9PTApcmV0dXJuIHQ7Zm9yKGxldCByIG9mIGUpe2xldCBuPXRoaXMud3JpdGVWYXJTdHJpbmcocik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9cHJlcGVuZEJ5dGVzKGUpe3RoaXMucGFydHMudW5zaGlmdChlLnNsaWNlKCkpfXdyaXRlQnl0ZXMoZSl7dGhpcy5wYXJ0cy5wdXNoKGUuc2xpY2UoKSl9d3JpdGVWYXJCeXRlcyhlKXtsZXQgdD10aGlzLndyaXRlVmFySW50KGUubGVuZ3RoKTtpZih0IT09MClyZXR1cm4gdDtyZXR1cm4gdGhpcy53cml0ZUJ5dGVzKGUpLDB9d3JpdGVTdHJ1Y3QoZSx0KXtyZXR1cm4gZS5lbmNvZGUodGhpcyx0KX13cml0ZVN0cnVjdHMoZSx0KXtmb3IobGV0IHIgb2YgdCl7bGV0IG49dGhpcy53cml0ZVN0cnVjdChlLHIpO2lmKG4hPT0wKXJldHVybiBufXJldHVybiAwfXdyaXRlQnl0ZXNTZXEoZSl7Zm9yKGxldCB0IG9mIGUpdGhpcy53cml0ZUJ5dGVzKHQpfXJlc3VsdCgpe2xldCBlPXRoaXMucGFydHMucmVkdWNlKChuLHMpPT5uK3MubGVuZ3RoLDApLHQ9bmV3IFVpbnQ4QXJyYXkoZSkscj0wO2ZvcihsZXQgbiBvZiB0aGlzLnBhcnRzKXQuc2V0KG4scikscis9bi5sZW5ndGg7cmV0dXJuIHR9d2lwZSgpe2ZvcihsZXQgZSBvZiB0aGlzLnBhcnRzKWUuZmlsbCgwKTt0aGlzLnBhcnRzLmxlbmd0aD0wfSpzY2FuKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpeWllbGQgZX19dmFyIHJlPV8oKCk9PntDKCk7RCgpfSk7ZnVuY3Rpb24gaXIoZSx0KXtpZihlLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspe2xldCBzPWVbbl0sbz10W25dO2lmKHM9PT12b2lkIDB8fG89PT12b2lkIDApcmV0dXJuITE7cnw9c15vfXJldHVybiByPT09MH1mdW5jdGlvbiBldChlKXtyZXR1cm4gQXJyYXkuZnJvbShlKS5tYXAoKHIpPT5yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWZ1bmN0aW9uIEtzKGUpe2lmKGUubGVuZ3RoJTIhPT0wKXRocm93IEVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtsZXQgdD1uZXcgVWludDhBcnJheShlLmxlbmd0aC8yKTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrPTIpdFtyLzJdPU51bWJlci5wYXJzZUludChlLnN1YnN0cihyLDIpLDE2KTtyZXR1cm4gdH1mdW5jdGlvbiBHKGUsdCl7cmV0dXJuIGlyKGUsdCl9ZnVuY3Rpb24gVnMoZSl7cmV0dXJuIEsoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89KyQvLCIiKX1mdW5jdGlvbiBMcyhlKXtsZXQgdD1lLmxlbmd0aCU0PT09MD8iIjoiPSIucmVwZWF0KDQtZS5sZW5ndGglNCkscj1lLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpK3Q7cmV0dXJuIEVlKHIpfWZ1bmN0aW9uIHB0KGUsdCl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO3JldHVybiByLnNldChlLDApLHIuc2V0KHQsZS5sZW5ndGgpLHJ9dmFyIEssRWU7dmFyIGNlPV8oKCk9PntpZih0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQ9PT0iZnVuY3Rpb24iKUs9KGUpPT5lLnRvQmFzZTY0KCk7ZWxzZSBLPShlKT0+YnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUpKTtpZih0eXBlb2YgVWludDhBcnJheS5mcm9tQmFzZTY0PT09ImZ1bmN0aW9uIilFZT0oZSk9PlVpbnQ4QXJyYXkuZnJvbUJhc2U2NChlKTtlbHNlIEVlPShlKT0+VWludDhBcnJheS5mcm9tKGF0b2IoZSksKHQpPT50LmNoYXJDb2RlQXQoMCkpfSk7ZnVuY3Rpb24gX2UoZSx0KXtyZXR1cm4gZS5sYWJlbD09PXQubGFiZWwmJmUuaW5kZXg9PT10LmluZGV4fXZhciBLdDt2YXIgdHQ9XygoKT0+e0QoKTtDKCk7S3Q9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJTdHJpbmcodC5sYWJlbCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LmluZGV4KTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhclN0cmluZygpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZFZhckludCgpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKHtsYWJlbDp0LGluZGV4Om59KX19fSk7dmFyIHJ0O3ZhciBfcz1fKCgpPT57cnQ9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMH0pO2Z1bmN0aW9uIGNyKGUpe2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihlKXx8ZTwwKXRocm93IEVycm9yKCJwb3NpdGl2ZSBpbnRlZ2VyIGV4cGVjdGVkLCBnb3QgIitlKX1mdW5jdGlvbiBubihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fEFycmF5QnVmZmVyLmlzVmlldyhlKSYmZS5jb25zdHJ1Y3Rvci5uYW1lPT09IlVpbnQ4QXJyYXkifWZ1bmN0aW9uIHVlKGUsLi4udCl7aWYoIW5uKGUpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGg+MCYmIXQuaW5jbHVkZXMoZS5sZW5ndGgpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIG9mIGxlbmd0aCAiK3QrIiwgZ290IGxlbmd0aD0iK2UubGVuZ3RoKX1mdW5jdGlvbiBzbihlLHQ9ITApe2lmKGUuZGVzdHJveWVkKXRocm93IEVycm9yKCJIYXNoIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCIpO2lmKHQmJmUuZmluaXNoZWQpdGhyb3cgRXJyb3IoIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKX1mdW5jdGlvbiBGcyhlLHQpe3VlKGUpO2xldCByPXQub3V0cHV0TGVuO2lmKGUubGVuZ3RoPHIpdGhyb3cgRXJyb3IoImRpZ2VzdEludG8oKSBleHBlY3RzIG91dHB1dCBidWZmZXIgb2YgbGVuZ3RoIGF0IGxlYXN0ICIrcil9ZnVuY3Rpb24gb24oZSl7aWYodHlwZW9mIGUhPT0iYm9vbGVhbiIpdGhyb3cgRXJyb3IoYGJvb2xlYW4gZXhwZWN0ZWQsIG5vdCAke2V9YCl9dmFyIEx0PSgpPT57fTtmdW5jdGlvbiB2YShlKXtpZih0eXBlb2YgZSE9PSJzdHJpbmciKXRocm93IEVycm9yKCJzdHJpbmcgZXhwZWN0ZWQiKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpKX1mdW5jdGlvbiB1cihlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKWU9dmEoZSk7ZWxzZSBpZihubihlKSllPWRyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQsIGdvdCAiK3R5cGVvZiBlKTtyZXR1cm4gZX1mdW5jdGlvbiBXcyhlLHQpe2lmKHQ9PW51bGx8fHR5cGVvZiB0IT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBkZWZpbmVkIik7cmV0dXJuIE9iamVjdC5hc3NpZ24oZSx0KX1mdW5jdGlvbiBqcyhlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylyfD1lW25dXnRbbl07cmV0dXJuIHI9PT0wfWZ1bmN0aW9uIGFuKGUsdCxyPSEwKXtpZih0PT09dm9pZCAwKXJldHVybiBuZXcgVWludDhBcnJheShlKTtpZih0Lmxlbmd0aCE9PWUpdGhyb3cgRXJyb3IoImludmFsaWQgb3V0cHV0IGxlbmd0aCwgZXhwZWN0ZWQgIitlKyIsIGdvdDogIit0Lmxlbmd0aCk7aWYociYmIU1hKHQpKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCwgbXVzdCBiZSBhbGlnbmVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gTWEoZSl7cmV0dXJuIGUuYnl0ZU9mZnNldCU0PT09MH1mdW5jdGlvbiBkcihlKXtyZXR1cm4gVWludDhBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIHZlKC4uLmUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmlsbCgwKX12YXIgSGU9KGUpPT5uZXcgVWludDMyQXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LE1hdGguZmxvb3IoZS5ieXRlTGVuZ3RoLzQpKSxCYSxYcz0oZSx0KT0+e2Z1bmN0aW9uIHIobiwuLi5zKXtpZih1ZShuKSxlLm5vbmNlTGVuZ3RoIT09dm9pZCAwKXtsZXQgbD1zWzBdO2lmKCFsKXRocm93IEVycm9yKCJub25jZSAvIGl2IHJlcXVpcmVkIik7aWYoZS52YXJTaXplTm9uY2UpdWUobCk7ZWxzZSB1ZShsLGUubm9uY2VMZW5ndGgpfWxldCBvPWUudGFnTGVuZ3RoO2lmKG8mJnNbMV0hPT12b2lkIDApdWUoc1sxXSk7bGV0IGk9dChuLC4uLnMpLGM9KGwscCk9PntpZihwIT09dm9pZCAwKXtpZihsIT09Mil0aHJvdyBFcnJvcigiY2lwaGVyIG91dHB1dCBub3Qgc3VwcG9ydGVkIik7dWUocCl9fSx1PSExO3JldHVybntlbmNyeXB0KGwscCl7aWYodSl0aHJvdyBFcnJvcigiY2Fubm90IGVuY3J5cHQoKSB0d2ljZSB3aXRoIHNhbWUga2V5ICsgbm9uY2UiKTtyZXR1cm4gdT0hMCx1ZShsKSxjKGkuZW5jcnlwdC5sZW5ndGgscCksaS5lbmNyeXB0KGwscCl9LGRlY3J5cHQobCxwKXtpZih1ZShsKSxvJiZsLmxlbmd0aDxvKXRocm93IEVycm9yKCJpbnZhbGlkIGNpcGhlcnRleHQgbGVuZ3RoOiBzbWFsbGVyIHRoYW4gdGFnTGVuZ3RoPSIrbyk7cmV0dXJuIGMoaS5kZWNyeXB0Lmxlbmd0aCxwKSxpLmRlY3J5cHQobCxwKX19fXJldHVybiBPYmplY3QuYXNzaWduKHIsZSkscn07dmFyIGxyPV8oKCk9PntMdCgpOy8qISBub2JsZS1jaXBoZXJzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjMgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovQmE9bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KFsyODc0NTQwMjBdKS5idWZmZXIpWzBdPT09Njg7aWYoIUJhKXRocm93IEVycm9yKCJOb24gbGl0dGxlLWVuZGlhbiBoYXJkd2FyZSBpcyBub3Qgc3VwcG9ydGVkIil9KTtmdW5jdGlvbiBPdChlPTMyKXtpZihydCYmdHlwZW9mIHJ0LmdldFJhbmRvbVZhbHVlcz09PSJmdW5jdGlvbiIpcmV0dXJuIHJ0LmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShlKSk7aWYocnQmJnR5cGVvZiBydC5yYW5kb21CeXRlcz09PSJmdW5jdGlvbiIpcmV0dXJuIHJ0LnJhbmRvbUJ5dGVzKGUpO3Rocm93IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIG11c3QgYmUgZGVmaW5lZCIpfXZhciBHcz1fKCgpPT57X3MoKX0pO2Z1bmN0aW9uIEIoZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1mdW5jdGlvbiBjbihlKXtyZXR1cm4gZS5ieXRlT2Zmc2V0JTQ9PT0wfWZ1bmN0aW9uIEthKGUsdCxyLG4scyxvLGksYyl7bGV0IHU9cy5sZW5ndGgsZD1uZXcgVWludDhBcnJheShmciksbD1IZShkKSxwPWNuKHMpJiZjbihvKSx5PXA/SGUocyk6UXMsbT1wP0hlKG8pOlFzO2ZvcihsZXQgaD0wO2g8dTtpKyspe2lmKGUodCxyLG4sbCxpLGMpLGk+PXpzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgZz1NYXRoLm1pbihmcix1LWgpO2lmKHAmJmc9PT1mcil7bGV0IFM9aC80O2lmKGglNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgYj0wLHg7YjxUYTtiKyspeD1TK2IsbVt4XT15W3hdXmxbYl07aCs9ZnI7Y29udGludWV9Zm9yKGxldCBTPTAsYjtTPGc7UysrKWI9aCtTLG9bYl09c1tiXV5kW1NdO2grPWd9fWZ1bmN0aW9uIFlzKGUsdCl7bGV0e2FsbG93U2hvcnRLZXlzOnIsZXh0ZW5kTm9uY2VGbjpuLGNvdW50ZXJMZW5ndGg6cyxjb3VudGVyUmlnaHQ6byxyb3VuZHM6aX09V3Moe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSx0KTtpZih0eXBlb2YgZSE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIGNyKHMpLGNyKGkpLG9uKG8pLG9uKHIpLChjLHUsZCxsLHA9MCk9Pnt1ZShjKSx1ZSh1KSx1ZShkKTtsZXQgeT1kLmxlbmd0aDtpZihsPT09dm9pZCAwKWw9bmV3IFVpbnQ4QXJyYXkoeSk7aWYodWUobCksY3IocCkscDwwfHxwPj16cyl0aHJvdyBFcnJvcigiYXJ4OiBjb3VudGVyIG92ZXJmbG93Iik7aWYobC5sZW5ndGg8eSl0aHJvdyBFcnJvcihgYXJ4OiBvdXRwdXQgKCR7bC5sZW5ndGh9KSBpcyBzaG9ydGVyIHRoYW4gZGF0YSAoJHt5fSlgKTtsZXQgbT1bXSxoPWMubGVuZ3RoLGcsUztpZihoPT09MzIpbS5wdXNoKGc9ZHIoYykpLFM9SGE7ZWxzZSBpZihoPT09MTYmJnIpZz1uZXcgVWludDhBcnJheSgzMiksZy5zZXQoYyksZy5zZXQoYywxNiksUz1SYSxtLnB1c2goZyk7ZWxzZSB0aHJvdyBFcnJvcihgYXJ4OiBpbnZhbGlkIDMyLWJ5dGUga2V5LCBnb3QgbGVuZ3RoPSR7aH1gKTtpZighY24odSkpbS5wdXNoKHU9ZHIodSkpO2xldCBiPUhlKGcpO2lmKG4pe2lmKHUubGVuZ3RoIT09MjQpdGhyb3cgRXJyb3IoImFyeDogZXh0ZW5kZWQgbm9uY2UgbXVzdCBiZSAyNCBieXRlcyIpO24oUyxiLEhlKHUuc3ViYXJyYXkoMCwxNikpLGIpLHU9dS5zdWJhcnJheSgxNil9bGV0IHg9MTYtcztpZih4IT09dS5sZW5ndGgpdGhyb3cgRXJyb3IoYGFyeDogbm9uY2UgbXVzdCBiZSAke3h9IG9yIDE2IGJ5dGVzYCk7aWYoeCE9PTEyKXtsZXQgUD1uZXcgVWludDhBcnJheSgxMik7UC5zZXQodSxvPzA6MTItdS5sZW5ndGgpLHU9UCxtLnB1c2godSl9bGV0IEU9SGUodSk7cmV0dXJuIEthKGUsUyxiLEUsZCxsLHAsaSksdmUoLi4ubSksbH19dmFyICRzPShlKT0+VWludDhBcnJheS5mcm9tKGUuc3BsaXQoIiIpLm1hcCgodCk9PnQuY2hhckNvZGVBdCgwKSkpLENhLFVhLFJhLEhhLGZyPTY0LFRhPTE2LHpzPTQyOTQ5NjcyOTUsUXM7dmFyIEpzPV8oKCk9PntMdCgpO2xyKCk7Q2E9JHMoImV4cGFuZCAxNi1ieXRlIGsiKSxVYT0kcygiZXhwYW5kIDMyLWJ5dGUgayIpLFJhPUhlKENhKSxIYT1IZShVYSk7UXM9bmV3IFVpbnQzMkFycmF5fSk7Y2xhc3MgWnN7Y29uc3RydWN0b3IoZSl7dGhpcy5ibG9ja0xlbj0xNix0aGlzLm91dHB1dExlbj0xNix0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5yPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5oPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5wYWQ9bmV3IFVpbnQxNkFycmF5KDgpLHRoaXMucG9zPTAsdGhpcy5maW5pc2hlZD0hMSxlPXVyKGUpLHVlKGUsMzIpO2xldCB0PWxlKGUsMCkscj1sZShlLDIpLG49bGUoZSw0KSxzPWxlKGUsNiksbz1sZShlLDgpLGk9bGUoZSwxMCksYz1sZShlLDEyKSx1PWxlKGUsMTQpO3RoaXMuclswXT10JjgxOTEsdGhpcy5yWzFdPSh0Pj4+MTN8cjw8MykmODE5MSx0aGlzLnJbMl09KHI+Pj4xMHxuPDw2KSY3OTM5LHRoaXMuclszXT0obj4+Pjd8czw8OSkmODE5MSx0aGlzLnJbNF09KHM+Pj40fG88PDEyKSYyNTUsdGhpcy5yWzVdPW8+Pj4xJjgxOTAsdGhpcy5yWzZdPShvPj4+MTR8aTw8MikmODE5MSx0aGlzLnJbN109KGk+Pj4xMXxjPDw1KSY4MDY1LHRoaXMucls4XT0oYz4+Pjh8dTw8OCkmODE5MSx0aGlzLnJbOV09dT4+PjUmMTI3O2ZvcihsZXQgZD0wO2Q8ODtkKyspdGhpcy5wYWRbZF09bGUoZSwxNisyKmQpfXByb2Nlc3MoZSx0LHI9ITEpe2xldCBuPXI/MDoyMDQ4LHtoOnMscjpvfT10aGlzLGk9b1swXSxjPW9bMV0sdT1vWzJdLGQ9b1szXSxsPW9bNF0scD1vWzVdLHk9b1s2XSxtPW9bN10saD1vWzhdLGc9b1s5XSxTPWxlKGUsdCswKSxiPWxlKGUsdCsyKSx4PWxlKGUsdCs0KSxFPWxlKGUsdCs2KSxQPWxlKGUsdCs4KSx3PWxlKGUsdCsxMCksaz1sZShlLHQrMTIpLHY9bGUoZSx0KzE0KSxVPXNbMF0rKFMmODE5MSksVD1zWzFdKygoUz4+PjEzfGI8PDMpJjgxOTEpLFI9c1syXSsoKGI+Pj4xMHx4PDw2KSY4MTkxKSxWPXNbM10rKCh4Pj4+N3xFPDw5KSY4MTkxKSxIPXNbNF0rKChFPj4+NHxQPDwxMikmODE5MSksST1zWzVdKyhQPj4+MSY4MTkxKSxGPXNbNl0rKChQPj4+MTR8dzw8MikmODE5MSksTj1zWzddKygodz4+PjExfGs8PDUpJjgxOTEpLGo9c1s4XSsoKGs+Pj44fHY8PDgpJjgxOTEpLFg9c1s5XSsodj4+PjV8biksTT0wLHRlPU0rVSppK1QqKDUqZykrUiooNSpoKStWKig1Km0pK0gqKDUqeSk7TT10ZT4+PjEzLHRlJj04MTkxLHRlKz1JKig1KnApK0YqKDUqbCkrTiooNSpkKStqKig1KnUpK1gqKDUqYyksTSs9dGU+Pj4xMyx0ZSY9ODE5MTtsZXQgbmU9TStVKmMrVCppK1IqKDUqZykrViooNSpoKStIKig1Km0pO009bmU+Pj4xMyxuZSY9ODE5MSxuZSs9SSooNSp5KStGKig1KnApK04qKDUqbCkraiooNSpkKStYKig1KnUpLE0rPW5lPj4+MTMsbmUmPTgxOTE7bGV0IGllPU0rVSp1K1QqYytSKmkrViooNSpnKStIKig1KmgpO009aWU+Pj4xMyxpZSY9ODE5MSxpZSs9SSooNSptKStGKig1KnkpK04qKDUqcCkraiooNSpsKStYKig1KmQpLE0rPWllPj4+MTMsaWUmPTgxOTE7bGV0IEo9TStVKmQrVCp1K1IqYytWKmkrSCooNSpnKTtNPUo+Pj4xMyxKJj04MTkxLEorPUkqKDUqaCkrRiooNSptKStOKig1KnkpK2oqKDUqcCkrWCooNSpsKSxNKz1KPj4+MTMsSiY9ODE5MTtsZXQgUmU9TStVKmwrVCpkK1IqdStWKmMrSCppO009UmU+Pj4xMyxSZSY9ODE5MSxSZSs9SSooNSpnKStGKig1KmgpK04qKDUqbSkraiooNSp5KStYKig1KnApLE0rPVJlPj4+MTMsUmUmPTgxOTE7bGV0IGF0PU0rVSpwK1QqbCtSKmQrVip1K0gqYztNPWF0Pj4+MTMsYXQmPTgxOTEsYXQrPUkqaStGKig1KmcpK04qKDUqaCkraiooNSptKStYKig1KnkpLE0rPWF0Pj4+MTMsYXQmPTgxOTE7bGV0IGN0PU0rVSp5K1QqcCtSKmwrVipkK0gqdTtNPWN0Pj4+MTMsY3QmPTgxOTEsY3QrPUkqYytGKmkrTiooNSpnKStqKig1KmgpK1gqKDUqbSksTSs9Y3Q+Pj4xMyxjdCY9ODE5MTtsZXQgdXQ9TStVKm0rVCp5K1IqcCtWKmwrSCpkO009dXQ+Pj4xMyx1dCY9ODE5MSx1dCs9SSp1K0YqYytOKmkraiooNSpnKStYKig1KmgpLE0rPXV0Pj4+MTMsdXQmPTgxOTE7bGV0IGR0PU0rVSpoK1QqbStSKnkrVipwK0gqbDtNPWR0Pj4+MTMsZHQmPTgxOTEsZHQrPUkqZCtGKnUrTipjK2oqaStYKig1KmcpLE0rPWR0Pj4+MTMsZHQmPTgxOTE7bGV0IGx0PU0rVSpnK1QqaCtSKm0rVip5K0gqcDtNPWx0Pj4+MTMsbHQmPTgxOTEsbHQrPUkqbCtGKmQrTip1K2oqYytYKmksTSs9bHQ+Pj4xMyxsdCY9ODE5MSxNPShNPDwyKStNfDAsTT1NK3RlfDAsdGU9TSY4MTkxLE09TT4+PjEzLG5lKz1NLHNbMF09dGUsc1sxXT1uZSxzWzJdPWllLHNbM109SixzWzRdPVJlLHNbNV09YXQsc1s2XT1jdCxzWzddPXV0LHNbOF09ZHQsc1s5XT1sdH1maW5hbGl6ZSgpe2xldHtoOmUscGFkOnR9PXRoaXMscj1uZXcgVWludDE2QXJyYXkoMTApLG49ZVsxXT4+PjEzO2VbMV0mPTgxOTE7Zm9yKGxldCBpPTI7aTwxMDtpKyspZVtpXSs9bixuPWVbaV0+Pj4xMyxlW2ldJj04MTkxO2VbMF0rPW4qNSxuPWVbMF0+Pj4xMyxlWzBdJj04MTkxLGVbMV0rPW4sbj1lWzFdPj4+MTMsZVsxXSY9ODE5MSxlWzJdKz1uLHJbMF09ZVswXSs1LG49clswXT4+PjEzLHJbMF0mPTgxOTE7Zm9yKGxldCBpPTE7aTwxMDtpKyspcltpXT1lW2ldK24sbj1yW2ldPj4+MTMscltpXSY9ODE5MTtyWzldLT04MTkyO2xldCBzPShuXjEpLTE7Zm9yKGxldCBpPTA7aTwxMDtpKyspcltpXSY9cztzPX5zO2ZvcihsZXQgaT0wO2k8MTA7aSsrKWVbaV09ZVtpXSZzfHJbaV07ZVswXT0oZVswXXxlWzFdPDwxMykmNjU1MzUsZVsxXT0oZVsxXT4+PjN8ZVsyXTw8MTApJjY1NTM1LGVbMl09KGVbMl0+Pj42fGVbM108PDcpJjY1NTM1LGVbM109KGVbM10+Pj45fGVbNF08PDQpJjY1NTM1LGVbNF09KGVbNF0+Pj4xMnxlWzVdPDwxfGVbNl08PDE0KSY2NTUzNSxlWzVdPShlWzZdPj4+MnxlWzddPDwxMSkmNjU1MzUsZVs2XT0oZVs3XT4+PjV8ZVs4XTw8OCkmNjU1MzUsZVs3XT0oZVs4XT4+Pjh8ZVs5XTw8NSkmNjU1MzU7bGV0IG89ZVswXSt0WzBdO2VbMF09byY2NTUzNTtmb3IobGV0IGk9MTtpPDg7aSsrKW89KGVbaV0rdFtpXXwwKSsobz4+PjE2KXwwLGVbaV09byY2NTUzNTt2ZShyKX11cGRhdGUoZSl7c24odGhpcyk7bGV0e2J1ZmZlcjp0LGJsb2NrTGVuOnJ9PXRoaXM7ZT11cihlKTtsZXQgbj1lLmxlbmd0aDtmb3IobGV0IHM9MDtzPG47KXtsZXQgbz1NYXRoLm1pbihyLXRoaXMucG9zLG4tcyk7aWYobz09PXIpe2Zvcig7cjw9bi1zO3MrPXIpdGhpcy5wcm9jZXNzKGUscyk7Y29udGludWV9aWYodC5zZXQoZS5zdWJhcnJheShzLHMrbyksdGhpcy5wb3MpLHRoaXMucG9zKz1vLHMrPW8sdGhpcy5wb3M9PT1yKXRoaXMucHJvY2Vzcyh0LDAsITEpLHRoaXMucG9zPTB9cmV0dXJuIHRoaXN9ZGVzdHJveSgpe3ZlKHRoaXMuaCx0aGlzLnIsdGhpcy5idWZmZXIsdGhpcy5wYWQpfWRpZ2VzdEludG8oZSl7c24odGhpcyksRnMoZSx0aGlzKSx0aGlzLmZpbmlzaGVkPSEwO2xldHtidWZmZXI6dCxoOnJ9PXRoaXMse3BvczpufT10aGlzO2lmKG4pe3RbbisrXT0xO2Zvcig7bjwxNjtuKyspdFtuXT0wO3RoaXMucHJvY2Vzcyh0LDAsITApfXRoaXMuZmluYWxpemUoKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288ODtvKyspZVtzKytdPXJbb10+Pj4wLGVbcysrXT1yW29dPj4+ODtyZXR1cm4gZX1kaWdlc3QoKXtsZXR7YnVmZmVyOmUsb3V0cHV0TGVuOnR9PXRoaXM7dGhpcy5kaWdlc3RJbnRvKGUpO2xldCByPWUuc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5kZXN0cm95KCkscn19ZnVuY3Rpb24gVmEoZSl7bGV0IHQ9KG4scyk9PmUocykudXBkYXRlKHVyKG4pKS5kaWdlc3QoKSxyPWUobmV3IFVpbnQ4QXJyYXkoMzIpKTtyZXR1cm4gdC5vdXRwdXRMZW49ci5vdXRwdXRMZW4sdC5ibG9ja0xlbj1yLmJsb2NrTGVuLHQuY3JlYXRlPShuKT0+ZShuKSx0fXZhciBsZT0oZSx0KT0+ZVt0KytdJjI1NXwoZVt0KytdJjI1NSk8PDgsdW47dmFyIGVvPV8oKCk9PntMdCgpO2xyKCk7dW49VmEoKGUpPT5uZXcgWnMoZSkpfSk7ZnVuY3Rpb24gTGEoZSx0LHIsbixzLG89MjApe2xldCBpPWVbMF0sYz10WzBdLHU9dFsxXSxkPXRbMl0sbD10WzNdLHA9ZVsxXSx5PXJbMF0sbT1yWzFdLGg9cyxnPTAsUz1lWzJdLGI9dFs0XSx4PXRbNV0sRT10WzZdLFA9dFs3XSx3PWVbM10saz1pLHY9YyxVPXUsVD1kLFI9bCxWPXAsSD15LEk9bSxGPWgsTj1nLGo9UyxYPWIsTT14LHRlPUUsbmU9UCxpZT13O2ZvcihsZXQgUmU9MDtSZTxvO1JlKz0yKVJePUIoaytNfDAsNyksRl49QihSK2t8MCw5KSxNXj1CKEYrUnwwLDEzKSxrXj1CKE0rRnwwLDE4KSxOXj1CKFYrdnwwLDcpLHRlXj1CKE4rVnwwLDkpLHZePUIodGUrTnwwLDEzKSxWXj1CKHYrdGV8MCwxOCksbmVePUIoaitIfDAsNyksVV49QihuZStqfDAsOSksSF49QihVK25lfDAsMTMpLGpePUIoSCtVfDAsMTgpLFRePUIoaWUrWHwwLDcpLElePUIoVCtpZXwwLDkpLFhePUIoSStUfDAsMTMpLGllXj1CKFgrSXwwLDE4KSx2Xj1CKGsrVHwwLDcpLFVePUIoditrfDAsOSksVF49QihVK3Z8MCwxMyksa149QihUK1V8MCwxOCksSF49QihWK1J8MCw3KSxJXj1CKEgrVnwwLDkpLFJePUIoSStIfDAsMTMpLFZePUIoUitJfDAsMTgpLFhePUIoaitOfDAsNyksRl49QihYK2p8MCw5KSxOXj1CKEYrWHwwLDEzKSxqXj1CKE4rRnwwLDE4KSxNXj1CKGllK25lfDAsNyksdGVePUIoTStpZXwwLDkpLG5lXj1CKHRlK018MCwxMyksaWVePUIobmUrdGV8MCwxOCk7bGV0IEo9MDtuW0orK109aStrfDAsbltKKytdPWMrdnwwLG5bSisrXT11K1V8MCxuW0orK109ZCtUfDAsbltKKytdPWwrUnwwLG5bSisrXT1wK1Z8MCxuW0orK109eStIfDAsbltKKytdPW0rSXwwLG5bSisrXT1oK0Z8MCxuW0orK109ZytOfDAsbltKKytdPVMranwwLG5bSisrXT1iK1h8MCxuW0orK109eCtNfDAsbltKKytdPUUrdGV8MCxuW0orK109UCtuZXwwLG5bSisrXT13K2llfDB9ZnVuY3Rpb24gT2EoZSx0LHIsbil7bGV0IHM9ZVswXSxvPXRbMF0saT10WzFdLGM9dFsyXSx1PXRbM10sZD1lWzFdLGw9clswXSxwPXJbMV0seT1yWzJdLG09clszXSxoPWVbMl0sZz10WzRdLFM9dFs1XSxiPXRbNl0seD10WzddLEU9ZVszXTtmb3IobGV0IHc9MDt3PDIwO3crPTIpdV49QihzK1N8MCw3KSx5Xj1CKHUrc3wwLDkpLFNePUIoeSt1fDAsMTMpLHNePUIoUyt5fDAsMTgpLG1ePUIoZCtvfDAsNyksYl49QihtK2R8MCw5KSxvXj1CKGIrbXwwLDEzKSxkXj1CKG8rYnwwLDE4KSx4Xj1CKGgrbHwwLDcpLGlePUIoeCtofDAsOSksbF49QihpK3h8MCwxMyksaF49QihsK2l8MCwxOCksY149QihFK2d8MCw3KSxwXj1CKGMrRXwwLDkpLGdePUIocCtjfDAsMTMpLEVePUIoZytwfDAsMTgpLG9ePUIocytjfDAsNyksaV49QihvK3N8MCw5KSxjXj1CKGkrb3wwLDEzKSxzXj1CKGMraXwwLDE4KSxsXj1CKGQrdXwwLDcpLHBePUIobCtkfDAsOSksdV49QihwK2x8MCwxMyksZF49Qih1K3B8MCwxOCksZ149QihoK218MCw3KSx5Xj1CKGcraHwwLDkpLG1ePUIoeStnfDAsMTMpLGhePUIobSt5fDAsMTgpLFNePUIoRSt4fDAsNyksYl49QihTK0V8MCw5KSx4Xj1CKGIrU3wwLDEzKSxFXj1CKHgrYnwwLDE4KTtsZXQgUD0wO25bUCsrXT1zLG5bUCsrXT1kLG5bUCsrXT1oLG5bUCsrXT1FLG5bUCsrXT1sLG5bUCsrXT1wLG5bUCsrXT15LG5bUCsrXT1tfXZhciBkbixsbjt2YXIgdG89XygoKT0+e0pzKCk7THQoKTtlbygpO2xyKCk7ZG49WXMoTGEse2NvdW50ZXJSaWdodDohMCxleHRlbmROb25jZUZuOk9hfSksbG49WHMoe2Jsb2NrU2l6ZTo2NCxub25jZUxlbmd0aDoyNCx0YWdMZW5ndGg6MTZ9LChlLHQpPT4oe2VuY3J5cHQocixuKXtuPWFuKHIubGVuZ3RoKzMyLG4sITEpO2xldCBzPW4uc3ViYXJyYXkoMCwzMiksbz1uLnN1YmFycmF5KDMyKTtuLnNldChyLDMyKSx2ZShzKSxkbihlLHQsbixuKTtsZXQgaT11bihvLHMpO3JldHVybiBuLnNldChpLDE2KSx2ZShuLnN1YmFycmF5KDAsMTYpLGkpLG4uc3ViYXJyYXkoMTYpfSxkZWNyeXB0KHIsbil7dWUociksbj1hbihyLmxlbmd0aCszMixuLCExKTtsZXQgcz1uLnN1YmFycmF5KDAsMzIpLG89bi5zdWJhcnJheSgzMiw0OCksaT1uLnN1YmFycmF5KDQ4KTtuLnNldChyLDMyKSx2ZShzKTtsZXQgYz1kbihlLHQscyxzKSx1PXVuKGksYyk7aWYoIWpzKG8sdSkpdGhyb3cgRXJyb3IoImludmFsaWQgdGFnIik7cmV0dXJuIGRuKGUsdCxuLnN1YmFycmF5KDE2KSxuLnN1YmFycmF5KDE2KSksdmUocyxvLHUpLGl9fSkpfSk7ZnVuY3Rpb24gcWEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBxdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gbnQoZSwuLi50KXtpZighcWEoZSkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aD4wJiYhdC5pbmNsdWRlcyhlLmxlbmd0aCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoICIrdCsiLCBnb3QgbGVuZ3RoPSIrZS5sZW5ndGgpfWZ1bmN0aW9uIE50KGUsdD0hMCl7aWYoZS5kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkIik7aWYodCYmZS5maW5pc2hlZCl0aHJvdyBFcnJvcigiSGFzaCNkaWdlc3QoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpfWZ1bmN0aW9uIHByKGUsdCl7bnQoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBybyhlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIG5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpfWZ1bmN0aW9uIG10KC4uLmUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmlsbCgwKX1mdW5jdGlvbiBfdChlLHQpe3JldHVybiBlPDwzMi10fGU+Pj50fWZ1bmN0aW9uIHNvKGUpe3JldHVybiBlPDwyNCY0Mjc4MTkwMDgwfGU8PDgmMTY3MTE2ODB8ZT4+PjgmNjUyODB8ZT4+PjI0JjI1NX1mdW5jdGlvbiBOYShlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdPXNvKGVbdF0pO3JldHVybiBlfWZ1bmN0aW9uIF9hKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIGh0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1fYShlKTtyZXR1cm4gbnQoZSksZX1jbGFzcyBmbnt9ZnVuY3Rpb24gaW8oZSl7bGV0IHQ9KG4scyk9PmUocykudXBkYXRlKGh0KG4pKS5kaWdlc3QoKSxyPWUoe30pO3JldHVybiB0Lm91dHB1dExlbj1yLm91dHB1dExlbix0LmJsb2NrTGVuPXIuYmxvY2tMZW4sdC5jcmVhdGU9KG4pPT5lKG4pLHR9dmFyIG5vLG9vLGhlO3ZhciB5cj1fKCgpPT57LyohIG5vYmxlLWhhc2hlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL25vPSgoKT0+bmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQzMkFycmF5KFsyODc0NTQwMjBdKS5idWZmZXIpWzBdPT09NjgpKCk7b289bm8/KGUpPT5lOihlKT0+c28oZSk7aGU9bm8/KGUpPT5lOk5hfSk7dmFyIGFvO3ZhciBjbz1fKCgpPT57YW89VWludDMyQXJyYXkuZnJvbShbMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdKX0pO2Z1bmN0aW9uIHBuKGUsdD0hMSl7aWYodClyZXR1cm57aDpOdW1iZXIoZSZtciksbDpOdW1iZXIoZT4+dW8mbXIpfTtyZXR1cm57aDpOdW1iZXIoZT4+dW8mbXIpfDAsbDpOdW1iZXIoZSZtcil8MH19dmFyIG1yLHVvO3ZhciBsbz1fKCgpPT57bXI9QmlnSW50KDQyOTQ5NjcyOTUpLHVvPUJpZ0ludCgzMil9KTtmdW5jdGlvbiBUZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj1fdChuXmUsMTYpLHI9citufDAsdD1fdCh0XnIsMTIpLHthOmUsYjp0LGM6cixkOm59fWZ1bmN0aW9uIEtlKGUsdCxyLG4scyl7cmV0dXJuIGU9ZSt0K3N8MCxuPV90KG5eZSw4KSxyPXIrbnwwLHQ9X3QodF5yLDcpLHthOmUsYjp0LGM6cixkOm59fXZhciBmbz1fKCgpPT57eXIoKX0pO2Z1bmN0aW9uIG1uKGUsdCxyLG4scyxvLGksYyx1LGQsbCxwLHksbSxoLGcsUyxiLHgsRSl7bGV0IFA9MDtmb3IobGV0IHc9MDt3PG47dysrKSh7YTpzLGI6dSxjOnksZDpTfT1UZShzLHUseSxTLHJbdCtlW1ArK11dKSkse2E6cyxiOnUsYzp5LGQ6U309S2Uocyx1LHksUyxyW3QrZVtQKytdXSkse2E6byxiOmQsYzptLGQ6Yn09VGUobyxkLG0sYixyW3QrZVtQKytdXSkse2E6byxiOmQsYzptLGQ6Yn09S2UobyxkLG0sYixyW3QrZVtQKytdXSkse2E6aSxiOmwsYzpoLGQ6eH09VGUoaSxsLGgseCxyW3QrZVtQKytdXSkse2E6aSxiOmwsYzpoLGQ6eH09S2UoaSxsLGgseCxyW3QrZVtQKytdXSkse2E6YyxiOnAsYzpnLGQ6RX09VGUoYyxwLGcsRSxyW3QrZVtQKytdXSkse2E6YyxiOnAsYzpnLGQ6RX09S2UoYyxwLGcsRSxyW3QrZVtQKytdXSkse2E6cyxiOmQsYzpoLGQ6RX09VGUocyxkLGgsRSxyW3QrZVtQKytdXSkse2E6cyxiOmQsYzpoLGQ6RX09S2UocyxkLGgsRSxyW3QrZVtQKytdXSkse2E6byxiOmwsYzpnLGQ6U309VGUobyxsLGcsUyxyW3QrZVtQKytdXSkse2E6byxiOmwsYzpnLGQ6U309S2UobyxsLGcsUyxyW3QrZVtQKytdXSkse2E6aSxiOnAsYzp5LGQ6Yn09VGUoaSxwLHksYixyW3QrZVtQKytdXSkse2E6aSxiOnAsYzp5LGQ6Yn09S2UoaSxwLHksYixyW3QrZVtQKytdXSkse2E6YyxiOnUsYzptLGQ6eH09VGUoYyx1LG0seCxyW3QrZVtQKytdXSkse2E6YyxiOnUsYzptLGQ6eH09S2UoYyx1LG0seCxyW3QrZVtQKytdXSk7cmV0dXJue3YwOnMsdjE6byx2MjppLHYzOmMsdjQ6dSx2NTpkLHY2Omwsdjc6cCx2ODp5LHY5Om0sdjEwOmgsdjExOmcsdjEyOlMsdjEzOmIsdjE0OngsdjE1OkV9fXZhciB5bjt2YXIgcG89XygoKT0+e2ZvKCk7eXIoKTt5bj1jbGFzcyB5biBleHRlbmRzIGZue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKTt0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMubGVuZ3RoPTAsdGhpcy5wb3M9MCxxdChlKSxxdCh0KSx0aGlzLmJsb2NrTGVuPWUsdGhpcy5vdXRwdXRMZW49dCx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheShlKSx0aGlzLmJ1ZmZlcjMyPXl0KHRoaXMuYnVmZmVyKX11cGRhdGUoZSl7TnQodGhpcyksZT1odChlKSxudChlKTtsZXR7YmxvY2tMZW46dCxidWZmZXI6cixidWZmZXIzMjpufT10aGlzLHM9ZS5sZW5ndGgsbz1lLmJ5dGVPZmZzZXQsaT1lLmJ1ZmZlcjtmb3IobGV0IGM9MDtjPHM7KXtpZih0aGlzLnBvcz09PXQpaGUobiksdGhpcy5jb21wcmVzcyhuLDAsITEpLGhlKG4pLHRoaXMucG9zPTA7bGV0IHU9TWF0aC5taW4odC10aGlzLnBvcyxzLWMpLGQ9bytjO2lmKHU9PT10JiYhKGQlNCkmJmMrdTxzKXtsZXQgbD1uZXcgVWludDMyQXJyYXkoaSxkLE1hdGguZmxvb3IoKHMtYykvNCkpO2hlKGwpO2ZvcihsZXQgcD0wO2MrdDxzO3ArPW4ubGVuZ3RoLGMrPXQpdGhpcy5sZW5ndGgrPXQsdGhpcy5jb21wcmVzcyhsLHAsITEpO2hlKGwpO2NvbnRpbnVlfXIuc2V0KGUuc3ViYXJyYXkoYyxjK3UpLHRoaXMucG9zKSx0aGlzLnBvcys9dSx0aGlzLmxlbmd0aCs9dSxjKz11fXJldHVybiB0aGlzfWRpZ2VzdEludG8oZSl7TnQodGhpcykscHIoZSx0aGlzKTtsZXR7cG9zOnQsYnVmZmVyMzI6cn09dGhpczt0aGlzLmZpbmlzaGVkPSEwLG10KHRoaXMuYnVmZmVyLnN1YmFycmF5KHQpKSxoZShyKSx0aGlzLmNvbXByZXNzKHIsMCwhMCksaGUocik7bGV0IG49eXQoZSk7dGhpcy5nZXQoKS5mb3JFYWNoKChzLG8pPT5uW29dPW9vKHMpKX1kaWdlc3QoKXtsZXR7YnVmZmVyOmUsb3V0cHV0TGVuOnR9PXRoaXM7dGhpcy5kaWdlc3RJbnRvKGUpO2xldCByPWUuc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5kZXN0cm95KCkscn1fY2xvbmVJbnRvKGUpe2xldHtidWZmZXI6dCxsZW5ndGg6cixmaW5pc2hlZDpuLGRlc3Ryb3llZDpzLG91dHB1dExlbjpvLHBvczppfT10aGlzO3JldHVybiBlfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGtMZW46b30pKSxlLnNldCguLi50aGlzLmdldCgpKSxlLmJ1ZmZlci5zZXQodCksZS5kZXN0cm95ZWQ9cyxlLmZpbmlzaGVkPW4sZS5sZW5ndGg9cixlLnBvcz1pLGUub3V0cHV0TGVuPW8sZX1jbG9uZSgpe3JldHVybiB0aGlzLl9jbG9uZUludG8oKX19fSk7dmFyIE1lLFZlLHlvLGhuLGduO3ZhciBtbz1fKCgpPT57Y28oKTtsbygpO3BvKCk7eXIoKTtNZT17Q0hVTktfU1RBUlQ6MSxDSFVOS19FTkQ6MixQQVJFTlQ6NCxST09UOjgsS0VZRURfSEFTSDoxNixERVJJVkVfS0VZX0NPTlRFWFQ6MzIsREVSSVZFX0tFWV9NQVRFUklBTDo2NH0sVmU9YW8uc2xpY2UoKSx5bz0oKCk9PntsZXQgZT1BcnJheS5mcm9tKHtsZW5ndGg6MTZ9LChuLHMpPT5zKSx0PShuKT0+WzIsNiwzLDEwLDcsMCw0LDEzLDEsMTEsMTIsNSw5LDE0LDE1LDhdLm1hcCgocyk9Pm5bc10pLHI9W107Zm9yKGxldCBuPTAscz1lO248NztuKysscz10KHMpKXIucHVzaCguLi5zKTtyZXR1cm4gVWludDhBcnJheS5mcm9tKHIpfSkoKTtobj1jbGFzcyBobiBleHRlbmRzIHlue2NvbnN0cnVjdG9yKGU9e30sdD0wKXtzdXBlcig2NCxlLmRrTGVuPT09dm9pZCAwPzMyOmUuZGtMZW4pO3RoaXMuY2h1bmtQb3M9MCx0aGlzLmNodW5rc0RvbmU9MCx0aGlzLmZsYWdzPTAsdGhpcy5zdGFjaz1bXSx0aGlzLnBvc091dD0wLHRoaXMuYnVmZmVyT3V0MzI9bmV3IFVpbnQzMkFycmF5KDE2KSx0aGlzLmNodW5rT3V0PTAsdGhpcy5lbmFibGVYT0Y9ITA7bGV0e2tleTpyLGNvbnRleHQ6bn09ZSxzPW4hPT12b2lkIDA7aWYociE9PXZvaWQgMCl7aWYocyl0aHJvdyBFcnJvcignT25seSAia2V5IiBvciAiY29udGV4dCIgY2FuIGJlIHNwZWNpZmllZCBhdCBzYW1lIHRpbWUnKTtsZXQgbz1odChyKS5zbGljZSgpO250KG8sMzIpLHRoaXMuSVY9eXQobyksaGUodGhpcy5JViksdGhpcy5mbGFncz10fE1lLktFWUVEX0hBU0h9ZWxzZSBpZihzKXtsZXQgbz1odChuKSxpPW5ldyBobih7ZGtMZW46MzJ9LE1lLkRFUklWRV9LRVlfQ09OVEVYVCkudXBkYXRlKG8pLmRpZ2VzdCgpO3RoaXMuSVY9eXQoaSksaGUodGhpcy5JViksdGhpcy5mbGFncz10fE1lLkRFUklWRV9LRVlfTUFURVJJQUx9ZWxzZSB0aGlzLklWPVZlLnNsaWNlKCksdGhpcy5mbGFncz10O3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpLHRoaXMuYnVmZmVyT3V0PXJvKHRoaXMuYnVmZmVyT3V0MzIpfWdldCgpe3JldHVybltdfXNldCgpe31iMkNvbXByZXNzKGUsdCxyLG49MCl7bGV0e3N0YXRlOnMscG9zOm99PXRoaXMse2g6aSxsOmN9PXBuKEJpZ0ludChlKSwhMCkse3YwOnUsdjE6ZCx2MjpsLHYzOnAsdjQ6eSx2NTptLHY2Omgsdjc6Zyx2ODpTLHY5OmIsdjEwOngsdjExOkUsdjEyOlAsdjEzOncsdjE0OmssdjE1OnZ9PW1uKHlvLG4sciw3LHNbMF0sc1sxXSxzWzJdLHNbM10sc1s0XSxzWzVdLHNbNl0sc1s3XSxWZVswXSxWZVsxXSxWZVsyXSxWZVszXSxpLGMsbyx0KTtzWzBdPXVeUyxzWzFdPWReYixzWzJdPWxeeCxzWzNdPXBeRSxzWzRdPXleUCxzWzVdPW1edyxzWzZdPWheayxzWzddPWdedn1jb21wcmVzcyhlLHQ9MCxyPSExKXtsZXQgbj10aGlzLmZsYWdzO2lmKCF0aGlzLmNodW5rUG9zKW58PU1lLkNIVU5LX1NUQVJUO2lmKHRoaXMuY2h1bmtQb3M9PT0xNXx8cilufD1NZS5DSFVOS19FTkQ7aWYoIXIpdGhpcy5wb3M9dGhpcy5ibG9ja0xlbjtpZih0aGlzLmIyQ29tcHJlc3ModGhpcy5jaHVua3NEb25lLG4sZSx0KSx0aGlzLmNodW5rUG9zKz0xLHRoaXMuY2h1bmtQb3M9PT0xNnx8cil7bGV0IHM9dGhpcy5zdGF0ZTt0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKTtmb3IobGV0IG8saT10aGlzLmNodW5rc0RvbmUrMTtyfHwhKGkmMSk7aT4+PTEpe2lmKCEobz10aGlzLnN0YWNrLnBvcCgpKSlicmVhazt0aGlzLmJ1ZmZlcjMyLnNldChvLDApLHRoaXMuYnVmZmVyMzIuc2V0KHMsOCksdGhpcy5wb3M9dGhpcy5ibG9ja0xlbix0aGlzLmIyQ29tcHJlc3MoMCx0aGlzLmZsYWdzfE1lLlBBUkVOVCx0aGlzLmJ1ZmZlcjMyLDApLHM9dGhpcy5zdGF0ZSx0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKX10aGlzLmNodW5rc0RvbmUrKyx0aGlzLmNodW5rUG9zPTAsdGhpcy5zdGFjay5wdXNoKHMpfXRoaXMucG9zPTB9X2Nsb25lSW50byhlKXtlPXN1cGVyLl9jbG9uZUludG8oZSk7bGV0e0lWOnQsZmxhZ3M6cixzdGF0ZTpuLGNodW5rUG9zOnMscG9zT3V0Om8sY2h1bmtPdXQ6aSxzdGFjazpjLGNodW5rc0RvbmU6dX09dGhpcztyZXR1cm4gZS5zdGF0ZS5zZXQobi5zbGljZSgpKSxlLnN0YWNrPWMubWFwKChkKT0+VWludDMyQXJyYXkuZnJvbShkKSksZS5JVi5zZXQodCksZS5mbGFncz1yLGUuY2h1bmtQb3M9cyxlLmNodW5rc0RvbmU9dSxlLnBvc091dD1vLGUuY2h1bmtPdXQ9aSxlLmVuYWJsZVhPRj10aGlzLmVuYWJsZVhPRixlLmJ1ZmZlck91dDMyLnNldCh0aGlzLmJ1ZmZlck91dDMyKSxlfWRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMCxtdCh0aGlzLnN0YXRlLHRoaXMuYnVmZmVyMzIsdGhpcy5JVix0aGlzLmJ1ZmZlck91dDMyKSxtdCguLi50aGlzLnN0YWNrKX1iMkNvbXByZXNzT3V0KCl7bGV0e3N0YXRlOmUscG9zOnQsZmxhZ3M6cixidWZmZXIzMjpuLGJ1ZmZlck91dDMyOnN9PXRoaXMse2g6byxsOml9PXBuKEJpZ0ludCh0aGlzLmNodW5rT3V0KyspKTtoZShuKTtsZXR7djA6Yyx2MTp1LHYyOmQsdjM6bCx2NDpwLHY1OnksdjY6bSx2NzpoLHY4Omcsdjk6Uyx2MTA6Yix2MTE6eCx2MTI6RSx2MTM6UCx2MTQ6dyx2MTU6a309bW4oeW8sMCxuLDcsZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLFZlWzBdLFZlWzFdLFZlWzJdLFZlWzNdLGksbyx0LHIpO3NbMF09Y15nLHNbMV09dV5TLHNbMl09ZF5iLHNbM109bF54LHNbNF09cF5FLHNbNV09eV5QLHNbNl09bV53LHNbN109aF5rLHNbOF09ZVswXV5nLHNbOV09ZVsxXV5TLHNbMTBdPWVbMl1eYixzWzExXT1lWzNdXngsc1sxMl09ZVs0XV5FLHNbMTNdPWVbNV1eUCxzWzE0XT1lWzZdXncsc1sxNV09ZVs3XV5rLGhlKG4pLGhlKHMpLHRoaXMucG9zT3V0PTB9ZmluaXNoKCl7aWYodGhpcy5maW5pc2hlZClyZXR1cm47dGhpcy5maW5pc2hlZD0hMCxtdCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcykpO2xldCBlPXRoaXMuZmxhZ3N8TWUuUk9PVDtpZih0aGlzLnN0YWNrLmxlbmd0aCllfD1NZS5QQVJFTlQsaGUodGhpcy5idWZmZXIzMiksdGhpcy5jb21wcmVzcyh0aGlzLmJ1ZmZlcjMyLDAsITApLGhlKHRoaXMuYnVmZmVyMzIpLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMucG9zPXRoaXMuYmxvY2tMZW47ZWxzZSBlfD0oIXRoaXMuY2h1bmtQb3M/TWUuQ0hVTktfU1RBUlQ6MCl8TWUuQ0hVTktfRU5EO3RoaXMuZmxhZ3M9ZSx0aGlzLmIyQ29tcHJlc3NPdXQoKX13cml0ZUludG8oZSl7TnQodGhpcywhMSksbnQoZSksdGhpcy5maW5pc2goKTtsZXR7YmxvY2tMZW46dCxidWZmZXJPdXQ6cn09dGhpcztmb3IobGV0IG49MCxzPWUubGVuZ3RoO248czspe2lmKHRoaXMucG9zT3V0Pj10KXRoaXMuYjJDb21wcmVzc091dCgpO2xldCBvPU1hdGgubWluKHQtdGhpcy5wb3NPdXQscy1uKTtlLnNldChyLnN1YmFycmF5KHRoaXMucG9zT3V0LHRoaXMucG9zT3V0K28pLG4pLHRoaXMucG9zT3V0Kz1vLG4rPW99cmV0dXJuIGV9eG9mSW50byhlKXtpZighdGhpcy5lbmFibGVYT0YpdGhyb3cgRXJyb3IoIlhPRiBpcyBub3QgcG9zc2libGUgYWZ0ZXIgZGlnZXN0IGNhbGwiKTtyZXR1cm4gdGhpcy53cml0ZUludG8oZSl9eG9mKGUpe3JldHVybiBxdChlKSx0aGlzLnhvZkludG8obmV3IFVpbnQ4QXJyYXkoZSkpfWRpZ2VzdEludG8oZSl7aWYocHIoZSx0aGlzKSx0aGlzLmZpbmlzaGVkKXRocm93IEVycm9yKCJkaWdlc3QoKSB3YXMgYWxyZWFkeSBjYWxsZWQiKTtyZXR1cm4gdGhpcy5lbmFibGVYT0Y9ITEsdGhpcy53cml0ZUludG8oZSksdGhpcy5kZXN0cm95KCksZX1kaWdlc3QoKXtyZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSl9fTtnbj1pbygoZSk9Pm5ldyBobihlKSl9KTtmdW5jdGlvbiBobyhlKXtpZihlLmJ5dGVMZW5ndGghPT1GYSlyZXR1cm4gYSgxMCk7cmV0dXJuIGYoZSl9ZnVuY3Rpb24gU28oZSl7bGV0IHQ9MG47Zm9yKGxldCByPWUubGVuZ3RoLTE7cj49MDtyLS0pdD10PDw4bnxCaWdJbnQoZVtyXSk7cmV0dXJuIHR9ZnVuY3Rpb24gamEoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoMzIpLHI9KGUlUStRKSVRO2ZvcihsZXQgbj0wO248MzI7bisrKXRbbl09TnVtYmVyKHImMHhmZm4pLHI+Pj04bjtyZXR1cm4gdH1mdW5jdGlvbiBYYShlKXtsZXQgdD1lLnNsaWNlKCk7cmV0dXJuIHRbMzFdJj0xMjcsU28odCl9ZnVuY3Rpb24gR2EoZSl7bGV0IHQ9ZS5zbGljZSgpO3JldHVybiB0WzBdJj0yNDgsdFszMV0mPTEyNyx0WzMxXXw9NjQsdH1mdW5jdGlvbiBocihlLHQscil7bGV0IG49LWUscz0odF5yKSZuO3JldHVyblt0XnMscl5zXX1mdW5jdGlvbiBRYShlKXtsZXQgdD1RLTJuLHI9KGUlUStRKSVRLG49MW47d2hpbGUodD4wbil7aWYodCYxbiluPW4qciVRO3I9cipyJVEsdD4+PTFufXJldHVybiBufWZ1bmN0aW9uIFNuKGUsdCl7bGV0IHI9R2EoZSksbj1YYSh0KSxzPTFuLG89MG4saT1uLGM9MW4sdT0wbixkPVNvKHIpO2ZvcihsZXQgbD0yNTQ7bD49MDtsLS0pe2xldCBwPWQ+PkJpZ0ludChsKSYxbjt1Xj1wLFtzLGldPWhyKHUscyxpKSxbbyxjXT1ocih1LG8sYyksdT1wO2xldCB5PShzK28pJVEsbT15KnklUSxoPShzLW8rUSklUSxnPWgqaCVRLFM9KG0tZytRKSVRLGI9KGkrYyklUSxFPShpLWMrUSklUSp5JVEsUD1iKmglUSx3PShFK1ApJVEsaz0oRS1QK1EpJVE7aT13KnclUSxjPW4qayprJVEscz1tKmclUSxvPVMqKG0rV2EqUyklUX1yZXR1cm5bcyxpXT1ocih1LHMsaSksW28sY109aHIodSxvLGMpLHIuZmlsbCgwKSxqYShzKlFhKG8pJVEpfWZ1bmN0aW9uIGJvKGUpe3JldHVybiBTbihlLGdvKX12YXIgRmE9MzIsYWwsUSxXYT0xMjE2NjVuLGdvO3ZhciBJbz1fKCgpPT57RCgpO0MoKTthbD1TeW1ib2woIlgyNTUxOVNrIik7UT0oMW48PDI1NW4pLTE5bixnbz1uZXcgVWludDhBcnJheSgzMik7Z29bMF09OX0pO2Z1bmN0aW9uIHdvKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGJuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KGJuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLGJuLmxlbmd0aCksdH1mdW5jdGlvbiB4byhlKXtsZXQgdD1uZXcgVWludDhBcnJheShJbi5sZW5ndGgrMzIpO3JldHVybiB0LnNldChJbiksdC5zZXQoZS5zdWJhcnJheSgwLDMyKSxJbi5sZW5ndGgpLHR9ZnVuY3Rpb24gUG8oZSl7cmV0dXJuIHR5cGVvZiBlPT09InN0cmluZyI/bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpOmV9ZnVuY3Rpb24gTGUoZSl7bGV0IHQ9bmV3IEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHQpLnNldChlKSx0fWFzeW5jIGZ1bmN0aW9uICRhKGUpe3JldHVybiBPdChlKX1hc3luYyBmdW5jdGlvbiB3bigpe3JldHVybiBPdCgzMil9YXN5bmMgZnVuY3Rpb24gZ3QoZSx0KXtsZXQgcj1PdCgyNCkscz1sbih0LHIpLmVuY3J5cHQoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFsuLi5yLC4uLnNdKX1hc3luYyBmdW5jdGlvbiBzdChlLHQpe2xldCByPWUuc2xpY2UoMCwyNCksbj1lLnNsaWNlKDI0KTtyZXR1cm4gbG4odCxyKS5kZWNyeXB0KG4pfWFzeW5jIGZ1bmN0aW9uIGdyKGUpe2xldCB0PWUscj13byh0KSxuPUxlKHIpLHM7dHJ5e2xldCBkPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITAsWyJzaWduIl0pO3M9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIixkKX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfWlmKHR5cGVvZiBzLnghPT0ic3RyaW5nIil0aHJvdyBFcnJvcigiRWQyNTUxOSBKV0sgbWlzc2luZyB4Iik7bGV0IG89cy54O3MuZD12b2lkIDA7bGV0IGk9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgiandrIix7a3R5OiJPS1AiLGNydjoiRWQyNTUxOSIseDpvfSx7bmFtZToiRWQyNTUxOSJ9LCEwLFsidmVyaWZ5Il0pLGM9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgicmF3IixpKSksdT1uZXcgVWludDhBcnJheSg2NCk7cmV0dXJuIHUuc2V0KHQsMCksdS5zZXQoYywzMikse2tleVR5cGU6ImVkMjU1MTkiLHByaXZhdGVLZXk6dSxwdWJsaWNLZXk6Y319YXN5bmMgZnVuY3Rpb24gemEoZSl7bGV0IHQ9ZS5zdWJhcnJheSgwLDMyKSxyPXdvKHQpLG49TGUocik7dHJ5e3JldHVybiBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJwa2NzOCIsbix7bmFtZToiRWQyNTUxOSJ9LCExLFsic2lnbiJdKX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfX1hc3luYyBmdW5jdGlvbiBZYShlKXtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixMZShlKSx7bmFtZToiRWQyNTUxOSJ9LCExLFsidmVyaWZ5Il0pfWFzeW5jIGZ1bmN0aW9uIHhuKGUsdCl7bGV0IHI9UG8oZSksbj1hd2FpdCB6YSh0KSxzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5zaWduKHtuYW1lOiJFZDI1NTE5In0sbixMZShyKSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHMpfWFzeW5jIGZ1bmN0aW9uIEphKGUsdCxyKXtsZXQgbj1Qbyh0KTt0cnl7cmV0dXJuIGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS52ZXJpZnkoe25hbWU6IkVkMjU1MTkifSxyLExlKGUpLExlKG4pKX1jYXRjaHtyZXR1cm4hMX19YXN5bmMgZnVuY3Rpb24gRnQoZSx0KXtpZih0PT09dm9pZCAwKXJldHVybiBnbihlKTtyZXR1cm4gZ24oZSx0KX1hc3luYyBmdW5jdGlvbiBQbigpe2xldCBlPWF3YWl0IE90KDMyKTtlWzBdJj0yNDgsZVszMV0mPTEyNyxlWzMxXXw9NjQ7bGV0W3Qscl09aG8oZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgZS5maWxsKDApLEVycm9yKCJYMjU1MTkgc2NhbGFyIGJyYW5kIGZhaWxlZCIpO2xldCBuPWJvKHQpLHM9eG8odCksbz1MZShzKTt0cnl7bGV0IGk9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG8se25hbWU6IlgyNTUxOSJ9LCEwLFsiZGVyaXZlQml0cyJdKSxjPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsaSk7aWYodHlwZW9mIGMueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJYMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCB1PUxzKGMueCk7aWYoYy5kPXZvaWQgMCwhRyh1LG4pKXRocm93IEVycm9yKCJYMjU1MTkgV2ViQ3J5cHRvIHB1YiAhPSBSRkMgNzc0OCIpO3JldHVybntwcml2OnQscHViOm59fWNhdGNoKGkpe3Rocm93IHQuZmlsbCgwKSxpfWZpbmFsbHl7cy5maWxsKDApLG5ldyBVaW50OEFycmF5KG8pLmZpbGwoMCl9fWFzeW5jIGZ1bmN0aW9uIEVvKGUsdCl7bGV0IHI9eG8oZSksbj1MZShyKTt0cnl7bGV0IHM9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLG4se25hbWU6IlgyNTUxOSJ9LCExLFsiZGVyaXZlQml0cyJdKSxvPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsTGUodCkse25hbWU6IlgyNTUxOSJ9LCExLFtdKSxpPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKHtuYW1lOiJYMjU1MTkiLHB1YmxpYzpvfSxzLDI1Nik7cmV0dXJuIG5ldyBVaW50OEFycmF5KGkpfWNhdGNoe3JldHVybiBTbihlLHQpfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9fWZ1bmN0aW9uIFphKGUpe3JldHVybiBPYmplY3QuZnJlZXplKGUpLGV9dmFyIGJuLEluLEFvO3ZhciBTdD1fKCgpPT57R3MoKTt0bygpO21vKCk7Y2UoKTtEKCk7SW8oKTtibj1uZXcgVWludDhBcnJheShbNDgsNDYsMiwxLDAsNDgsNSw2LDMsNDMsMTAxLDExMiw0LDM0LDQsMzJdKTtJbj1uZXcgVWludDhBcnJheShbNDgsNDYsMiwxLDAsNDgsNSw2LDMsNDMsMTAxLDExMCw0LDM0LDQsMzJdKTtBbz1aYSh7Z2VuUmFuZG9tQnl0ZXM6JGEsZ2VuMjU2Qml0U2VjdXJlUmFuZG9tU2VlZDp3bixlbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkOmd0LGRlY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQ6c3QsZGVyaXZlRWQyNTUxOUtleVBhaXI6Z3Isc2lnbkVkMjU1MTk6eG4saW1wb3J0VmVyaWZ5S2V5OllhLGNoZWNrU2lnRWQyNTUxOTpKYSxibGFrZTM6RnR9KX0pO2Z1bmN0aW9uIGVjKGUsdCl7cmV0dXJuIGV9ZnVuY3Rpb24ga28oZSl7cmV0dXJuIGV9ZnVuY3Rpb24gRmUoZSx0KXtpZihlLmJ5dGVMZW5ndGghPT16KXJldHVybiBhKDEwKTtyZXR1cm4gZihrbyhlKSl9ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIEZlKGUsWS5Ib3N0UkxNKX1mdW5jdGlvbiB0YyhlKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gZihlKTtsZXQgdD1uZXcgTyxyPUt0LmVuY29kZSh0LGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO3JldHVybiBmKHQucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIERvKGUsdCl7dHJ5e3JldHVybiBmKGF3YWl0IEZ0KGUsdCkpfWNhdGNoe3JldHVybiBhKDI5KX19YXN5bmMgZnVuY3Rpb24gcmMoe3BhcmVudDplLHB1cnBvc2U6dH0pe2xldFtyLG5dPWF3YWl0IERvKGUse2NvbnRleHQ6dH0pO2lmKG4hPT0wKXJldHVybiBhKG4pO3JldHVybiBmKGVjKHIsdCkpfWFzeW5jIGZ1bmN0aW9uIG5jKHtwZGs6ZSxrZG06dH0pe2xldFtyLG5dPXRjKHQpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldFtzLG9dPWF3YWl0IERvKHIse2tleTplfSk7aWYobyE9PTApcmV0dXJuIGEobyk7cmV0dXJuIGYoa28ocykpfWFzeW5jIGZ1bmN0aW9uIG9lKHtwYXJlbnQ6ZSxwdXJwb3NlOnQsa2RtOnJ9KXtsZXRbbixzXT1hd2FpdCByYyh7cGFyZW50OmUscHVycG9zZTp0fSk7aWYocyE9PTApcmV0dXJuIGEocyk7dHJ5e3JldHVybiBhd2FpdCBuYyh7cGRrOm4sa2RtOnJ9KX1maW5hbGx5e24uZmlsbCgwKX19dmFyIFksd2wseGwscTt2YXIgZmU9XygoKT0+e3JlKCk7dHQoKTtEKCk7QygpO1N0KCk7WT17SWRlbnRpdHk6ImRpcGxvbWF0aWMuaWRlbnRpdHkudjEiLENpcGhlcjoiZGlwbG9tYXRpYy5jaXBoZXIudjEiLEJpbmQ6ImRpcGxvbWF0aWMuYmluZC52MSIsQmluZFRhZzoiZGlwbG9tYXRpYy5iaW5kdGFnLnYxIixGaW5nZXJwcmludDoiZGlwbG9tYXRpYy5maW5nZXJwcmludC52MSIsUGFpcjoiZGlwbG9tYXRpYy5xcnBhaXIudjEiLEJhZ0tkbToiZGlwbG9tYXRpYy5iYWdrZG0udjEiLFJlYWxtS2V5OiJkaXBsb21hdGljLnJlYWxtS2V5LnYxIixSZWFsbUlEOiJkaXBsb21hdGljLnJlYWxtSUQudjEiLEhvc3RSTE06ImRpcGxvbWF0aWMuaG9zdFJMTS52MSIsRXhwb3J0OiJkaXBsb21hdGljLmV4cG9ydC52MSJ9LHdsPVN5bWJvbCgiUHVycG9zZURlcml2ZWRLZXkiKSx4bD1TeW1ib2woIkNoaWxkS2V5IikscT1PYmplY3QuZnJlZXplKHtsYWJlbDoiIixpbmRleDowfSl9KTtmdW5jdGlvbiBGbyhlKXtyZXR1cm4gZX1jbGFzcyBYZXtwdWJsaWNLZXk7aWRudDtyZWFsbTtybG07aWRLRE07cmVhbG1LRE07Y29uc3RydWN0b3IoZSx0LHIsbixzLG8pe3RoaXMucHVibGljS2V5PWU7dGhpcy5pZG50PXQ7dGhpcy5yZWFsbT1yO3RoaXMucmxtPW47dGhpcy5pZEtETT1zO3RoaXMucmVhbG1LRE09b31zdGF0aWMgYXN5bmMgaW5pdChlLHQscixuLHMpe3RyeXtsZXQgbz1hd2FpdCBncihGbyhlKSksaT1vLnB1YmxpY0tleTtvLnByaXZhdGVLZXkuZmlsbCgwKTtsZXQgYz1PYmplY3QuZnJlZXplKHsuLi5ufSksdT1PYmplY3QuZnJlZXplKHsuLi5zfSksZD1uZXcgWGUoaSxlLHQscixjLHUpO3JldHVybiBmKGQpfWNhdGNoe3JldHVybiBlLmZpbGwoMCksdC5maWxsKDApLHIuZmlsbCgwKSxhKDI5KX19YXN5bmMgc2lnbihlKXtsZXQgdDt0cnl7dD1hd2FpdCBncihGbyh0aGlzLmlkbnQpKX1jYXRjaHtyZXR1cm4gYSgyOSl9dHJ5e3JldHVybiBmKGF3YWl0IHhuKGUsdC5wcml2YXRlS2V5KSl9Y2F0Y2h7cmV0dXJuIGEoMjkpfWZpbmFsbHl7dC5wcml2YXRlS2V5LmZpbGwoMCl9fWFzeW5jIGJhZ0tETShlKXtsZXRbdCxyXT1hd2FpdCBvZSh7cGFyZW50OnRoaXMuaWRudCxwdXJwb3NlOlkuQmFnS2RtLGtkbTplfSk7aWYociE9PTApcmV0dXJuIGEocik7dHJ5e3JldHVybiBmKHQuc2xpY2UoMCxPZSkpfWZpbmFsbHl7dC5maWxsKDApfX1hc3luYyBlbmNyeXB0KGUsdCl7bGV0W3Isbl09YXdhaXQgdGhpcy4jZShlLnNsaWNlKCkpO2lmKG4hPT0wKXJldHVybiBhKG4pO3RyeXtyZXR1cm4gZihhd2FpdCBndCh0LHIpKX1jYXRjaHtyZXR1cm4gYSgyOSl9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jIGRlY3J5cHQoZSx0KXtsZXRbcixuXT1hd2FpdCB0aGlzLiNlKGUuc2xpY2UoKSk7aWYobiE9PTApcmV0dXJuIGEobik7dHJ5e3JldHVybiBmKGF3YWl0IHN0KHQscikpfWNhdGNoe3JldHVybiBhKDIwKX1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjZShlKXtyZXR1cm4gb2Uoe3BhcmVudDp0aGlzLnJlYWxtLHB1cnBvc2U6WS5DaXBoZXIsa2RtOmV9KX19ZnVuY3Rpb24gV28oZSl7Zm9yKGxldCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKXtpZihjYy5oYXModCkpY29udGludWU7bGV0IHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHI9PT12b2lkIDB8fHR5cGVvZiByLnZhbHVlIT09ImZ1bmN0aW9uIiljb250aW51ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLnZhbHVlLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMX0pfX12YXIgY2M7dmFyIFVuPV8oKCk9PntEKCk7QygpO2ZlKCk7U3QoKTtjYz1uZXcgU2V0KFsiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJsZW5ndGgiLCJuYW1lIl0pO1dvKFhlKTtXbyhYZS5wcm90b3R5cGUpfSk7YXN5bmMgZnVuY3Rpb24gam8oZSx0KXtyZXR1cm4gb2Uoe3BhcmVudDplLHB1cnBvc2U6WS5SZWFsbUtleSxrZG06dH0pfWFzeW5jIGZ1bmN0aW9uIFhvKGUsdCl7cmV0dXJuIG9lKHtwYXJlbnQ6ZSxwdXJwb3NlOlkuUmVhbG1JRCxrZG06dH0pfWFzeW5jIGZ1bmN0aW9uIEVyKGUsdCl7cmV0dXJuIG9lKHtwYXJlbnQ6ZSxwdXJwb3NlOlkuSG9zdFJMTSxrZG06dH0pfXZhciBSbj1fKCgpPT57ZmUoKX0pO2Z1bmN0aW9uIG90KGUpe2lmKGUuYnl0ZUxlbmd0aCE9PVlvKXJldHVybiBhKDEwKTtyZXR1cm4gZihlKX12YXIgeHksUHksQWU9MzIsWW87dmFyICR0PV8oKCk9PntEKCk7QygpO3h5PVN5bWJvbCgiTWFzdGVyU2VlZCIpLFB5PVN5bWJvbCgiU2VhbGVkTWFzdGVyS2V5IiksWW89MjQrQWUrMTZ9KTt2YXIgS3I7dmFyICRuPV8oKCk9PntEKCk7QygpO0tyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQuaGFuZGxlKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyU3RyaW5nKHQubGFiZWwpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiBlLndyaXRlVmFySW50KHQuaWR4Pz8wKX0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhclN0cmluZygpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZFZhclN0cmluZygpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldFtvLGldPWUucmVhZFZhckludCgpO2lmKGkhPT0wKXJldHVybiBhKGkpO3JldHVybiBmKHtoYW5kbGU6dCxsYWJlbDpuLGlkeDpvfSl9fX0pO3ZhciB6bjt2YXIgeGk9XygoKT0+e0QoKTtDKCk7JG4oKTskbigpO3puPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFySW50KHQuaG9zdHMubGVuZ3RoKTtpZihyIT09MClyZXR1cm4gcjtmb3IobGV0IG4gb2YgdC5ob3N0cyl7bGV0IHM9ZS53cml0ZVN0cnVjdChLcixuKTtpZihzIT09MClyZXR1cm4gc31yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBhKHIpO2lmKHQ9PT12b2lkIDB8fHQ8MClyZXR1cm4gYSgxMCk7bGV0IG49W107Zm9yKGxldCBzPTA7czx0O3MrKyl7bGV0W28saV09ZS5yZWFkU3RydWN0KEtyKTtpZihpIT09MClyZXR1cm4gYShpKTtpZihvPT09dm9pZCAwKXJldHVybiBhKDE0KTtuLnB1c2gobyl9cmV0dXJuIGYoe2hvc3RzOm59KX19fSk7ZnVuY3Rpb24gUGkoZSl7aWYoZS5ieXRlTGVuZ3RoIT09QnQpcmV0dXJuIGEoMTApO3JldHVybiBmKGUpfWZ1bmN0aW9uIEVpKGUpe2lmKGUuYnl0ZUxlbmd0aDxDYylyZXR1cm4gYSgxMCk7cmV0dXJuIGYoZSl9YXN5bmMgZnVuY3Rpb24gQWkoZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoIT09QnQpcmV0dXJuIGEoMTApO2xldCBzO3RyeXtzPWF3YWl0IEVvKGUsdCl9Y2F0Y2h7cmV0dXJuIGEoMjkpfXRyeXtpZihzLmJ5dGVMZW5ndGghPT1CdHx8cy5ldmVyeSgoaSk9Pmk9PT0wKSlyZXR1cm4gYSgxMCk7bGV0IG89cHQocixuKTt0cnl7bGV0W2ksY109YXdhaXQgb2Uoe3BhcmVudDpzLHB1cnBvc2U6WS5QYWlyLGtkbTpvfSk7aWYoYyE9PTApcmV0dXJuIGEoYyk7cmV0dXJuIGYoaSl9ZmluYWxseXtvLmZpbGwoMCl9fWZpbmFsbHl7cy5maWxsKDApfX1hc3luYyBmdW5jdGlvbiBraShlKXtsZXQgdDt0cnl7dD1hd2FpdCBQbigpfWNhdGNoe3JldHVybiBhKDI5KX10cnl7bGV0W3Isbl09YXdhaXQgQWkodC5wcml2LGUsZSx0LnB1Yik7aWYobiE9PTApcmV0dXJuIGEobik7cmV0dXJuIGYoe2tleTpyLHB1Yjp0LnB1Yn0pfWZpbmFsbHl7dC5wcml2LmZpbGwoMCl9fWZ1bmN0aW9uIERpKGUpe2ZvcihsZXQgdCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSl7aWYoVWMuaGFzKHQpKWNvbnRpbnVlO2xldCByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZihyPT09dm9pZCAwfHx0eXBlb2Ygci52YWx1ZSE9PSJmdW5jdGlvbiIpY29udGludWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6ci52YWx1ZSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITF9KX19Y2xhc3MgdnR7I2U7I3Q7Y29uc3RydWN0b3IoZSx0KXt0aGlzLiNlPWUsdGhpcy4jdD10fXN0YXRpYyBhc3luYyBjcmVhdGUoKXtsZXQgZTt0cnl7bGV0IHQ9YXdhaXQgUG4oKTtlPXQucHJpdjtsZXRbcixuXT1QaSh0LnB1Yik7aWYobiE9PTApcmV0dXJuIGEobik7bGV0IHM9bmV3IHZ0KGUscik7cmV0dXJuIGU9dm9pZCAwLGYocyl9Y2F0Y2h7cmV0dXJuIGEoMjkpfWZpbmFsbHl7ZT8uZmlsbCgwKX19d2lwZSgpe3RoaXMuI2UuZmlsbCgwKX1kaGtlUmVxKCl7bGV0IGU9dGhpcy4jdC5zbGljZSgpLFt0LHJdPVBpKGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO3JldHVybiBmKHQpfWFzeW5jIGZpbmlzaChlKXtsZXQgdD1lLnN1YmFycmF5KDAsQnQpLHI9ZS5zdWJhcnJheShCdCksW24sc109YXdhaXQgQWkodGhpcy4jZSx0LHRoaXMuI3QsdCk7aWYocyE9PTApcmV0dXJuIGEocyk7bGV0IG87dHJ5e3RyeXtvPWF3YWl0IHN0KHIsbil9Y2F0Y2h7cmV0dXJuIGEoMjApfWxldHtmcm9tU2VlZEhvc3RzOml9PWF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gKHRyKCksdmkpKSxjPWkobyk7aWYoY1sxXT09PTApdGhpcy53aXBlKCk7cmV0dXJuIGN9ZmluYWxseXtuLmZpbGwoMCksbz8uZmlsbCgwKX19fXZhciBCdD0zMixDYyxtZyxoZyxVYzt2YXIgQmk9XygoKT0+e2NlKCk7RCgpO0MoKTtmZSgpO1N0KCk7Q2M9QnQrMjQrMTYsbWc9U3ltYm9sKCJESEtFUmVxIiksaGc9U3ltYm9sKCJESEtFUmVzcCIpO1VjPW5ldyBTZXQoWyJjb25zdHJ1Y3RvciIsInByb3RvdHlwZSIsImxlbmd0aCIsIm5hbWUiXSk7RGkodnQpO0RpKHZ0LnByb3RvdHlwZSl9KTtmdW5jdGlvbiBDZShlKXtsZXQgdD1uZXcgVWludDhBcnJheShlKTtpZihlPjApY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh0KTtyZXR1cm4gdH1mdW5jdGlvbiBLYyhlKXtyZXR1cm4gZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLiQvLCIiKXx8ImxvY2FsaG9zdCJ9ZnVuY3Rpb24gVWUoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gdC5zZXQoZSksdC5idWZmZXJ9ZnVuY3Rpb24gT3IoZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXJldHVybiBuZXcgVWludDhBcnJheShlKS5zbGljZSgpO3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zbGljZSgpfWZ1bmN0aW9uIFFlKGUpe2lmKGU/LnJwSWQhPT12b2lkIDApcmV0dXJuIGYoZS5ycElkKTtpZih0eXBlb2YgbG9jYXRpb24+InUiKXJldHVybiBhKDkpO3JldHVybiBmKEtjKGxvY2F0aW9uLmhvc3RuYW1lKSl9ZnVuY3Rpb24gRGUoZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXtNaT1lLm1lc3NhZ2U9PT0iIj9lLm5hbWU6YCR7ZS5uYW1lfTogJHtlLm1lc3NhZ2V9YDtyZXR1cm59TWk9U3RyaW5nKGUpfWZ1bmN0aW9uIHFyKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEVycm9yKSlyZXR1cm4hMTtyZXR1cm4gZS5uYW1lPT09Ik5vdEFsbG93ZWRFcnJvciImJmUubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJkb2VzIG5vdCBoYXZlIGZvY3VzIil9ZnVuY3Rpb24gQ2koKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiEwO3JldHVybiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUhPT0iaGlkZGVuIn1mdW5jdGlvbiBNdCgpe2lmKHR5cGVvZiBnbG9iYWxUaGlzLmZvY3VzIT09ImZ1bmN0aW9uIilyZXR1cm47dHJ5e2dsb2JhbFRoaXMuZm9jdXMoKX1jYXRjaHt9fWZ1bmN0aW9uIE5yKGU9MjUwMCl7aWYoQ2koKSlyZXR1cm4gTXQoKSxQcm9taXNlLnJlc29sdmUoKTtyZXR1cm4gbmV3IFByb21pc2UoKHQpPT57bGV0IHI9KCk9PntjbGVhclRpbWVvdXQocyksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsbiksTXQoKSx0KCl9LG49KCk9PntpZihDaSgpKXIoKX0scz1zZXRUaW1lb3V0KHIsZSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsbiksbigpfSl9YXN5bmMgZnVuY3Rpb24gX3IoZSl7YXdhaXQgTnIoKTt0cnl7cmV0dXJuIGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoZSl9Y2F0Y2godCl7aWYoIXFyKHQpKXRocm93IHQ7cmV0dXJuIE10KCksYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmNyZWF0ZShlKX19YXN5bmMgZnVuY3Rpb24gRnIoZSl7YXdhaXQgTnIoKTt0cnl7cmV0dXJuIGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoZSl9Y2F0Y2godCl7aWYoIXFyKHQpKXRocm93IHQ7cmV0dXJuIE10KCksYXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChlKX19ZnVuY3Rpb24gJGUoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8IW5hdmlnYXRvci5jcmVkZW50aWFsc3x8dHlwZW9mIFB1YmxpY0tleUNyZWRlbnRpYWw+InUiKXJldHVybiAyNDtyZXR1cm4gMH1mdW5jdGlvbiB6ZShlKXtpZihlPT09bnVsbHx8ZS50eXBlIT09a2V8fCEoInJhd0lkImluIGUpfHx0eXBlb2YgZS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzIT09ImZ1bmN0aW9uIilyZXR1cm4gYSgyNyk7cmV0dXJuIGYoZSl9ZnVuY3Rpb24gSm4oZSl7aWYoZT09PSJwbGF0Zm9ybSJ8fGU9PT0iY3Jvc3MtcGxhdGZvcm0iKXJldHVybiBlO3JldHVybn1mdW5jdGlvbiBSaShlKXtpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QoZSkpcmV0dXJuImlvcyI7aWYoL0FuZHJvaWQvaS50ZXN0KGUpKXJldHVybiJhbmRyb2lkIjtpZigvTWFjIE9TIFh8TWFjaW50b3NoL2kudGVzdChlKSlyZXR1cm4ibWFjb3MiO2lmKC9XaW5kb3dzL2kudGVzdChlKSlyZXR1cm4id2luZG93cyI7aWYoL0xpbnV4L2kudGVzdChlKSlyZXR1cm4ibGludXgiO3JldHVybiJvdGhlciJ9ZnVuY3Rpb24gWm4oZSl7bGV0IHQ9ZS5yZXNwb25zZTtpZighKCJnZXRUcmFuc3BvcnRzImluIHQpKXJldHVybjtsZXQgcj10LmdldFRyYW5zcG9ydHM7aWYodHlwZW9mIHIhPT0iZnVuY3Rpb24iKXJldHVybjtsZXQgbj1yLmNhbGwodCk7aWYoIUFycmF5LmlzQXJyYXkobikpcmV0dXJuO2xldCBzPVtdO2ZvcihsZXQgbyBvZiBuKWlmKHR5cGVvZiBvPT09InN0cmluZyImJm8ubGVuZ3RoPjApcy5wdXNoKG8pO3JldHVybiBzLmxlbmd0aD09PTA/dm9pZCAwOnN9ZnVuY3Rpb24gSGkoZSl7bGV0IHQ9ZS5yZXNwb25zZTtpZighKCJnZXRBdXRoZW50aWNhdG9yRGF0YSJpbiB0KSlyZXR1cm47bGV0IHI9dC5nZXRBdXRoZW50aWNhdG9yRGF0YTtpZih0eXBlb2YgciE9PSJmdW5jdGlvbiIpcmV0dXJuO2xldCBuPXIuY2FsbCh0KTtpZighKG4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuO2xldCBzPW5ldyBVaW50OEFycmF5KG4pO2lmKHMuYnl0ZUxlbmd0aDxZbitVaSlyZXR1cm47bGV0IG89c1tWY107aWYobz09PXZvaWQgMHx8KG8mTGMpPT09MClyZXR1cm47cmV0dXJuIHMuc2xpY2UoWW4sWW4rVWkpfXZhciBHZT0zMixWcj0iRElQTE9NQVRJQyIsa2U9InB1YmxpYy1rZXkiLFJjPS03LEhjPS04LFRjPS0yNTcsTHIsTWk9IiIsVmM9MzIsTGM9NjQsWW49MzcsVWk9MTY7dmFyIEN0PV8oKCk9PntEKCk7QygpO0xyPVt7dHlwZTprZSxhbGc6UmN9LHt0eXBlOmtlLGFsZzpIY30se3R5cGU6a2UsYWxnOlRjfV19KTthc3luYyBmdW5jdGlvbiBUaShlKXtsZXQgdD0kZSgpO2lmKHQhPT0wKXJldHVybiBhKHQpO2xldFtyLG5dPVFlKGUpO2lmKG4hPT0wKXJldHVybiBhKG4pO2lmKHI9PT12b2lkIDApcmV0dXJuIGEoOSk7bGV0IHM9ZT8udXNlck5hbWU/P2U/LnJwTmFtZT8/cixvPXtyZXNpZGVudEtleToicmVxdWlyZWQiLHJlcXVpcmVSZXNpZGVudEtleTohMCx1c2VyVmVyaWZpY2F0aW9uOiJyZXF1aXJlZCJ9O2lmKGU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50IT09dm9pZCAwKW8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9ZS5hdXRoZW50aWNhdG9yQXR0YWNobWVudDtsZXQgaT17bGFyZ2VCbG9iOntzdXBwb3J0OiJyZXF1aXJlZCJ9fSxjO3RyeXtjPWF3YWl0IF9yKHtwdWJsaWNLZXk6e2NoYWxsZW5nZTpDZShHZSkscnA6e2lkOnIsbmFtZTplPy5ycE5hbWU/P1ZyfSx1c2VyOntpZDpDZSgxNiksbmFtZTpzLGRpc3BsYXlOYW1lOnN9LHB1YktleUNyZWRQYXJhbXM6THIsYXV0aGVudGljYXRvclNlbGVjdGlvbjpvLGV4dGVuc2lvbnM6aSwuLi5lPy5oaW50cyE9PXZvaWQgMD97aGludHM6ZS5oaW50c306e319fSl9Y2F0Y2gocCl7cmV0dXJuIERlKHApLGEoMzApfWxldFt1LGRdPXplKGMpO2lmKGQhPT0wKXJldHVybiBhKGQpO2lmKHU9PT12b2lkIDApcmV0dXJuIGEoMjcpO2lmKHUuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8uc3VwcG9ydGVkIT09ITApcmV0dXJuIGEoMzApO3JldHVybiBmKG5ldyBVaW50OEFycmF5KHUucmF3SWQpKX1hc3luYyBmdW5jdGlvbiBlcyhlLHQscixuKXtsZXQgcz17Y2hhbGxlbmdlOkNlKEdlKSxycElkOmUsdXNlclZlcmlmaWNhdGlvbjoicHJlZmVycmVkIn07aWYodD8uaGludHMhPT12b2lkIDApcy5oaW50cz10LmhpbnRzO2lmKHIhPT12b2lkIDApcy5hbGxvd0NyZWRlbnRpYWxzPVt7dHlwZTprZSxpZDpVZShyKX1dO2lmKG4hPT12b2lkIDApcy5leHRlbnNpb25zPW47bGV0IG87dHJ5e289YXdhaXQgRnIoe3B1YmxpY0tleTpzfSl9Y2F0Y2godSl7cmV0dXJuIERlKHUpLGEoMzApfWxldFtpLGNdPXplKG8pO2lmKGMhPT0wKXJldHVybiBhKGMpO2lmKGk9PT12b2lkIDApcmV0dXJuIGEoMjcpO3JldHVybiBmKGkpfWFzeW5jIGZ1bmN0aW9uIEtpKGUsdCl7bGV0IHI9JGUoKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXRbbixzXT1RZSh0KTtpZihzIT09MClyZXR1cm4gYShzKTtpZihuPT09dm9pZCAwKXJldHVybiBhKDkpO2xldCBvPWU7aWYobz09PXZvaWQgMCl7bGV0W3AseV09YXdhaXQgZXMobix0KTtpZih5IT09MCYmdD8uaGludHMhPT12b2lkIDApW3AseV09YXdhaXQgZXMobix7cnBJZDp0LnJwSWQscnBOYW1lOnQucnBOYW1lfSk7aWYoeSE9PTApcmV0dXJuIGEoeSk7aWYocD09PXZvaWQgMClyZXR1cm4gYSgyNyk7bz1uZXcgVWludDhBcnJheShwLnJhd0lkKX1sZXRbaSxjXT1hd2FpdCBlcyhuLHQsbyx7bGFyZ2VCbG9iOntyZWFkOiEwfX0pO2lmKGMhPT0wKXJldHVybiBhKGMpO2lmKGk9PT12b2lkIDApcmV0dXJuIGEoMjcpO2xldCBkPWkuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYjtpZihkPT09dm9pZCAwfHxkLmJsb2I9PT12b2lkIDApcmV0dXJuIGEoNyk7bGV0IGw9T3IoZC5ibG9iKTtpZihsLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBhKDcpO3JldHVybiBmKHtibG9iOmwsY3JlZElkOm5ldyBVaW50OEFycmF5KGkucmF3SWQpfSl9dmFyIHRzPV8oKCk9PntEKCk7QygpO0N0KCl9KTt2YXIgV3I9IiI7ZnVuY3Rpb24gcWMoKXtpZih0eXBlb2YgV3IhPT0ic3RyaW5nInx8V3IubGVuZ3RoPT09MCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIHdvcmtlciBzb3VyY2Ugbm90IGVtYmVkZGVkOyBydW4gcGtnIGJ1aWxkIGJlZm9yZSBzcGF3biIpO3JldHVybiBhdG9iKFdyKX1mdW5jdGlvbiBOYygpe2lmKGpyIT09dm9pZCAwKXJldHVybiBqcjtsZXQgZT1uZXcgQmxvYihbcWMoKV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTtyZXR1cm4ganI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxqcn1mdW5jdGlvbiBWaSgpe2lmKFhyPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHNwYXduIHN5bmMgd29ya2VyIik7cmV0dXJuIG5ldyBYcihOYygpLHt0eXBlOiJtb2R1bGUifSl9ZnVuY3Rpb24gTGkoZSx0LHIpe2lmKHJzPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHBvc3QgdG8gc3luYyB3b3JrZXIiKTtpZihyIT09dm9pZCAwJiZyLmxlbmd0aD4wKXJzLmNhbGwoZSx0LHt0cmFuc2ZlcjpyfSk7ZWxzZSBycy5jYWxsKGUsdCl9dmFyIFhyLHJzLGpyO3ZhciBPaT1fKCgpPT57WHI9dHlwZW9mIGdsb2JhbFRoaXMuV29ya2VyPT09ImZ1bmN0aW9uIj9nbG9iYWxUaGlzLldvcmtlcjp2b2lkIDAscnM9WHI9PT12b2lkIDA/dm9pZCAwOlhyLnByb3RvdHlwZS5wb3N0TWVzc2FnZX0pO2FzeW5jIGZ1bmN0aW9uIHFpKGUpe2lmKGU/LmNyZWRJZCE9PXZvaWQgMClyZXR1cm4gZihlLmNyZWRJZCk7cmV0dXJuIFRpKGUpfWFzeW5jIGZ1bmN0aW9uIG5zKGUsdCxyKXtsZXQgbj0kZSgpO2lmKG4hPT0wKXJldHVybiBuO2xldFtzLG9dPVFlKHIpO2lmKG8hPT0wKXJldHVybiBvO2lmKHM9PT12b2lkIDApcmV0dXJuIDk7YXdhaXQgTnIoKTtsZXQgaT1uZXcgVWludDhBcnJheSh0LmJ5dGVMZW5ndGgpO2kuc2V0KHQpO2xldCBjPXtsYXJnZUJsb2I6e3dyaXRlOmkuYnVmZmVyfX0sdT17cHVibGljS2V5OntjaGFsbGVuZ2U6Q2UoR2UpLHJwSWQ6cyxhbGxvd0NyZWRlbnRpYWxzOlt7dHlwZTprZSxpZDpVZShlKX1dLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOmMsLi4ucj8uaGludHMhPT12b2lkIDA/e2hpbnRzOnIuaGludHN9Ont9fX0sZDt0cnl7dHJ5e2Q9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCh1KX1jYXRjaChtKXtpZighcXIobSkpcmV0dXJuIERlKG0pLDMwO010KCk7dHJ5e2Q9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldCh1KX1jYXRjaChoKXtyZXR1cm4gRGUoaCksMzB9fX1jYXRjaChtKXtyZXR1cm4gRGUobSksMzB9ZmluYWxseXtpLmZpbGwoMCl9bGV0W2wscF09emUoZCk7aWYocCE9PTApcmV0dXJuIHA7aWYobD09PXZvaWQgMClyZXR1cm4gMjc7aWYobC5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkubGFyZ2VCbG9iPy53cml0dGVuIT09ITApcmV0dXJuIDMwO3JldHVybiAwfWZ1bmN0aW9uIE5pKGUsdCl7cmV0dXJuIG5zKGUsbmV3IFVpbnQ4QXJyYXkoQWUpLHQpfXZhciBfaT1fKCgpPT57RCgpOyR0KCk7QygpO0N0KCk7dHMoKX0pO3ZhciBzcyxycj0iZGlwbG9tYXRpYy1wcmYiO3ZhciBvcz1fKCgpPT57Q3QoKTtzcz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMucHJmLnYxIil9KTtmdW5jdGlvbiBfYyhlKXtpZihlPT09dm9pZCAwKXJldHVybltdO2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybltlXTtyZXR1cm4gZS5maWx0ZXIoKHQpPT50LmJ5dGVMZW5ndGg+MCl9ZnVuY3Rpb24gRmMoZSl7aWYoIShlIGluc3RhbmNlb2YgRXJyb3IpKXJldHVybiExO3JldHVybiBlLm5hbWU9PT0iTm90U3VwcG9ydGVkRXJyb3IifHxlLm5hbWU9PT0iVHlwZUVycm9yIn1mdW5jdGlvbiBGaShlKXtpZihlPT09dm9pZCAwKXJldHVybjtsZXQgdD1PcihlKTtpZih0LmJ5dGVMZW5ndGg8aXMpe3QuZmlsbCgwKTtyZXR1cm59aWYodC5ieXRlTGVuZ3RoPT09aXMpcmV0dXJuIHQ7bGV0IHI9dC5zbGljZSgwLGlzKTtyZXR1cm4gdC5maWxsKDApLHJ9YXN5bmMgZnVuY3Rpb24gV2MoZSl7bGV0IHQ9JGUoKTtpZih0IT09MClyZXR1cm4gYSh0KTtsZXRbcixuXT1RZShlKTtpZihuIT09MClyZXR1cm4gYShuKTtsZXQgcz1lPy51c2VyTmFtZT8/cnIsbz1lPy5kaXNwbGF5TmFtZT8/cyxpPUNlKDE2KSxjPWU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PT09ImNyb3NzLXBsYXRmb3JtIix1PXtyZXNpZGVudEtleTpjPyJkaXNjb3VyYWdlZCI6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6IWMsdXNlclZlcmlmaWNhdGlvbjpjPyJwcmVmZXJyZWQiOiJyZXF1aXJlZCJ9O2lmKGU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50IT09dm9pZCAwKXUuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9ZS5hdXRoZW50aWNhdG9yQXR0YWNobWVudDtsZXQgZD17Y2hhbGxlbmdlOkNlKEdlKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/VnJ9LHVzZXI6e2lkOmksbmFtZTpzLGRpc3BsYXlOYW1lOm99LHB1YktleUNyZWRQYXJhbXM6THIsYXV0aGVudGljYXRvclNlbGVjdGlvbjp1LC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fSwuLi5lPy5leGNsdWRlQ3JlZGVudGlhbHMhPT12b2lkIDAmJmUuZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aD4wP3tleGNsdWRlQ3JlZGVudGlhbHM6ZS5leGNsdWRlQ3JlZGVudGlhbHMubWFwKCh4KT0+KHt0eXBlOmtlLGlkOlVlKHgpfSkpfTp7fX0sbD1lPy5zYWx0IT09dm9pZCAwP1VlKGUuc2FsdCk6dm9pZCAwLHA9KHgpPT5fcih7cHVibGljS2V5OnsuLi5kLGV4dGVuc2lvbnM6eCYmbCE9PXZvaWQgMD97cHJmOntldmFsOntmaXJzdDpsfX19OntwcmY6e319fX0pLHk7dHJ5e3k9YXdhaXQgcChsIT09dm9pZCAwKX1jYXRjaCh4KXtpZihsPT09dm9pZCAwfHwhRmMoeCkpcmV0dXJuIERlKHgpLGEoMzApO3RyeXt5PWF3YWl0IHAoITEpfWNhdGNoKEUpe3JldHVybiBEZShFKSxhKDMwKX19bGV0W20saF09emUoeSk7aWYoaCE9PTApcmV0dXJuIGEoaCk7bGV0IGc9bS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksUz1GaShnLnByZj8ucmVzdWx0cz8uZmlyc3QpLGI9Zy5wcmY/LmVuYWJsZWQ9PT0hMHx8UyE9PXZvaWQgMDtpZihjJiZTIT09dm9pZCAwKVMuZmlsbCgwKTtyZXR1cm4gZih7Y3JlZElkOm5ldyBVaW50OEFycmF5KG0ucmF3SWQpLHVzZXJJZDpuZXcgVWludDhBcnJheShpKSxwcmZFbmFibGVkOmIscHJmOmM/dm9pZCAwOlMsYXR0YWNobWVudDpKbihtLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOlpuKG0pLGFhZ3VpZDpIaShtKX0pfWFzeW5jIGZ1bmN0aW9uIFdpKGUpe2xldCB0PSRlKCk7aWYodCE9PTApcmV0dXJuIGEodCk7bGV0W3Isbl09UWUoZSk7aWYobiE9PTApcmV0dXJuIGEobik7bGV0IHM9ZT8uc2FsdD8/c3MsaT17ZXZhbDp7Zmlyc3Q6VWUocyl9fSxjPWU/LnNhbHRzO2lmKGMhPT12b2lkIDAmJmMubGVuZ3RoPjApe2xldCBnPXt9O2ZvcihsZXQgUyBvZiBjKXtpZihTLmNyZWRJZC5ieXRlTGVuZ3RoPT09MCljb250aW51ZTtnW1ZzKFMuY3JlZElkKV09e2ZpcnN0OlVlKFMuc2FsdCl9fWkuZXZhbEJ5Q3JlZGVudGlhbD1nfWxldCB1PXtjaGFsbGVuZ2U6Q2UoR2UpLHJwSWQ6cix1c2VyVmVyaWZpY2F0aW9uOiJwcmVmZXJyZWQiLGV4dGVuc2lvbnM6e3ByZjppfX07aWYoZT8uaGludHMhPT12b2lkIDApdS5oaW50cz1lLmhpbnRzO2xldCBkPV9jKGU/LmNyZWRJZCk7aWYoZC5sZW5ndGg+MCl1LmFsbG93Q3JlZGVudGlhbHM9ZC5tYXAoKGcpPT4oe3R5cGU6a2UsaWQ6VWUoZyl9KSk7bGV0IGw7dHJ5e2w9YXdhaXQgRnIoe3B1YmxpY0tleTp1fSl9Y2F0Y2goZyl7cmV0dXJuIERlKGcpLGEoMzApfWxldFtwLHldPXplKGwpO2lmKHkhPT0wKXJldHVybiBhKHkpO2xldCBtPXAuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLnByZj8ucmVzdWx0cztpZihtPy5maXJzdD09PXZvaWQgMClyZXR1cm4gYSg3KTtsZXQgaD1GaShtLmZpcnN0KTtpZihoPT09dm9pZCAwKXJldHVybiBhKDI3KTtyZXR1cm4gZih7cHJmOmgsY3JlZElkOm5ldyBVaW50OEFycmF5KHAucmF3SWQpLGF0dGFjaG1lbnQ6Sm4ocC5hdXRoZW50aWNhdG9yQXR0YWNobWVudCksdHJhbnNwb3J0czpabihwKX0pfWFzeW5jIGZ1bmN0aW9uIGppKGUpe2xldCB0PWU/LnNhbHQ/P3NzLHI9ZT8uY3JlZElkLG49cixzPWU/LmNyZWF0ZUNyZWRJZk5lZWRlZD09PSEwJiYocj09PXZvaWQgMHx8IShyIGluc3RhbmNlb2YgVWludDhBcnJheSkmJnIubGVuZ3RoPT09MCksbyxpO2lmKHMpe2xldFtsLHBdPWF3YWl0IFdjKHtycElkOmU/LnJwSWQscnBOYW1lOmU/LnJwTmFtZSx1c2VyTmFtZTplPy51c2VyTmFtZT8/cnIsZGlzcGxheU5hbWU6ZT8uZGlzcGxheU5hbWUsYXV0aGVudGljYXRvckF0dGFjaG1lbnQ6ZT8uYXV0aGVudGljYXRvckF0dGFjaG1lbnQsaGludHM6ZT8uaGludHMsZXhjbHVkZUNyZWRlbnRpYWxzOmU/LmV4Y2x1ZGVDcmVkZW50aWFscyxzYWx0OnR9KTtpZihwIT09MClyZXR1cm4gYShwKTtpZighbC5wcmZFbmFibGVkKXJldHVybiBhKDMwKTtuPWwuY3JlZElkLG89bCxpPWwucHJmfWxldCBjPShsLHAseSxtKT0+Zih7cHJmOmwsc2FsdDp0LnNsaWNlKCksY3JlZElkOnAuc2xpY2UoKSx1c2VySWQ6bz8udXNlcklkPT09dm9pZCAwP3ZvaWQgMDpvLnVzZXJJZC5zbGljZSgpLGF0dGFjaG1lbnQ6eT8/bz8uYXR0YWNobWVudCx0cmFuc3BvcnRzOm0/P28/LnRyYW5zcG9ydHMsYWFndWlkOm8/LmFhZ3VpZD09PXZvaWQgMD92b2lkIDA6by5hYWd1aWQuc2xpY2UoKX0pO2lmKGkhPT12b2lkIDAmJm8hPT12b2lkIDApcmV0dXJuIGMoaSxvLmNyZWRJZCxvLmF0dGFjaG1lbnQsby50cmFuc3BvcnRzKTtsZXRbdSxkXT1hd2FpdCBXaSh7cnBJZDplPy5ycElkLHJwTmFtZTplPy5ycE5hbWUsY3JlZElkOm4sc2FsdDp0LGhpbnRzOmU/LmhpbnRzfSk7aWYoZCE9PTApcmV0dXJuIGEoZCk7cmV0dXJuIGModS5wcmYsdS5jcmVkSWQsdS5hdHRhY2htZW50LHUudHJhbnNwb3J0cyl9YXN5bmMgZnVuY3Rpb24gWGkoZSx0KXtsZXQgcj1bXSxuPVtdLHM9ITE7Zm9yKGxldCBkIG9mIGUpe2lmKGQuY3JlZElkLmJ5dGVMZW5ndGg9PT0wKWNvbnRpbnVlO3IucHVzaChkLmNyZWRJZCk7bGV0IGw9ZC5zYWx0Pz90LnNhbHQ7aWYoIUcobCx0LnNhbHQpKXM9ITA7bi5wdXNoKHtjcmVkSWQ6ZC5jcmVkSWQsc2FsdDpsfSl9bGV0W28saV09YXdhaXQgV2koe3JwSWQ6dC5ycElkLHJwTmFtZTp0LnJwTmFtZSxoaW50czp0LmhpbnRzLGNyZWRJZDpyLmxlbmd0aD4wP3I6dm9pZCAwLHNhbHQ6dC5zYWx0LHNhbHRzOnM/bjp2b2lkIDB9KTtpZihpIT09MClyZXR1cm4gYShpKTtsZXQgYz1lLmZpbmQoKGQpPT5HKGQuY3JlZElkLG8uY3JlZElkKSksdT1jPT09dm9pZCAwP2U6W2MsLi4uZS5maWx0ZXIoKGQpPT5kIT09YyldO3JldHVybiBmKHtwcmY6by5wcmYsY3JlZElkOm8uY3JlZElkLnNsaWNlKCksb3JkZXI6dX0pfXZhciBpcz0zMjt2YXIgR2k9XygoKT0+e2NlKCk7RCgpO0MoKTtDdCgpO29zKCl9KTt2YXIgdmk9e307QWEodmkse0VuY2xhdmU6KCk9PnllLE1VU0VDX01JTl9MRU46KCk9PlFyLGFzTWFzdGVyU2VlZDooKT0+R3IsZnJvbVNlZWRIb3N0czooKT0+JGl9KTtmdW5jdGlvbiAkaShlKXtpZihlLmJ5dGVMZW5ndGg9PT0wfHxlLmV2ZXJ5KChjKT0+Yz09PTApKXJldHVybiBhKDIyKTtpZihlLmJ5dGVMZW5ndGg8QWUrMSlyZXR1cm4gYSgxNCk7bGV0IHQ9ZS5zdWJhcnJheSgwLEFlKTtpZih0LmV2ZXJ5KChjKT0+Yz09PTApKXJldHVybiBhKDIyKTtsZXQgcj1uZXcgTChlLnN1YmFycmF5KEFlKSksW24sc109ci5yZWFkU3RydWN0KHpuKTtpZihzIT09MClyZXR1cm4gYShzKTtpZihuPT09dm9pZCAwKXJldHVybiBhKDE0KTtpZighci5kb25lKCkpcmV0dXJuIGEoMTQpO2xldFtvLGldPXllLmZyb21CeXRlcyh0KTtpZihpIT09MClyZXR1cm4gYShpKTtyZXR1cm4gZih7ZW5jbGF2ZTpvLGhvc3RzOm4uaG9zdHMubWFwKChjKT0+KHsuLi5jfSkpfSl9ZnVuY3Rpb24gR3IoZSl7aWYoZS5ieXRlTGVuZ3RoIT09QWUpcmV0dXJuIGEoMTApO3JldHVybltlLDBdfWFzeW5jIGZ1bmN0aW9uIFFpKGUpe2lmKGUuYnl0ZUxlbmd0aDxYYylyZXR1cm4gYSgxMCk7bGV0IHQ9WS5CaW5kO3JldHVybiBvZSh7cGFyZW50OmUscHVycG9zZTp0LGtkbTpxfSl9Y2xhc3MgWWV7I2U7Y29uc3RydWN0b3IoZSl7dGhpcy4jZT1lfXN0YXRpYyBhc3luYyBtaXgoZSl7bGV0IHQscixuO3RyeXtpZihlLmJ5dGVMZW5ndGg8UXIpcmV0dXJuIGEoMTApO3Q9YXdhaXQgd24oKSxyPW5ldyBVaW50OEFycmF5KHQuYnl0ZUxlbmd0aCtlLmJ5dGVMZW5ndGgpLHIuc2V0KHQsMCksci5zZXQoZSx0LmJ5dGVMZW5ndGgpLG49YXdhaXQgRnQocik7bGV0W3Msb109R3Iobik7aWYobyE9PTApcmV0dXJuIGEobyk7bGV0IGk9bmV3IFllKHMpO3JldHVybiBuPXZvaWQgMCxmKGkpfWZpbmFsbHl7dD8uZmlsbCgwKSxyPy5maWxsKDApLGUuZmlsbCgwKSxuPy5maWxsKDApfX1zdGF0aWMgaW1wb3J0U2VlZChlKXtsZXRbdCxyXT1HcihlKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXRbbixzXT1Hcih0LnNsaWNlKCkpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKG5ldyBZZShuKSl9c3RhdGljIGFzeW5jIHVuc2VhbChlLHQpe2xldFsscl09b3QoZSk7aWYociE9PTApcmV0dXJuIGEocik7bGV0W24sc109YXdhaXQgUWkodCk7aWYocyE9PTApcmV0dXJuIGEocyk7bGV0IG87dHJ5e3RyeXtvPWF3YWl0IHN0KGUsbil9Y2F0Y2h7cmV0dXJuIGEoMjApfXJldHVybiBZZS5pbXBvcnRTZWVkKG8pfWZpbmFsbHl7bi5maWxsKDApLG8/LmZpbGwoMCl9fWFzeW5jIGlkbnQoZSl7bGV0IHQ9WS5JZGVudGl0eTtyZXR1cm4gb2Uoe3BhcmVudDp0aGlzLiNlLHB1cnBvc2U6dCxrZG06ZX0pfWFzeW5jIHJlYWxtS2V5KGUpe3JldHVybiBqbyh0aGlzLiNlLGUpfWFzeW5jIHJlYWxtSUQoZSl7cmV0dXJuIFhvKHRoaXMuI2UsZSl9YXN5bmMgZXhwb3J0RmlsZUtleShlKXtsZXQgdD1ZLkV4cG9ydDtyZXR1cm4gb2Uoe3BhcmVudDp0aGlzLiNlLHB1cnBvc2U6dCxrZG06ZX0pfWFzeW5jIGZpbmdlcnByaW50KGUpe2xldCB0PVkuRmluZ2VycHJpbnQ7cmV0dXJuIGF3YWl0IG9lKHtwYXJlbnQ6dGhpcy4jZSxwdXJwb3NlOnQsa2RtOmV9KX1hc3luYyBiaW5kVGFnKGUpe2xldCB0PVkuQmluZFRhZztyZXR1cm4gYXdhaXQgb2Uoe3BhcmVudDp0aGlzLiNlLHB1cnBvc2U6dCxrZG06ZX0pfWFzeW5jIHNlYWwoZSl7bGV0W3Qscl09YXdhaXQgUWkoZSk7aWYociE9PTApcmV0dXJuIGEocik7dHJ5e2xldCBuPWF3YWl0IGd0KHRoaXMuI2UsdCk7cmV0dXJuIG90KG4pfWNhdGNoe3JldHVybiBhKDEyKX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgc2VhbFNlZWRIb3N0cyhlLHQpe2xldFtyLG5dPXRoaXMuI3QodCk7aWYobiE9PTApcmV0dXJuIGEobik7dHJ5e3JldHVybiBmKGF3YWl0IGd0KHIsZSkpfWNhdGNoe3JldHVybiBhKDEyKX1maW5hbGx5e3IuZmlsbCgwKX19I3QoZSl7bGV0IHQ9bmV3IE8scj10LndyaXRlU3RydWN0KHpuLHtob3N0czplLm1hcCgobyk9Pih7aGFuZGxlOm8uaGFuZGxlLGxhYmVsOm8ubGFiZWwsaWR4Om8uaWR4Pz8wfSkpfSk7aWYociE9PTApcmV0dXJuIGEocik7bGV0IG49dC5yZXN1bHQoKSxzPW5ldyBVaW50OEFycmF5KEFlK24uYnl0ZUxlbmd0aCk7cmV0dXJuIHMuc2V0KHRoaXMuI2UsMCkscy5zZXQobixBZSksW3MsMF19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGUsdCl7bGV0W3Isbl09YXdhaXQgcWkodCk7aWYobiE9PTApcmV0dXJuIGEobik7bGV0W3Msb109dGhpcy4jdChlKTtpZihvIT09MClyZXR1cm4gYShvKTt0cnl7bGV0IGk9YXdhaXQgbnMocixzLHQpO2lmKGkhPT0wKXJldHVybiBhKGkpO3JldHVybiBmKHIpfWZpbmFsbHl7cy5maWxsKDApfX1hc3luYyBkdW1wVG9UVFkoKXtyZXR1cm4gMjF9Y29weUZvcldvcmtlcigpe3JldHVybiB0aGlzLiNlLnNsaWNlKCl9fWNsYXNzIHlleyNlO2NvbnN0cnVjdG9yKGUpe3RoaXMuI2U9ZX1zdGF0aWMgYXN5bmMgZnJvbVJhbmRvbShlKXt0cnl7bGV0W3Qscl09YXdhaXQgWWUubWl4KGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO3JldHVybiBmKG5ldyB5ZSh0KSl9ZmluYWxseXtlLmZpbGwoMCl9fXN0YXRpYyBmcm9tQnl0ZXMoZSl7bGV0W3Qscl09WWUuaW1wb3J0U2VlZChlKTtpZihyIT09MClyZXR1cm4gYShyKTtyZXR1cm4gZihuZXcgeWUodCkpfWFzeW5jIHNlYWxXaXRoUGFzc2tleShlKXtsZXRbdCxyXT1hd2FpdCBqaShlKTtpZihyIT09MClyZXR1cm4gYShyKTt0cnl7bGV0W24sc109YXdhaXQgdGhpcy4jZS5zZWFsKHQucHJmKTtpZihzIT09MClyZXR1cm4gYShzKTtyZXR1cm4gZih7c2VhbGVkTWFzdGVyOm4sc2FsdDp0LnNhbHQsY3JlZElkOnQuY3JlZElkLHVzZXJJZDp0LnVzZXJJZCxhdHRhY2htZW50OnQuYXR0YWNobWVudCx0cmFuc3BvcnRzOnQudHJhbnNwb3J0cyxhYWd1aWQ6dC5hYWd1aWR9KX1maW5hbGx5e3QucHJmLmZpbGwoMCl9fWFzeW5jIGJpbmQoZSx0KXtpZih0IT09dm9pZCAwKWZvcihsZXQgaSBvZiB0KXtpZihpLnRhZy5ieXRlTGVuZ3RoIT09amMpcmV0dXJuIGEoMTApO2xldFtjLHVdPWF3YWl0IHRoaXMuI2UuYmluZFRhZyhpLmNyZWRJZCk7aWYodSE9PTApcmV0dXJuIGEodSk7dHJ5e2lmKCFpcihjLGkudGFnKSlyZXR1cm4gYSgxMCl9ZmluYWxseXtjLmZpbGwoMCl9fWxldFtyLG5dPWF3YWl0IHRoaXMuc2VhbFdpdGhQYXNza2V5KGUpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldFtzLG9dPWF3YWl0IHRoaXMuI2UuYmluZFRhZyhyLmNyZWRJZCk7aWYobyE9PTApcmV0dXJuIGEobyk7cmV0dXJuIGYoey4uLnIsdGFnOnN9KX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aFBhc3NrZXkoZSx0KXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGEoMjIpO2xldFtyLG5dPWF3YWl0IFhpKGUsdCk7aWYobiE9PTApcmV0dXJuIGEobik7dHJ5e2ZvcihsZXQgcyBvZiByLm9yZGVyKXtsZXRbbyxpXT1hd2FpdCBZZS51bnNlYWwocy5zZWFsZWRNYXN0ZXIsci5wcmYpO2lmKGk9PT0wKXJldHVybiBmKHtlbmNsYXZlOm5ldyB5ZShvKSxjcmVkSWQ6ci5jcmVkSWR9KX1yZXR1cm4gYSgyMCl9ZmluYWxseXtyLnByZi5maWxsKDApfX1hc3luYyBzZWFsV2l0aElLTShlKXt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuI2Uuc2VhbChlKX1maW5hbGx5e2UuZmlsbCgwKX19c3RhdGljIGFzeW5jIHVuc2VhbFdpdGhJS00oZSx0KXt0cnl7bGV0W3Isbl09YXdhaXQgWWUudW5zZWFsKGUsdCk7aWYobiE9PTApcmV0dXJuIGEobik7cmV0dXJuIGYobmV3IHllKHIpKX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGU9W10sdCl7cmV0dXJuIHRoaXMuI2UucGVyc2lzdFRvTGFyZ2VCbG9iKGUsdCl9c3RhdGljIGFzeW5jIGZyb21MYXJnZUJsb2IoZSl7bGV0W3Qscl09YXdhaXQgS2koZT8uY3JlZElkLGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO3RyeXtsZXRbbixzXT0kaSh0LmJsb2IpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKHsuLi5uLGNyZWRJZDp0LmNyZWRJZH0pfWZpbmFsbHl7dC5ibG9iLmZpbGwoMCl9fXN0YXRpYyBjbGVhckxhcmdlQmxvYihlLHQpe3JldHVybiBOaShlLHQpfWFzeW5jIGR1bXBUb1RUWSgpe3JldHVybiB0aGlzLiNlLmR1bXBUb1RUWSgpfXN0YXRpYyBwYWlyUmVxdWVzdCgpe3JldHVybiB2dC5jcmVhdGUoKX1hc3luYyBwYWlyQWNjZXB0KGUsdCxyKXtpZihyLnVzZXJDb250cm9sc0JvdGhTaWRlc09mUGFpciE9PSEwKXJldHVybiBhKDEwKTtsZXRbbixzXT1hd2FpdCBraShlKTtpZihzIT09MClyZXR1cm4gYShzKTt0cnl7bGV0W28saV09YXdhaXQgdGhpcy4jZS5zZWFsU2VlZEhvc3RzKG4ua2V5LHQpO2lmKGkhPT0wKXJldHVybiBhKGkpO3JldHVybiBFaShwdChuLnB1YixvKSl9ZmluYWxseXtuLmtleS5maWxsKDApfX1zcGF3blN5bmNXb3JrZXIoZSl7bGV0IHQ9VmkoKSxyPXRoaXMuI2UuY29weUZvcldvcmtlcigpO3JldHVybiBMaSh0LHtpZDplLmlkLG9wOiJzZXRTZWVkIixzZWVkOnIscGVyc2lzdDplLnBlcnNpc3R9LFtyLmJ1ZmZlcl0pLHR9YXN5bmMgZXhwb3J0S2V5KGUpe2lmKGUuYnl0ZUxlbmd0aCE9PXopcmV0dXJuIGEoMTApO3JldHVybiB0aGlzLiNlLmV4cG9ydEZpbGVLZXkoZSl9YXN5bmMgYmFnbWFuKGUsdCl7bGV0W3Isbl09YXdhaXQgdGhpcy4jZS5pZG50KGUpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldFtzLG9dPWF3YWl0IHRoaXMuI2UucmVhbG1LZXkodCk7aWYobyE9PTApcmV0dXJuIHIuZmlsbCgwKSxhKG8pO2xldFtpLGNdPWF3YWl0IHRoaXMuI2UucmVhbG1JRCh0KTtpZihjIT09MClyZXR1cm4gci5maWxsKDApLHMuZmlsbCgwKSxhKGMpO3RyeXtsZXRbdSxkXT1hd2FpdCBFcihpLGUpO2lmKGQhPT0wKXJldHVybiByLmZpbGwoMCkscy5maWxsKDApLGEoZCk7cmV0dXJuIFhlLmluaXQocixzLHUsZSx0KX1maW5hbGx5e2kuZmlsbCgwKX19YXN5bmMgZmluZ2VycHJpbnQoZT1xKXtyZXR1cm4gdGhpcy4jZS5maW5nZXJwcmludChlKX19ZnVuY3Rpb24gemkoZSl7Zm9yKGxldCB0IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKXtpZihHYy5oYXModCkpY29udGludWU7bGV0IHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKHI9PT12b2lkIDB8fHR5cGVvZiByLnZhbHVlIT09ImZ1bmN0aW9uIiljb250aW51ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyLnZhbHVlLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMX0pfX12YXIgamM9MzIsWGM9MTYsUXI9MzIsR2M7dmFyIHRyPV8oKCk9PntjZSgpO3JlKCk7eGkoKTtEKCk7JHQoKTtDKCk7ZmUoKTtTdCgpO0JpKCk7dHMoKTtPaSgpO19pKCk7R2koKTtSbigpO1VuKCk7R2M9bmV3IFNldChbImNvbnN0cnVjdG9yIiwicHJvdG90eXBlIiwibGVuZ3RoIiwibmFtZSJdKTt6aSh5ZSk7emkoeWUucHJvdG90eXBlKX0pO0QoKTtmdW5jdGlvbiBUcyhlKXtpZighZXx8dHlwZW9mIGUhPT0ib2JqZWN0IilyZXR1cm4hMTtpZighKCJvcCJpbiBlKXx8ISgiaWQiaW4gZSkpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiBlLm9wPT09InN0cmluZyImJnR5cGVvZiBlLmlkPT09Im51bWJlciJ9Y2xhc3MgSHR7bGlzdGVuZXJzPW5ldyBNYXA7YWRkRXZlbnRMaXN0ZW5lcihlLHQpe2xldCByPXRoaXMubGlzdGVuZXJzLmdldChlKTtpZighcilyPW5ldyBTZXQsdGhpcy5saXN0ZW5lcnMuc2V0KGUscik7cmV0dXJuIHIuYWRkKHQpLCgpPT57dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl9fXJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYocil7aWYoci5kZWxldGUodCksci5zaXplPT09MCl0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYocil7bGV0IG49QXJyYXkuZnJvbShyKTtmb3IobGV0IHMgb2YgbilzKHQpfX1lbWl0QWxsKGUpe2xldCB0PUFycmF5LmZyb20odGhpcy5saXN0ZW5lcnMua2V5cygpKTtmb3IobGV0IHIgb2YgdCl0aGlzLmVtaXQocixlKX19Y2xhc3MgWmV7Z2V0dGVyO3N0YXRpYyBldmVudE5hbWU9InVwZGF0ZSI7ZW1pdHRlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLmdldHRlcj1lO3RoaXMuZW1pdHRlcj1uZXcgSHR9Z2V0PSgpPT50aGlzLmdldHRlcigpO2FzeW5jIGVtaXQoKXtsZXQgZT1hd2FpdCB0aGlzLmdldHRlcigpO3F1ZXVlTWljcm90YXNrKCgpPT50aGlzLmVtaXR0ZXIuZW1pdChaZS5ldmVudE5hbWUsZSkpfWxpc3RlbihlKXtyZXR1cm4gdGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoWmUuZXZlbnROYW1lLGUpLCgpPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoWmUuZXZlbnROYW1lLGUpfX19cmUoKTtEKCk7QygpO2FzeW5jIGZ1bmN0aW9uIFpyKGUsdCl7bGV0IHI9bmV3IE8sbj1yLndyaXRlRGF0ZSh0KTtpZihuIT09MClyZXR1cm4gYShuKTtsZXQgcz1yLnJlc3VsdCgpLFtvLGldPWF3YWl0IGUuc2lnbihzKTtpZihpIT09MClyZXR1cm4gYShpKTtyZXR1cm4gZih7cHViS2V5OmUucHVibGljS2V5LHNpZzpvLHRpbWVzdGFtcDp0fSl9YXN5bmMgZnVuY3Rpb24gTmUoZSx0LHIpe2xldCBuPXIubm93KCkuZ2V0VGltZSgpLHM9ZS50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKG4tcyk+UnMpcmV0dXJuIDQ7bGV0IGk9bmV3IE87aS53cml0ZURhdGUoZS50aW1lc3RhbXApO2xldCBjPWkucmVzdWx0KCksdTt0cnl7dT1hd2FpdCB0LmltcG9ydFZlcmlmeUtleShlLnB1YktleSl9Y2F0Y2h7cmV0dXJuIDI5fWlmKCFhd2FpdCB0LmNoZWNrU2lnRWQyNTUxOShlLnNpZyxjLHUpKXJldHVybiAzO3JldHVybiAwfXJlKCk7cmUoKTtEKCk7cmUoKTtEKCk7QygpO3ZhciBhZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudHMpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXRbbixzXT1lLnJlYWREYXRlKCk7aWYocyE9PTApcmV0dXJuIGEocyk7cmV0dXJuIGYoe2lkOnQsdHM6bn0pfX07ZnVuY3Rpb24gZnQoZSl7bGV0IHQ9bmV3IE8scj10LndyaXRlU3RydWN0KGFlLGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldCBuPXQucmVzdWx0KCk7cmV0dXJuIGYobil9QygpO3ZhciBJZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhclN0cmluZyh0LnR5cD8/IiIpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJCeXRlcyh0LmVpZCk7aWYobiE9PTApcmV0dXJuIG47bGV0IHM9ZS53cml0ZVZhckludCh0Lm9mZik7aWYocyE9PTApcmV0dXJuIHM7bGV0IG89ZS53cml0ZVZhckludCh0LmN0cik7aWYobyE9PTApcmV0dXJuIG87bGV0IGk9ZS53cml0ZVZhckludCh0Lmxlbik7aWYoaSE9PTApcmV0dXJuIGk7aWYodC5oc2gpZS53cml0ZUJ5dGVzKHQuaHNoKTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhclN0cmluZygpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZFZhckJ5dGVzKCk7aWYocyE9PTApcmV0dXJuIGEocyk7bGV0IG89bmV3IEwobiksWyxpXT1hZS5kZWNvZGUobyk7aWYoaSE9PTApcmV0dXJuIGEoaSk7bGV0W2MsdV09ZS5yZWFkVmFySW50KCk7aWYodSE9PTApcmV0dXJuIGEodSk7bGV0W2QsbF09ZS5yZWFkVmFySW50KCk7aWYobCE9PTApcmV0dXJuIGEobCk7bGV0W3AseV09ZS5yZWFkVmFySW50KCk7aWYoeSE9PTApcmV0dXJuIGEoeSk7bGV0IG07aWYocD4wKXtsZXRbaCxnXT1lLnJlYWRCeXRlcyhxZSk7aWYoZyE9PTApcmV0dXJuIGEoZyk7bT1ofXJldHVybiBmKHt0eXA6dCxlaWQ6bixvZmY6YyxjdHI6ZCxsZW46cCxoc2g6bX0pfX07RCgpO2NlKCk7QygpO2Z1bmN0aW9uIGFyKGUsdCl7cmV0dXJuIHB0KGUsdCl9ZnVuY3Rpb24gT3MoZSx0LHIpe2lmKGUucmxtLmJ5dGVMZW5ndGghPT16KXJldHVybiBQcm9taXNlLnJlc29sdmUoITEpO3JldHVybiByLmNoZWNrU2lnRWQyNTUxOShlLnNpZyxhcihlLnJsbSxlLmhlYWRDcGgpLHQpfWFzeW5jIGZ1bmN0aW9uIHFzKGUsdCxyKXtsZXQgbjtpZihlLmJvZCYmZS5sZW4+MCluPWF3YWl0IHIuYmxha2UzKGUuYm9kKTtsZXQgcz1uZXcgTyxvPUllLmVuY29kZShzLHsuLi5lLGhzaDpufSk7aWYobyE9PTApcmV0dXJuIGEobyk7bGV0IGk9cy5yZXN1bHQoKSxbYyx1XT1hd2FpdCB0LmJhZ0tETShpKTtpZih1IT09MClyZXR1cm4gYSh1KTtsZXQgZD10LnJsbSxbbCxwXT1hd2FpdCB0LmVuY3J5cHQoYyxpKTtpZihwIT09MClyZXR1cm4gYShwKTtsZXQgeT1uZXcgVWludDhBcnJheSgwKTtpZihlLmJvZCl7bGV0W1MsYl09YXdhaXQgdC5lbmNyeXB0KGMsZS5ib2QpO2lmKGIhPT0wKXJldHVybiBhKGIpO3k9U31sZXQgbT1hcihkLGwpLFtoLGddPWF3YWl0IHQuc2lnbihtKTtpZihnIT09MClyZXR1cm4gYShnKTtyZXR1cm4gZih7cmxtOmQsc2lnOmgsa2RtOmMsaGVhZENwaDpsLGJvZHlDcGg6eX0pfWFzeW5jIGZ1bmN0aW9uIGVuKGUsdCxyLG4scyl7bGV0IG89bmV3IEwoZSksW2ksY109SWUuZGVjb2RlKG8pO2lmKGMhPT0wKXJldHVybiBhKDE0KTtsZXQgdTtpZih0JiZ0Lmxlbmd0aD4wKXtsZXRbeSxtXT1hd2FpdCByLmRlY3J5cHQodCk7aWYobSE9PTApcmV0dXJuIGEobSk7dT15fWxldCBkPWkuaHNoJiZ1PT09dm9pZCAwLGw9aS5oc2g9PT12b2lkIDAmJnUhPT12b2lkIDA7aWYoZHx8bClyZXR1cm4gYSgxOSk7aWYoaS5oc2gmJnUpe2xldCB5PWF3YWl0IG4uYmxha2UzKHUpO2lmKCFHKHksaS5oc2gpKXJldHVybiBhKDE5KX1sZXQgcD1zPz9hd2FpdCBuLmJsYWtlMyhlKTtyZXR1cm4gZih7bXNnSGVhZDppLGJvZDp1LGhlYWRIYXNoOnB9KX1jbGFzcyB0bntub3coKXtyZXR1cm4gbmV3IERhdGV9fWZ1bmN0aW9uIE5zKGUsdCxyLG4pe2xldCBzPXQuZ2V0VGltZSgpLWUuZ2V0VGltZSgpLG89ci5nZXRUaW1lKCktbi5nZXRUaW1lKCk7cmV0dXJuKHMrbykvMn1yZSgpO3R0KCk7RCgpO0MoKTtEKCk7QygpO3ZhciBWdD17ZW5jb2RlKGUsdCl7aWYoZS53cml0ZVZhckludCh0LnF1b3RhKSx0LnF1b3RhPjApe2lmKHQudXNhZ2U9PT12b2lkIDApcmV0dXJuIDk7ZS53cml0ZVZhckludCh0LnVzYWdlKX1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldCBuO2lmKHQ+MCl7bGV0W3Msb109ZS5yZWFkVmFySW50KCk7aWYobyE9PTApcmV0dXJuIGEobyk7bj1zfXJldHVybiBmKHtxdW90YTp0LHVzYWdlOm59KX19O3ZhciBybj17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKG5ldyBVaW50OEFycmF5KFt0LnN0YXR1c10pKTtsZXQgcj1lLndyaXRlRGF0ZSh0LnRpbWVSY3ZkKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlRGF0ZSh0LnRpbWVTZW50KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQuc3Vic2NyaXB0aW9uLnRlcm0pO2lmKHMhPT0wKXJldHVybiBzO2xldCBvPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24uZWxhcHNlZCk7aWYobyE9PTApcmV0dXJuIG87bGV0IGk9ZS53cml0ZVN0cnVjdChWdCx0LnN1YnNjcmlwdGlvbi5zdGF0KTtpZihpIT09MClyZXR1cm4gaTtsZXQgYz1lLndyaXRlU3RydWN0KFZ0LHQuc3Vic2NyaXB0aW9uLmR5bik7aWYoYyE9PTApcmV0dXJuIGM7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcygxKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXQgbj10WzBdLFtzLG9dPWUucmVhZERhdGUoKTtpZihvIT09MClyZXR1cm4gYShvKTtsZXRbaSxjXT1lLnJlYWREYXRlKCk7aWYoYyE9PTApcmV0dXJuIGEoYyk7bGV0W3UsZF09ZS5yZWFkVmFySW50KCk7aWYoZCE9PTApcmV0dXJuIGEoZCk7bGV0W2wscF09ZS5yZWFkVmFySW50KCk7aWYocCE9PTApcmV0dXJuIGEocCk7bGV0W3ksbV09ZS5yZWFkU3RydWN0KFZ0KTtpZihtIT09MClyZXR1cm4gYShtKTtsZXRbaCxnXT1lLnJlYWRTdHJ1Y3QoVnQpO2lmKGchPT0wKXJldHVybiBhKGcpO3JldHVybiBmKHtzdGF0dXM6bix0aW1lUmN2ZDpzLHRpbWVTZW50Omksc3Vic2NyaXB0aW9uOnt0ZXJtOnUsZWxhcHNlZDpsLHN0YXQ6eSxkeW46aH19KX19O0QoKTtmZSgpO3JlKCk7RCgpO0QoKTtEKCk7QygpO3ZhciBFbj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaGVhZENwaCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0LnNlcSk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZFZhckludCgpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKHtoZWFkQ3BoOnQsc2VxOm59KX19O0QoKTtDKCk7dmFyIGdlPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5wdWJLZXkpLGUud3JpdGVCeXRlcyh0LnNpZyk7bGV0IHI9ZS53cml0ZURhdGUodC50aW1lc3RhbXApO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoVXMpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKEJlKTtpZihzIT09MClyZXR1cm4gYShzKTtsZXRbbyxpXT1lLnJlYWREYXRlKCk7aWYoaSE9PTApcmV0dXJuIGEoaSk7cmV0dXJuIGYoe3B1YktleTp0LHNpZzpuLHRpbWVzdGFtcDpvfSl9fTtmZSgpO0MoKTt2YXIgQm89e2VuY29kZShlLHQpe2lmKHQucmxtLmJ5dGVMZW5ndGghPT16KXJldHVybiAxMDtyZXR1cm4gZS53cml0ZUJ5dGVzKHQucmxtKSxlLndyaXRlVmFySW50KHQuc2VxKX0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKHopO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPVdlKHQpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldFtvLGldPWUucmVhZFZhckludCgpO2lmKGkhPT0wKXJldHVybiBhKGkpO3JldHVybiBmKHtybG06bixzZXE6b30pfX0sdm89e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe2xldCBvPXMud3JpdGVTdHJ1Y3QoZ2Uscik7aWYobyE9PTApcmV0dXJuIG87cmV0dXJuIHMud3JpdGVTdHJ1Y3QoQm8sbil9LGFzeW5jIGhhbmRsZVJlcShlLHQscil7bGV0e2Nsb2NrOm4sY3J5cHRvOnMsc3RvcmFnZTpvfT1lLFtpLGNdPXQucmVhZFN0cnVjdChnZSk7aWYoYyE9PTApcmV0dXJuIGM7bGV0IHU9YXdhaXQgTmUoaSxzLG4pO2lmKHUhPT0wKXJldHVybiB1O2xldHtwdWJLZXk6ZH09aSxbbCxwXT1hd2FpdCBvLmhhc1VzZXIoZCk7aWYocCE9PTApcmV0dXJuIHA7aWYoIWwpcmV0dXJuIDU7bGV0W3ksbV09dC5yZWFkU3RydWN0KEJvKTtpZihtIT09MClyZXR1cm4gbTtpZighdC5kb25lKCkpcmV0dXJuIDg7bGV0W2gsZ109YXdhaXQgby5saXN0SGVhZHMoZCx5LnJsbSx5LnNlcSk7aWYoZyE9PTApcmV0dXJuIGc7cmV0dXJuIHIud3JpdGVTdHJ1Y3RzKEVuLGgpfSxkZWNvZGVSZXNwKGUpe3JldHVybiBlLnJlYWRTdHJ1Y3RzKEVuKX19O0QoKTtDKCk7dmFyIEFuPXtlbmNvZGUoZSx0KXtlLndyaXRlVmFySW50KHQuc2VxKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5ib2R5Q3BoKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZFZhckJ5dGVzKCk7aWYocyE9PTApcmV0dXJuIGEocyk7cmV0dXJuIGYoe3NlcTp0LGJvZHlDcGg6bn0pfX07RCgpO2ZlKCk7QygpO3ZhciBNbz17ZW5jb2RlKGUsdCl7aWYodC5ybG0uYnl0ZUxlbmd0aCE9PXopcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LnJsbSk7Zm9yKGxldCByIG9mIHQuc2Vxcyl7bGV0IG49ZS53cml0ZVZhckludChyKTtpZihuIT09MClyZXR1cm4gbn1yZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKHopO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPVdlKHQpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldCBvPVtdO3doaWxlKCFlLmRvbmUoKSl7bGV0W2ksY109ZS5yZWFkVmFySW50KCk7aWYoYyE9PTApcmV0dXJuIGEoYyk7by5wdXNoKGkpfXJldHVybiBmKHtybG06bixzZXFzOm99KX19LENvPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgbz1zLndyaXRlU3RydWN0KGdlLHIpO2lmKG8hPT0wKXJldHVybiBvO3JldHVybiBzLndyaXRlU3RydWN0KE1vLG4pfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6b309ZSxbaSxjXT10LnJlYWRTdHJ1Y3QoZ2UpO2lmKGMhPT0wKXJldHVybiBjO2xldCB1PWF3YWl0IE5lKGkscyxuKTtpZih1IT09MClyZXR1cm4gdTtsZXR7cHViS2V5OmR9PWksW2wscF09YXdhaXQgby5oYXNVc2VyKGQpO2lmKHAhPT0wKXJldHVybiBwO2lmKCFsKXJldHVybiA1O2xldFt5LG1dPXQucmVhZFN0cnVjdChNbyk7aWYobSE9PTApcmV0dXJuIG07Y29uc29sZS5pbmZvKGBQVUxMOiAke3kuc2Vxcy5sZW5ndGh9IGJhZ3NgKTtsZXRbaCxnXT1hd2FpdCBvLmdldEJvZGllcyhkLHkucmxtLHkuc2Vxcyk7aWYoZyE9PTApcmV0dXJuIGc7aWYoIWgpcmV0dXJuIDE3O2ZvcihsZXR7c2VxOlMsYm9keUNwaDpifW9mIGgpe2xldCB4PXtzZXE6Uyxib2R5Q3BoOmJ9LEU9ci53cml0ZVN0cnVjdChBbix4KTtpZihFIT09MClyZXR1cm4gRX1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhBbil9fTtyZSgpO0QoKTtmZSgpO0MoKTt2YXIga249e2VuY29kZShlLHQpe2lmKHQucmxtLmJ5dGVMZW5ndGghPT16KXJldHVybiAxMDtpZih0LnNpZy5ieXRlTGVuZ3RoIT09QmUpcmV0dXJuIDEwO2Uud3JpdGVCeXRlcyh0LnNpZyksZS53cml0ZUJ5dGVzKHQucmxtKSxlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlDcGgpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoQmUpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKHopO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldFtvLGldPVdlKG4pO2lmKGkhPT0wKXJldHVybiBhKGkpO2xldFtjLHVdPWUucmVhZEJ5dGVzKE9lKTtpZih1IT09MClyZXR1cm4gYSh1KTtsZXRbZCxsXT1lLnJlYWRWYXJCeXRlcygpO2lmKGwhPT0wKXJldHVybiBhKGwpO2xldFtwLHldPWUucmVhZFZhckJ5dGVzKCk7aWYoeSE9PTApcmV0dXJuIGEoeSk7cmV0dXJuIGYoe3JsbTpvLHNpZzp0LGtkbTpjLGhlYWRDcGg6ZCxib2R5Q3BoOnB9KX19O0QoKTtmZSgpO0MoKTt2YXIgU3I9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5zZXEpO2lmKHIhPT0wKXJldHVybiByO2lmKHQucmxtLmJ5dGVMZW5ndGghPT16KXJldHVybiAxMDtlLndyaXRlQnl0ZXModC5ybG0pO2xldCBuPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPXQuYm9keUNwaD90LmJvZHlDcGgubGVuZ3RoOjAsbz1lLndyaXRlVmFySW50KHMpO2lmKG8hPT0wKXJldHVybiBvO2lmKHM+MCl7aWYoIXQuYm9keUNwaClyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQuYm9keUNwaCl9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyh6KTtpZihzIT09MClyZXR1cm4gYShzKTtsZXRbbyxpXT1XZShuKTtpZihpIT09MClyZXR1cm4gYShpKTtsZXRbYyx1XT1lLnJlYWRWYXJCeXRlcygpO2lmKHUhPT0wKXJldHVybiBhKHUpO2xldFtkLGxdPWUucmVhZFZhckludCgpO2lmKGwhPT0wKXJldHVybiBhKGwpO2xldCBwO2lmKGQ+MCl7bGV0W3ksbV09ZS5yZWFkQnl0ZXMoZCk7aWYobSE9PTApcmV0dXJuIGEobSk7cD15fXJldHVybiBmKHtzZXE6dCxybG06byxoZWFkQ3BoOmMsYm9keUNwaDpwfSl9fTtEKCk7QygpO3ZhciBicj17ZW5jb2RlKGUsdCl7ZS53cml0ZUJ5dGVzKHQuc2lnKSxlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoQmUpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKE9lKTtpZihzIT09MClyZXR1cm4gYShzKTtsZXRbbyxpXT1lLnJlYWRWYXJCeXRlcygpO2lmKGkhPT0wKXJldHVybiBhKGkpO3JldHVybiBmKHtzaWc6dCxrZG06bixoZWFkQ3BoOm99KX19O0QoKTtDKCk7dmFyIFd0PXtlbmNvZGUoZSx0KXtpZihlLndyaXRlVmFySW50KHQuaWR4KSxlLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW3Quc3RhdHVzXSkpLHQuc3RhdHVzPT09MCllLndyaXRlVmFySW50KHQuc2VxKTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKDEpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldCBvPW5bMF07aWYobyE9PTApcmV0dXJuIGYoe2lkeDp0LHN0YXR1czpvfSk7bGV0W2ksY109ZS5yZWFkVmFySW50KCk7aWYoYyE9PTApcmV0dXJuIGEoYyk7cmV0dXJuIGYoe2lkeDp0LHN0YXR1czpvLHNlcTppfSl9fTtEKCk7dmFyIFVvPXtlbmNvZGUoZSx0KXtyZXR1cm4gZS53cml0ZVN0cnVjdHMoa24sdCl9LGRlY29kZShlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhrbil9fSxSbz17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IG89cy53cml0ZVN0cnVjdChnZSxyKTtpZihvIT09MClyZXR1cm4gbztyZXR1cm4gcy53cml0ZVN0cnVjdChVbyxuKX0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOm8sbm90aWZpZXI6aX09ZSxbYyx1XT10LnJlYWRTdHJ1Y3QoZ2UpO2lmKHUhPT0wKXJldHVybiB1O2xldCBkPWF3YWl0IE5lKGMscyxuKTtpZihkIT09MClyZXR1cm4gZDtsZXR7cHViS2V5Omx9PWMsW3AseV09YXdhaXQgby5oYXNVc2VyKGwpO2lmKHkhPT0wKXJldHVybiB5O2lmKCFwKXJldHVybiA1O2xldFttLGhdPXQucmVhZFN0cnVjdChVbyk7aWYoaCE9PTApcmV0dXJuIGg7Y29uc29sZS5pbmZvKGBQVVNIOiAke20ubGVuZ3RofSBiYWdzYCk7bGV0IGc7dHJ5e2c9YXdhaXQgcy5pbXBvcnRWZXJpZnlLZXkobCl9Y2F0Y2h7cmV0dXJuIDI5fWxldCBTPVtdLGI9W107Zm9yKGxldCB3PTA7dzxtLmxlbmd0aDt3Kyspe2xldCBrPW1bd107aWYoIWF3YWl0IE9zKGssZyxzKSl7bGV0IFU9e2lkeDp3LHN0YXR1czozfSxUPXIud3JpdGVTdHJ1Y3QoV3QsVSk7aWYoVCE9PTApcmV0dXJuIFQ7Y29udGludWV9Uy5wdXNoKHcpLGIucHVzaChrKX1sZXRbeCxFXT1hd2FpdCBvLnNldEJhZ3MobCxiKTtpZihFIT09MClyZXR1cm4gRTtpZigheHx8eC5sZW5ndGghPT1iLmxlbmd0aClyZXR1cm4gMTc7bGV0IFA9W107Zm9yKGxldCB3PTA7dzxiLmxlbmd0aDt3Kyspe2xldCBrPWJbd10sdj1TW3ddLFU9eFt3XTtpZihVLnN0YXR1cyE9PTApe2xldCBqPXtpZHg6dixzdGF0dXM6VS5zdGF0dXN9LFg9ci53cml0ZVN0cnVjdChXdCxqKTtpZihYIT09MClyZXR1cm4gWDtjb250aW51ZX1sZXQgVD1VLnNlcSxSPW5ldyBPLFY9Ui53cml0ZVN0cnVjdChicixrKTtpZihWIT09MClyZXR1cm4gVjtsZXQgSD1SLnJlc3VsdCgpLEk9e3NlcTpULHJsbTprLnJsbSxoZWFkQ3BoOkh9O2lmKG0ubGVuZ3RoPT09MSYmay5ib2R5Q3BoLmxlbmd0aDw9SHMpSS5ib2R5Q3BoPWsuYm9keUNwaDtQLnB1c2goSSk7bGV0IEY9e2lkeDp2LHN0YXR1czowLHNlcTpUfSxOPXIud3JpdGVTdHJ1Y3QoV3QsRik7aWYoTiE9PTApcmV0dXJuIE59aWYoUC5sZW5ndGg+MCl7bGV0IHc9bmV3IE8saz13LndyaXRlU3RydWN0cyhTcixQKTtpZihrIT09MClyZXR1cm4gaztsZXQgdj13LnJlc3VsdCgpO2F3YWl0IFByb21pc2UucmVzb2x2ZShpLnB1c2gobCx2KSl9cmV0dXJuIDB9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoV3QpfX07RCgpO0MoKTt2YXIgSG89e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe3JldHVybiBzLndyaXRlU3RydWN0KGdlLHIpfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6b309ZSxbaSxjXT10LnJlYWRTdHJ1Y3QoZ2UpO2lmKGMhPT0wKXJldHVybiBjO2xldCB1PWF3YWl0IE5lKGkscyxuKTtpZih1IT09MClyZXR1cm4gdTtsZXR7cHViS2V5OmR9PWk7aWYoIXQuZG9uZSgpKXJldHVybiA4O2xldFtsLHBdPWF3YWl0IG8uYWRkVXNlcihkKTtpZihwIT09MClyZXR1cm4gcDtyZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZih2b2lkIDApfX07Y2UoKTtyZSgpO0QoKTtjbGFzcyBEbnt1cmw7d2Vic29ja2V0O2NvbnN0cnVjdG9yKGUpe3RoaXMudXJsPWV9Y29ubmVjdGVkKCl7cmV0dXJuIHRoaXMud2Vic29ja2V0IT09dm9pZCAwJiZ0aGlzLndlYnNvY2tldC5yZWFkeVN0YXRlPT09V2ViU29ja2V0Lk9QRU59YXN5bmMgY29ubmVjdChlLHQscj0oKT0+e30sbj0oKT0+e30pe2xldHt1cmw6c309dGhpcztpZih0aGlzLndlYnNvY2tldCl0aGlzLndlYnNvY2tldC5jbG9zZSgpLHRoaXMud2Vic29ja2V0PXZvaWQgMDtsZXQgbz1uZXcgTztvLndyaXRlU3RydWN0KGdlLGUpO2xldCBpPW8ucmVzdWx0KCksYz1ldChpKTtyZXR1cm4gcy5zZWFyY2hQYXJhbXMuc2V0KCJ0IixjKSx0aGlzLndlYnNvY2tldD1uZXcgV2ViU29ja2V0KHMpLHRoaXMud2Vic29ja2V0LmJpbmFyeVR5cGU9ImFycmF5YnVmZmVyIix0aGlzLndlYnNvY2tldC5vbm9wZW49KCk9Pntjb25zb2xlLmxvZygiQ09OTkVDVEVEIiksbigpfSx0aGlzLndlYnNvY2tldC5vbmNsb3NlPSgpPT57Y29uc29sZS5sb2coIkRJU0NPTk5FQ1RFRCIpLHRoaXMud2Vic29ja2V0PXZvaWQgMCxyKCl9LHRoaXMud2Vic29ja2V0Lm9ubWVzc2FnZT0odSk9PntsZXQgZD1uZXcgVWludDhBcnJheSh1LmRhdGEpO3QoZCl9LHRoaXMud2Vic29ja2V0Lm9uZXJyb3I9KHUpPT57Y29uc29sZS5sb2coYEVSUk9SOiAke0pTT04uc3RyaW5naWZ5KHUpfWApLHRoaXMud2Vic29ja2V0PXZvaWQgMCxyKCl9LFByb21pc2UucmVzb2x2ZSgwKX1kaXNjb25uZWN0KCl7dGhpcy53ZWJzb2NrZXQ/LmNsb3NlKCksdGhpcy53ZWJzb2NrZXQ9dm9pZCAwfX1DKCk7dmFyIHBlPXt1c2VyOntwYXRoOiIvdXNlciIsZW5kcG9pbnQ6SG8sbmFtZTowfSxwdXNoOntwYXRoOiIvcHVzaCIsZW5kcG9pbnQ6Um8sbmFtZToyfSxwZWVrOntwYXRoOiIvcGVlayIsZW5kcG9pbnQ6dm8sbmFtZToxfSxwdWxsOntwYXRoOiIvcHVsbCIsZW5kcG9pbnQ6Q28sbmFtZTozfX0sc2M9ezA6cGUudXNlciwyOnBlLnB1c2gsMTpwZS5wZWVrLDM6cGUucHVsbH0samY9e1twZS51c2VyLnBhdGhdOnBlLnVzZXIsW3BlLnB1c2gucGF0aF06cGUucHVzaCxbcGUucGVlay5wYXRoXTpwZS5wZWVrLFtwZS5wdWxsLnBhdGhdOnBlLnB1bGx9O2NsYXNzIFRve3VybDtsaXN0ZW5lcjtjb25zdHJ1Y3RvcihlKXt0aGlzLnVybD1lO3RoaXMubGlzdGVuZXI9bmV3IERuKGUpfWFzeW5jIGNhbGwoZSx0KXtsZXR7cGF0aDpyfT1zY1tlXSxuPW5ldyBVUkwocix0aGlzLnVybCk7dHJ5e3JldHVybiBhd2FpdCBvYyhuLHQpfWNhdGNoe3JldHVybiBhKDI1KX19fXZhciBLbz0oZSk9Pm5ldyBUbyhlLmhhbmRsZSk7YXN5bmMgZnVuY3Rpb24gb2MoZSx0KXtsZXQgcj1hd2FpdCBmZXRjaChlLHttZXRob2Q6IlBPU1QiLGJvZHk6dC5yZXN1bHQoKS5zbGljZSgpfSk7aWYoIXIub2spcmV0dXJuIGEoMjQpO2xldCBuPWF3YWl0IEwuZnJvbVJlc3BvbnNlKHIpO3JldHVybiBmKG4pfUMoKTtjbGFzcyBJcntjcnlwdG87Y2xvY2s7dHJhbnNwb3J0O3VwZGF0ZUhvc3RNZXRhOyNlO2NvbnN0cnVjdG9yKGUsdCxyLG4scyl7dGhpcy5jcnlwdG89dDt0aGlzLmNsb2NrPXI7dGhpcy50cmFuc3BvcnQ9bjt0aGlzLnVwZGF0ZUhvc3RNZXRhPXM7dGhpcy4jZT1lfWFzeW5jIGNhbGwoZSx0KXtsZXR7Y2xvY2s6cix0cmFuc3BvcnQ6bn09dGhpcyx7ZW5kcG9pbnQ6cyxuYW1lOm99PWUsW2ksY109YXdhaXQgdGhpcy5pZGVudGl0eSgpO2lmKGMhPT0wKXJldHVybiBhKGMpO2xldCB1PXIubm93KCksW2QsbF09YXdhaXQgWnIoaSx1KTtpZihsIT09MClyZXR1cm4gYShsKTtsZXQgcD1uZXcgTyx5PWF3YWl0IHMuZW5jb2RlUmVxKHRoaXMsaSxkLHQscCk7aWYoeSE9PTApcmV0dXJuIGEoeSk7bGV0IG09ci5ub3coKSxbaCxnXT1hd2FpdCBuLmNhbGwobyxwKSxTPXIubm93KCk7aWYoZyE9PTApcmV0dXJuIGEoZyk7bGV0W2IseF09aC5yZWFkU3RydWN0KHJuKTtpZih4IT09MClyZXR1cm4gYSh4KTtpZihiLnN0YXR1cyE9PTApcmV0dXJuIGEoYi5zdGF0dXMpO2xldCBQPXtjbG9ja09mZnNldDpOcyhtLGIudGltZVJjdmQsYi50aW1lU2VudCxTKSxzdWJzY3JpcHRpb246Yi5zdWJzY3JpcHRpb259LHc9YXdhaXQgdGhpcy51cGRhdGVIb3N0TWV0YShQKTtpZih3IT09MClyZXR1cm4gYSh3KTtyZXR1cm4gcy5kZWNvZGVSZXNwKGgpfWJhZ01nckZvcihlPXEpe3JldHVybiB0aGlzLiNlLmZpbmQoKHQpPT5fZShlLHQucmVhbG1LRE0pKX1iYWdNZ3JzKCl7cmV0dXJuIHRoaXMuI2V9YWRkKGUpe2lmKHRoaXMuYmFnTWdyRm9yKGUucmVhbG1LRE0pIT09dm9pZCAwKXJldHVybjt0aGlzLiNlLnB1c2goZSl9aWRlbnRpdHk9KCk9PntsZXQgZT10aGlzLmJhZ01nckZvcihxKT8/dGhpcy4jZVswXTtpZihlPT09dm9pZCAwKXJldHVybiBQcm9taXNlLnJlc29sdmUoYSgxMykpO3JldHVybiBQcm9taXNlLnJlc29sdmUoZihlKSl9O2hvc3RSbG09KGU9cSk9PntsZXQgdD10aGlzLmJhZ01nckZvcihlKTtpZih0PT09dm9pZCAwKXJldHVybiBQcm9taXNlLnJlc29sdmUoYSgxMykpO3JldHVybiBQcm9taXNlLnJlc29sdmUoZih0LnJsbSkpfTtzZWFsPWFzeW5jKGUsdD1xKT0+e2xldCByPXRoaXMuYmFnTWdyRm9yKHQpO2lmKHI9PT12b2lkIDApcmV0dXJuIGEoMTMpO3JldHVybiBxcyhlLHIsdGhpcy5jcnlwdG8pfTtyZWdpc3Rlcj0oKT0+dGhpcy5jYWxsKHBlLnVzZXIsdm9pZCAwKTtwZWVrPWFzeW5jKGUsdD1xKT0+e2xldFtyLG5dPWF3YWl0IHRoaXMuaG9zdFJsbSh0KTtpZihuIT09MClyZXR1cm4gYShuKTtyZXR1cm4gdGhpcy5jYWxsKHBlLnBlZWsse3JsbTpyLHNlcTplfSl9O3B1c2g9KGUpPT50aGlzLmNhbGwocGUucHVzaCxlKTtwdWxsPWFzeW5jKGUsdD1xKT0+e2xldFtyLG5dPWF3YWl0IHRoaXMuaG9zdFJsbSh0KTtpZihuIT09MClyZXR1cm4gYShuKTtyZXR1cm4gdGhpcy5jYWxsKHBlLnB1bGwse3JsbTpyLHNlcXM6ZX0pfTtsaXN0ZW49YXN5bmMoZSx0LHIpPT57bGV0e2Nsb2NrOm4sdHJhbnNwb3J0OnN9PXRoaXMse2xpc3RlbmVyOm99PXMsW2ksY109YXdhaXQgdGhpcy5pZGVudGl0eSgpO2lmKGMhPT0wKXJldHVybiBjO2xldCB1PW4ubm93KCksW2QsbF09YXdhaXQgWnIoaSx1KTtpZihsIT09MClyZXR1cm4gbDtyZXR1cm4gYXdhaXQgby5jb25uZWN0KGQsZSx0LHIpfTtpc0Nvbm5lY3RlZCgpe2xldCBlPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZihlJiZ0eXBlb2YgZS5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiBlLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19cmUoKTtyZSgpO0QoKTtDKCk7dmFyIGljPW5ldyBVaW50OEFycmF5KDApLGp0PXtlbmNvZGUoZSx0KXtpZih0LmJvZHkhPT12b2lkIDAmJiEodC5ib2R5IGluc3RhbmNlb2YgVWludDhBcnJheSkpcmV0dXJuIDEwO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LnBpZD8/aWMpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJTdHJpbmdzKHQudGFncz8/W10pO2lmKG4hPT0wKXJldHVybiBuO2lmKHQuYm9keSE9PXZvaWQgMCYmdC5ib2R5Lmxlbmd0aD4wKWUud3JpdGVCeXRlcyh0LmJvZHkpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXQgbjtpZih0Lmxlbmd0aD4wKXtsZXQgdT1uZXcgTCh0KSxbZCxsXT11LnJlYWRTdHJ1Y3QoYWUpO2lmKGwhPT0wKXJldHVybiBhKGwpO2lmKCF1LmRvbmUoKSlyZXR1cm4gYSgxNCk7bGV0W3AseV09ZnQoZCk7aWYoeSE9PTApcmV0dXJuIGEoeSk7bj1wfWxldFtzLG9dPWUucmVhZFZhclN0cmluZ3MoKTtpZihvIT09MClyZXR1cm4gYShvKTtsZXQgaT1lLnJlYWRSZXN0KCksYz17fTtpZihuIT09dm9pZCAwKWMucGlkPW47aWYocy5sZW5ndGg+MCljLnRhZ3M9cztpZihpLmxlbmd0aD4wKWMuYm9keT1pO3JldHVybiBmKGMpfX07ZnVuY3Rpb24gYnQoZSl7bGV0IHQ9bmV3IE8scj10LndyaXRlU3RydWN0KGp0LGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO3JldHVybiBmKHQucmVzdWx0KCkpfXR0KCk7RCgpO2ZlKCk7dmFyIG1wPVN5bWJvbCgiRG93bmxvYWRLZXkiKTtmdW5jdGlvbiB3cihlKXtpZihlPT09dm9pZCAwKXJldHVybiEwO3JldHVybiBlLmxhYmVsPT09cS5sYWJlbCYmZS5pbmRleD09PXEuaW5kZXh9ZnVuY3Rpb24gVm8oZSx0KXtyZXR1cm4gZS5sYWJlbD09PXQubGFiZWwmJmUuaW5kZXg9PT10LmluZGV4fWZ1bmN0aW9uIEl0KGUpe3JldHVybmAke2UubGFiZWx9XHgwMCR7ZS5pbmRleH1gfWZ1bmN0aW9uIFh0KGUsdD1xKXtpZih3cih0KSlyZXR1cm4gZS5sYXN0U2VxO3JldHVybiBlLnNlcXM/LmZpbmQoKG4pPT5uLmxhYmVsPT09dC5sYWJlbCYmbi5pbmRleD09PXQuaW5kZXgpPy5sYXN0U2VxPz8wfWZ1bmN0aW9uIHd0KGUpe2xldCB0PVtxXSxyPW5ldyBTZXQoW0l0KHEpXSksbj0ocyxvKT0+e2xldCBpPXM9PT0iIiYmbz09PTA/cTp7bGFiZWw6cyxpbmRleDpvfSxjPUl0KGkpO2lmKHIuaGFzKGMpKXJldHVybjtyLmFkZChjKSx0LnB1c2goaSl9O2ZvcihsZXQgcyBvZiBlKXtpZihuKHMubGFiZWwscy5pbmRleCkscy5wcmlvcj09PXZvaWQgMCljb250aW51ZTtmb3IobGV0IG8gb2Ygcy5wcmlvciluKHMubGFiZWwsbyl9cmV0dXJuIHR9ZnVuY3Rpb24geHIoZSx0KXtpZihlPT09dm9pZCAwfHxlPT09IiIpcmV0dXJuIHE7Zm9yKGxldCByIG9mIHQpaWYoci5sYWJlbD09PWUpcmV0dXJue2xhYmVsOnIubGFiZWwsaW5kZXg6ci5pbmRleH07cmV0dXJue2xhYmVsOmUsaW5kZXg6MH19ZnVuY3Rpb24gUHIoZSl7aWYod3IoZSkpcmV0dXJuO3JldHVybiBlfWZ1bmN0aW9uIEJuKGUsdCxyKXtsZXQgbj1yPz9xO3JldHVybiB3cihuKT9gJHtlfToke3R9YDpgJHtlfToke24ubGFiZWx9OiR7bi5pbmRleH06JHt0fWB9ZnVuY3Rpb24gTG8oZSx0KXtpZih0LnNldExhc3RTZXEhPT12b2lkIDApcmV0dXJuIHQuc2V0TGFzdFNlcTtpZih0Lmxhc3RTZXEhPT12b2lkIDAmJnQubGFzdFNlcT5lKXJldHVybiB0Lmxhc3RTZXE7cmV0dXJufWZ1bmN0aW9uIE9vKGUpe2xldCB0PTAscj1bXTtmb3IobGV0IG4gb2YgZSlpZih3cihuKSl0PW4ubGFzdFNlcTtlbHNlIHIucHVzaChuKTtpZihyLmxlbmd0aD09PTApcmV0dXJue2xhc3RTZXE6dH07cmV0dXJue2xhc3RTZXE6dCxzZXFzOnJ9fUQoKTtDKCk7ZnVuY3Rpb24gamUoZSl7aWYoZT09PXZvaWQgMClyZXR1cm4gZigiIik7aWYodHlwZW9mIGUhPT0ic3RyaW5nIilyZXR1cm4gYSgxMCk7cmV0dXJuIGYoZS50cmltKCkpfWZ1bmN0aW9uIHFvKGUsdCxyKXtsZXRbbixzXT1qZSh0KTtpZihzIT09MHx8bj09PXZvaWQgMClyZXR1cm4gYSgxMCk7aWYociYmZSE9PXZvaWQgMCYmZSE9PW4pcmV0dXJuIGEoMTApO3JldHVybiBmKG4pfWNlKCk7cmUoKTtEKCk7QygpO3JlKCk7RCgpO0MoKTtEKCk7QygpO3R0KCk7dmFyIHZuPXtlbmNvZGUoZSx0KXtpZighTnVtYmVyLmlzSW50ZWdlcih0Lm51bSl8fHQubnVtPDEpcmV0dXJuIDE0O2lmKHQuaHNoLmJ5dGVMZW5ndGghPT1xZSlyZXR1cm4gMTA7bGV0IHI9S3QuZW5jb2RlKGUsdC5yZWFsbSk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckludCh0Lm51bSk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIGUud3JpdGVCeXRlcyh0LmhzaCksMH0sZGVjb2RlKGUpe2xldFt0LHJdPUt0LmRlY29kZShlKTtpZihyIT09MClyZXR1cm4gYShyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gYShzKTtpZighTnVtYmVyLmlzSW50ZWdlcihuKXx8bjwxKXJldHVybiBhKDE0KTtsZXRbbyxpXT1lLnJlYWRCeXRlcyhxZSk7aWYoaSE9PTApcmV0dXJuIGEoaSk7cmV0dXJuIGYoe3JlYWxtOnQsbnVtOm4saHNoOm99KX19O2Z1bmN0aW9uIE1uKGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09eilyZXR1cm4gYSgxMCk7bGV0IHI9bmV3IE87ci53cml0ZUJ5dGVzKGUpO2xldCBuPU5vKHIsdCk7aWYobiE9PTApcmV0dXJuIGEobik7cmV0dXJuIGYoci5yZXN1bHQoKSl9dmFyIHh0PXtlbmNvZGUoZSx0KXtpZih0Lm5vbmNlLmJ5dGVMZW5ndGghPT16KXJldHVybiAxMDtpZih0LmhzaC5ieXRlTGVuZ3RoIT09cWUpcmV0dXJuIDEwO2lmKHQuc2lnLmJ5dGVMZW5ndGghPT1CZSlyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQubm9uY2UpO2xldCByPU5vKGUsdC5yZWFsbXMpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiBlLndyaXRlQnl0ZXModC5oc2gpLGUud3JpdGVCeXRlcyh0LnNpZyksMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKHopO2lmKHIhPT0wKXJldHVybiBhKHIpO2xldFtuLHNdPWFjKGUpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldFtvLGldPWUucmVhZEJ5dGVzKHFlKTtpZihpIT09MClyZXR1cm4gYShpKTtsZXRbYyx1XT1lLnJlYWRCeXRlcyhCZSk7aWYodSE9PTApcmV0dXJuIGEodSk7cmV0dXJuIGYoe25vbmNlOnQscmVhbG1zOm4saHNoOm8sc2lnOmN9KX19O2Z1bmN0aW9uIE5vKGUsdCl7bGV0IHI9ZS53cml0ZVZhckludCh0Lmxlbmd0aCk7aWYociE9PTApcmV0dXJuIHI7Zm9yKGxldCBuIG9mIHQpe2xldCBzPXZuLmVuY29kZShlLG4pO2lmKHMhPT0wKXJldHVybiBzfXJldHVybiAwfWZ1bmN0aW9uIGFjKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBhKHIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKHQpfHx0PDB8fHQ+ZS5yZW1haW5pbmcoKSlyZXR1cm4gYSgxNCk7bGV0IG49W107Zm9yKGxldCBzPTA7czx0O3MrKyl7bGV0W28saV09dm4uZGVjb2RlKGUpO2lmKGkhPT0wKXJldHVybiBhKGkpO24ucHVzaChvKX1yZXR1cm4gZihuKX12YXIgX289e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVTdHJ1Y3QoeHQsdC5oZWFkKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gZS53cml0ZUJ5dGVzKHQuY2h1bmtzKSwwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KHh0KTtpZihyIT09MClyZXR1cm4gYShyKTtyZXR1cm4gZih7aGVhZDp0LGNodW5rczplLnJlYWRSZXN0KCl9KX19O0QoKTtDKCk7dmFyIENuPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiBlLndyaXRlVmFySW50KHQubGVuQm9keSl9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyhPZSk7aWYociE9PTApcmV0dXJuIGEocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gYShzKTtsZXRbbyxpXT1lLnJlYWRWYXJJbnQoKTtpZihpIT09MClyZXR1cm4gYShpKTtyZXR1cm4gZih7a2RtOnQsaGVhZENwaDpuLGxlbkJvZHk6b30pfX07dHQoKTtEKCk7QygpO2ZlKCk7RCgpO0MoKTtVbigpO2ZlKCk7Um4oKTthc3luYyBmdW5jdGlvbiBHbyhlLHQpe2xldFtyLG5dPWF3YWl0IG9lKHtwYXJlbnQ6ZSxwdXJwb3NlOlkuSWRlbnRpdHksa2RtOnF9KTtpZihuIT09MClyZXR1cm4gYShuKTtsZXRbcyxvXT1hd2FpdCBvZSh7cGFyZW50OmUscHVycG9zZTpZLlJlYWxtS2V5LGtkbTp0fSk7aWYobyE9PTApcmV0dXJuIHIuZmlsbCgwKSxhKG8pO2xldFtpLGNdPWF3YWl0IG9lKHtwYXJlbnQ6ZSxwdXJwb3NlOlkuUmVhbG1JRCxrZG06dH0pO2lmKGMhPT0wKXJldHVybiByLmZpbGwoMCkscy5maWxsKDApLGEoYyk7dHJ5e2xldFt1LGRdPWF3YWl0IEVyKGkscSk7aWYoZCE9PTApcmV0dXJuIHIuZmlsbCgwKSxzLmZpbGwoMCksYShkKTtyZXR1cm4gWGUuaW5pdChyLHMsdSxxLHQpfWZpbmFsbHl7aS5maWxsKDApfX12YXIgR3Q7KChRbyk9PntRby5kZWZhdWx0RmlsZUV4dGVuc2lvbj0iZHBsIjtmdW5jdGlvbiB0KGMpe2xldFt1LGRdPXh0LmRlY29kZShuZXcgTChjKSk7aWYoZCE9PTApcmV0dXJuIGEoZCk7cmV0dXJuIGYodS5ub25jZSl9UW8uZXhwb3J0Tm9uY2U9dDthc3luYyBmdW5jdGlvbiByKGMsdSxkLGwpe3JldHVybiBzKGMsdSxkLGwpfVFvLnNlYWxFeHBvcnQ9cjthc3luYyBmdW5jdGlvbiBuKGMsdSxkKXtsZXQgbD1hd2FpdCB1LmdlblJhbmRvbUJ5dGVzKHopLFtwLHldPWF3YWl0IGMuZXhwb3J0S2V5KGwpO2lmKHkhPT0wKXJldHVybiBhKHkpO3RyeXtyZXR1cm4gYXdhaXQgcyhkLHUscCxsKX1maW5hbGx5e3AuZmlsbCgwKX19UW8uZXhwb3J0RmlsZT1uO2FzeW5jIGZ1bmN0aW9uIHMoYyx1LGQsbCl7aWYobC5ieXRlTGVuZ3RoIT09eilyZXR1cm4gYSgxMCk7bGV0IHA9JG8oZCksW3ksbV09YXdhaXQgcChxKTtpZihtIT09MClyZXR1cm4gYShtKTtsZXQgaD1uZXcgTyxnPVtdO2ZvcihsZXQgdiBvZiBjKXtpZih2Lm1zZ3MubGVuZ3RoPDEpcmV0dXJuIGEoMTQpO2xldFtVLFRdPWF3YWl0IHAodi5yZWFsbSk7aWYoVCE9PTApcmV0dXJuIGEoVCk7bGV0W1IsVl09YXdhaXQgbGMoaCx2LFUpO2lmKFYhPT0wKXJldHVybiBhKFYpO2xldCBIPWF3YWl0IHUuYmxha2UzKFIpO2cucHVzaCh7cmVhbG06di5yZWFsbSxudW06di5tc2dzLmxlbmd0aCxoc2g6SH0pfWxldFtTLGJdPU1uKGwsZyk7aWYoYiE9PTApcmV0dXJuIGEoYik7bGV0IHg9YXdhaXQgdS5ibGFrZTMoUyksW0UsUF09YXdhaXQgeS5zaWduKHgpO2lmKFAhPT0wKXJldHVybiBhKFApO2xldCB3PW5ldyBPLGs9dy53cml0ZVN0cnVjdCh4dCx7bm9uY2U6bCxyZWFsbXM6Zyxoc2g6eCxzaWc6RX0pO2lmKGshPT0wKXJldHVybiBhKGspO3JldHVybiBoLnByZXBlbmRCeXRlcyh3LnJlc3VsdCgpKSxmKGgucmVzdWx0KCkpfVFvLmVuY29kZUZpbGU9czthc3luYyBmdW5jdGlvbiBvKGMsdSxkKXtsZXRbbCxwXT1fby5kZWNvZGUobmV3IEwoYykpO2lmKHAhPT0wKXJldHVybiBhKHApO2xldHtoZWFkOnksY2h1bmtzOm19PWwsaD0kbyhkKSxbZyxTXT1hd2FpdCBoKHEpO2lmKFMhPT0wKXJldHVybiBhKFMpO2xldCBiO3RyeXtiPWF3YWl0IHUuaW1wb3J0VmVyaWZ5S2V5KGcucHVibGljS2V5KX1jYXRjaHtyZXR1cm4gYSgyOSl9aWYoIWF3YWl0IHUuY2hlY2tTaWdFZDI1NTE5KHkuc2lnLHkuaHNoLGIpKXJldHVybiBhKDMpO2xldFtFLFBdPU1uKHkubm9uY2UseS5yZWFsbXMpO2lmKFAhPT0wKXJldHVybiBhKFApO2xldCB3PWF3YWl0IHUuYmxha2UzKEUpO2lmKCFHKHcseS5oc2gpKXJldHVybiBhKDE5KTtsZXQgaz1uZXcgTChtKSx2PVtdO2ZvcihsZXQgVSBvZiB5LnJlYWxtcyl7bGV0W1QsUl09YXdhaXQgaChVLnJlYWxtKTtpZihSIT09MClyZXR1cm4gYShSKTtsZXRbVixIXT1hd2FpdCBmYyhrLG0sVSx1LFQpO2lmKEghPT0wKXJldHVybiBhKEgpO3YucHVzaCh7cmVhbG06VS5yZWFsbSxtc2dzOlZ9KX1pZighay5kb25lKCkpcmV0dXJuIGEoMTQpO3JldHVybiBmKHYpfVFvLmRlY29kZUZpbGU9bzthc3luYyBmdW5jdGlvbiBpKGMsdSxkLGwscCx5KXtsZXRbbSxoXT1hd2FpdCBvKGMsdSxkKTtpZihoIT09MClyZXR1cm4gYShoKTtsZXQgZz1hd2FpdCB5KG0pO3JldHVybiBzKGcsdSxsLHApfVFvLm1pZ3JhdGVGaWxlPWl9KShHdHx8PXt9KTtmdW5jdGlvbiAkbyhlKXtsZXQgdD1bXTtyZXR1cm4gYXN5bmMocik9Pntmb3IobGV0IG8gb2YgdClpZihfZShvLnJlYWxtLHIpKXJldHVybiBmKG8uYmFnTWdyKTtsZXRbbixzXT1hd2FpdCBHbyhlLHIpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiB0LnB1c2goe3JlYWxtOnIsYmFnTWdyOm59KSxmKG4pfX12YXIgdWM9NDA7ZnVuY3Rpb24gZGMoZSl7bGV0IHQ9ZS5ib2R5O2lmKHQ9PT12b2lkIDB8fGUuaGVhZC5sZW48PTB8fGUuaGVhZC5oc2g9PT12b2lkIDApcmV0dXJuIDA7cmV0dXJuIHQubGVuZ3RoK3VjfWFzeW5jIGZ1bmN0aW9uIGxjKGUsdCxyKXtpZih0Lm1zZ3MubGVuZ3RoPDEpcmV0dXJuIGEoMTQpO2xldCBuPW5ldyBPLHM9W107Zm9yKGxldCBpIG9mIHQubXNncyl7bGV0IGM9bmV3IE8sdT1jLndyaXRlU3RydWN0KEllLGkuaGVhZCk7aWYodSE9PTApcmV0dXJuIGEodSk7bGV0IGQ9Yy5yZXN1bHQoKSxbbCxwXT1hd2FpdCByLmJhZ0tETShkKTtpZihwIT09MClyZXR1cm4gYShwKTtsZXRbeSxtXT1hd2FpdCByLmVuY3J5cHQobCxkKTtpZihtIT09MClyZXR1cm4gYShtKTtsZXQgaD1uLndyaXRlU3RydWN0KENuLHtrZG06bCxoZWFkQ3BoOnksbGVuQm9keTpkYyhpKX0pO2lmKGghPT0wKXJldHVybiBhKGgpO3MucHVzaChsKX1sZXQgbz1uLnJlc3VsdCgpO2Uud3JpdGVCeXRlcyhvKTtmb3IobGV0IGk9MDtpPHQubXNncy5sZW5ndGg7aSsrKXtsZXQgYz10Lm1zZ3NbaV0sdT1zW2ldO2lmKGM9PT12b2lkIDB8fHU9PT12b2lkIDApcmV0dXJuIGEoMTIpO2xldCBkPWMuYm9keTtpZihkPT09dm9pZCAwfHxjLmhlYWQubGVuPD0wfHxjLmhlYWQuaHNoPT09dm9pZCAwKWNvbnRpbnVlO2xldFtsLHBdPWF3YWl0IHIuZW5jcnlwdCh1LGQpO2lmKHAhPT0wKXJldHVybiBhKHApO2Uud3JpdGVCeXRlcyhsKX1yZXR1cm4gZihvKX1hc3luYyBmdW5jdGlvbiBmYyhlLHQscixuLHMpe2xldCBvPWUuY29uc3VtZWQoKSxpPVtdO2ZvcihsZXQgZD0wO2Q8ci5udW07ZCsrKXtsZXRbbCxwXT1lLnJlYWRTdHJ1Y3QoQ24pO2lmKHAhPT0wKXJldHVybiBhKHApO2kucHVzaChsKX1sZXQgYz1hd2FpdCBuLmJsYWtlMyh0LnN1YmFycmF5KG8sZS5jb25zdW1lZCgpKSk7aWYoIUcoYyxyLmhzaCkpcmV0dXJuIGEoMTkpO2xldCB1PVtdO2ZvcihsZXQgZCBvZiBpKXtsZXRbbCxwXT1hd2FpdCBzLmRlY3J5cHQoZC5rZG0sZC5oZWFkQ3BoKTtpZihwIT09MClyZXR1cm4gYShwKTtsZXRbeSxtXT1JZS5kZWNvZGUobmV3IEwobCkpO2lmKG0hPT0wKXJldHVybiBhKG0pO2lmKGQubGVuQm9keTwwKXJldHVybiBhKDE0KTtpZihkLmxlbkJvZHk9PT0wKXt1LnB1c2goe2hlYWQ6eX0pO2NvbnRpbnVlfWlmKHkuaHNoPT09dm9pZCAwKXJldHVybiBhKDE0KTtsZXRbaCxnXT1lLnJlYWRCeXRlcyhkLmxlbkJvZHkpO2lmKGchPT0wKXJldHVybiBhKGcpO2xldFtTLGJdPWF3YWl0IHMuZGVjcnlwdChkLmtkbSxoKTtpZihiIT09MClyZXR1cm4gYShiKTtsZXQgeD1hd2FpdCBuLmJsYWtlMyhTKTtpZighRyh4LHkuaHNoKSlyZXR1cm4gYSgxOSk7dS5wdXNoKHtoZWFkOnksYm9keTpTfSl9cmV0dXJuIGYodSl9cmUoKTtEKCk7QygpO2FzeW5jIGZ1bmN0aW9uIHpvKHtub3c6ZSxib2Q6dCxjcnlwdG86cix0eXA6bj0iIn0pe2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCksbz1uZXcgTyxpPW8ud3JpdGVTdHJ1Y3QoYWUse2lkOnMsdHM6ZX0pO2lmKGkhPT0wKXJldHVybiBhKGkpO2xldCBjPW8ucmVzdWx0KCk7cmV0dXJuIEFyKHtub3c6ZSxlaWQ6YyxjdHI6MCx0eXA6bixib2Q6dCxjcnlwdG86cn0pfWFzeW5jIGZ1bmN0aW9uIEFyKHtub3c6ZSxlaWQ6dCxjdHI6cix0eXA6bj0iIixib2Q6cyxjcnlwdG86b30pe2xldCBpPW5ldyBMKHQpLFtjLHVdPWFlLmRlY29kZShpKTtpZih1IT09MClyZXR1cm4gYSh1KTtsZXQgZD1lLmdldFRpbWUoKS1jLnRzLmdldFRpbWUoKSxsLHA9cz8ubGVuZ3RoPz8wO2lmKHMmJnA+MClsPWF3YWl0IG8uYmxha2UzKHMpO3JldHVybiBmKHtlaWQ6dCxvZmY6ZCxjdHI6cix0eXA6bixsZW46cCxoc2g6bH0pfWNlKCk7cmUoKTtEKCk7QygpO2Z1bmN0aW9uIHBjKGUsdCl7bGV0IHI9ZS5sZW5ndGg8dC5sZW5ndGg/ZS5sZW5ndGg6dC5sZW5ndGg7Zm9yKGxldCBuPTA7bjxyO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4gZVtuXS10W25dO3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH1hc3luYyBmdW5jdGlvbiBRdChlLHQpe2xldCByPUFycmF5LmZyb20oZSk7ci5zb3J0KHBjKTtsZXQgbj0wO2ZvcihsZXQgaSBvZiByKW4rPWkubGVuZ3RoO2xldCBzPW5ldyBVaW50OEFycmF5KG4pLG89MDtmb3IobGV0IGkgb2YgcilzLnNldChpLG8pLG8rPWkubGVuZ3RoO3JldHVybiB0LmJsYWtlMyhzKX1mdW5jdGlvbiB5YyhlKXtsZXQgdD1uZXcgTyxyPXQud3JpdGVWYXJCeXRlcyhlLmVpZCk7aWYociE9PTApcmV0dXJuIGEocik7bGV0IG49dC53cml0ZURhdGUoZS51cGRhdGVkQXQpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldCBzPXQud3JpdGVWYXJJbnQoZS5jdHIpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKHQucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIGtyKGUsdCl7bGV0IHI9W107Zm9yKGxldCBuIG9mIGUpe2xldFtzLG9dPXljKG4pO2lmKG8hPT0wfHwhcylyZXR1cm4gYShvKTtyLnB1c2gocyl9cmV0dXJuIGYoYXdhaXQgUXQocix0KSl9cmUoKTtEKCk7QygpOyR0KCk7dmFyIEF5PVN5bWJvbCgiRW50aXR5SUQiKTtmdW5jdGlvbiBKbyhlKXtyZXR1cm4idHlwZSJpbiBlfXZhciBreT1TeW1ib2woIkRlcml2YXRpb25TZWVkIiksRHk9U3ltYm9sKCJQdWJsaWNLZXkiKSxCeT1TeW1ib2woIlByaXZhdGVLZXkiKSx2eT1TeW1ib2woIkhvc3RTcGVjaWZpY0tleVBhaXIiKSxNeT1TeW1ib2woIkhhc2giKTtyZSgpO0QoKTtDKCk7ZnVuY3Rpb24gbWMoZSl7aWYoIWUuYm9kfHxlLmJvZC5sZW5ndGg9PT0wKXtsZXQgbz17b2ZmOmUub2ZmLGN0cjplLmN0cixlaWQ6ZS5laWR9O3JldHVybiBmKG8pfWxldCB0PW5ldyBMKGUuYm9kKSxbcixuXT10LnJlYWRTdHJ1Y3QoanQpO2lmKG4hPT0wKXJldHVybiBhKG4pO2xldCBzPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZCx0eXBlOmUudHlwPz8iIixib2R5OnIuYm9keX07aWYoci5waWQhPT12b2lkIDApcy5waWQ9ci5waWQ7aWYoci50YWdzIT09dm9pZCAwKXMudGFncz1yLnRhZ3M7cmV0dXJuIGYocyl9Y2xhc3MgRHJ7YXBwbGllcjtlbWl0dGVyPW5ldyBIdDtjbGVhcmVyO29uRGlydHlFaWRzO2NhY2hlRHJpdmVuO3BlZXJJbmdlc3Q7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5hcHBsaWVyPWU7dGhpcy5jbGVhcmVyPXQsdGhpcy5vbkRpcnR5RWlkcz1yLHRoaXMuY2FjaGVEcml2ZW49bj8uY2FjaGVEcml2ZW4/PyExLHRoaXMucGVlckluZ2VzdD1uPy5wZWVySW5nZXN0fWFwcGx5PWFzeW5jKGUpPT57bGV0IHQ9W10scj1bXTtmb3IobGV0IGMgb2YgZSl7bGV0W3UsZF09bWMoYyk7aWYoci5wdXNoKGQpLGQhPT0wKWNvbnRpbnVlO3QucHVzaCh1KX1sZXR7c3RhdHM6bix0eXBlczpzLGVpZHM6b309YXdhaXQgdGhpcy5hcHBsaWVyKHQpLGk9W107Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2xldCB1PXJbY10sZD1uW2NdO2lmKHUhPT0wKXtpLnB1c2godSk7Y29udGludWV9aWYoZCE9PTApe2kucHVzaChkKTtjb250aW51ZX1pLnB1c2goMCl9aWYoIXRoaXMuY2FjaGVEcml2ZW4pZm9yKGxldCBjIG9mIHMpdGhpcy5lbWl0dGVyLmVtaXQoYyxudWxsKTtpZihvLmxlbmd0aD4wKXRoaXMub25EaXJ0eUVpZHM/LihvKTtyZXR1cm4gaX07Y2xlYXI9YXN5bmMoKT0+e2xldCBlPWF3YWl0IHRoaXMuY2xlYXJlcigpO2lmKGUhPT0wKXJldHVybiBlO3JldHVybiB0aGlzLmVtaXR0ZXIuZW1pdEFsbChudWxsKSxlfTtub3RpZnk9KGUpPT57Zm9yKGxldCB0IG9mIGUpdGhpcy5lbWl0dGVyLmVtaXQodCxudWxsKX07cmVmcmVzaD1hc3luYyhlKT0+e2lmKHRoaXMucGVlckluZ2VzdCl7YXdhaXQgdGhpcy5wZWVySW5nZXN0KGUpO3JldHVybn19O29uPShlLHQpPT57dGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoZSx0KX07b2ZmPShlLHQpPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KX19ZnVuY3Rpb24gWihlKXtyZXR1cm4idHlwZSJpbiBlfWZ1bmN0aW9uIGhjKGUsdCl7bGV0IHI9dC5leGNsdWRlU3RhcnQ/ZT50LnN0YXJ0OmU+PXQuc3RhcnQsbj10LmV4Y2x1ZGVFbmQ/ZTx0LmVuZDplPD10LmVuZDtyZXR1cm4gciYmbn1mdW5jdGlvbiB6dChlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZighMCk7aWYoZS5yYW5nZS5zdGFydD5lLnJhbmdlLmVuZClyZXR1cm4gYSgxMCk7cmV0dXJuIGYoITApfWZ1bmN0aW9uIEhuKGUsdCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7cmV0dXJuIGhjKGUsdC5yYW5nZSl9ZnVuY3Rpb24gZ2MoZSx0KXtsZXQgcj10LmV4Y2x1ZGVTdGFydD9lPnQuc3RhcnQ6ZT49dC5zdGFydCxuPXQuZXhjbHVkZUVuZD9lPHQuZW5kOmU8PXQuZW5kO3JldHVybiByJiZufWZ1bmN0aW9uIFl0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpcmV0dXJuIGYoZS5sZW5ndGg+MCk7aWYoInJhbmdlImluIGUpe2lmKGUucmFuZ2Uuc3RhcnQ+ZS5yYW5nZS5lbmQpcmV0dXJuIGEoMTApO3JldHVybiBmKCEwKX1yZXR1cm4gZihlLnByZWZpeC5sZW5ndGg+MCl9ZnVuY3Rpb24gVG4oZSx0KXtpZih0eXBlb2YgdD09PSJzdHJpbmciKXJldHVybiBlPT09dDtpZigicmFuZ2UiaW4gdClyZXR1cm4gZ2MoZSx0LnJhbmdlKTtpZih0LnByZWZpeC5sZW5ndGg9PT0wKXJldHVybiExO3JldHVybiBlLnN0YXJ0c1dpdGgodC5wcmVmaXgpfWZ1bmN0aW9uIFNjKGUpe2lmKCFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PW5ldyBTZXQscj1bXTtmb3IobGV0IG4gb2YgZSl7aWYodHlwZW9mIG4hPT0ic3RyaW5nInx8bi5sZW5ndGg9PT0wKWNvbnRpbnVlO2lmKHQuaGFzKG4pKWNvbnRpbnVlO3QuYWRkKG4pLHIucHVzaChuKX1yZXR1cm4gci5sZW5ndGg+MD9yOnZvaWQgMH1mdW5jdGlvbiBCcihlKXtyZXR1cm57ZWlkOmUuZWlkLGN0cjplLmN0cix1cGRhdGVkQXQ6ZS51cGRhdGVkQXR9fWZ1bmN0aW9uIFpvKGUpe2xldCB0PW5ldyBMKGUuZWlkKSxbcixuXT10LnJlYWRTdHJ1Y3QoYWUpO2lmKG4hPT0wKXJldHVybiBhKG4pO3JldHVybiBmKHtlaWQ6ZS5laWQsY3RyOmUuY3RyLHVwZGF0ZWRBdDpuZXcgRGF0ZShyLnRzLmdldFRpbWUoKStlLm9mZil9KX1mdW5jdGlvbiBQdChlLHQpe2xldCByPW5ldyBMKHQuZWlkKSxbbixzXT1yLnJlYWRTdHJ1Y3QoYWUpO2lmKHMhPT0wKXJldHVybiBhKHMpO2xldCBvPW5ldyBEYXRlKG4udHMuZ2V0VGltZSgpK3Qub2ZmKTtpZihlIT09dm9pZCAwJiZvPD1lLnVwZGF0ZWRBdClyZXR1cm4gYSgxNSk7aWYoSm8odCkpe2xldCBpPVNjKHQudGFncyk7cmV0dXJuIGYoe2VpZDp0LmVpZCxwaWQ6dC5waWQsLi4uaSE9PXZvaWQgMD97dGFnczppfTp7fSx0eXBlOnQudHlwZSxjcmVhdGVkQXQ6bi50cyx1cGRhdGVkQXQ6byxjdHI6dC5jdHIsYm9keTp0LmJvZHl9KX1yZXR1cm4gZih7ZWlkOnQuZWlkLHVwZGF0ZWRBdDpvLGN0cjp0LmN0cn0pfWZ1bmN0aW9uIEV0KGUsdCl7bGV0IHI9bmV3IFNldDtpZihlIT09dm9pZCAwJiZaKGUpKXIuYWRkKGUudHlwZSk7aWYoWih0KSlyLmFkZCh0LnR5cGUpO3JldHVyblsuLi5yXX1DKCk7Y2xhc3MgdnJ7aW5mbGlnaHQ9bnVsbDthZ2Fpbj0hMTtydW4oZSl7aWYodGhpcy5hZ2Fpbj0hMCx0aGlzLmluZmxpZ2h0KXJldHVybiB0aGlzLmluZmxpZ2h0O3JldHVybiB0aGlzLmluZmxpZ2h0PXRoaXMuZHJhaW4oZSksdGhpcy5pbmZsaWdodH1hc3luYyBmbHVzaCgpe2lmKCF0aGlzLmluZmxpZ2h0KXJldHVybjt0cnl7YXdhaXQgdGhpcy5pbmZsaWdodH1jYXRjaHt9fWFzeW5jIGRyYWluKGUpe3RyeXt0aGlzLmFnYWluPSExO2xldCB0PWF3YWl0IGUoKTt3aGlsZSh0aGlzLmFnYWluKXRoaXMuYWdhaW49ITEsdD1hd2FpdCBlKCk7cmV0dXJuIHR9ZmluYWxseXt0aGlzLmluZmxpZ2h0PW51bGx9fX12YXIgZWk9MTAwO2NsYXNzIEtue3RpbWVyPW51bGw7ZGVsYXlNczt3b3JrO3RhaWw9bmV3IHZyO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kZWxheU1zPWU8MD8wOmUsdGhpcy53b3JrPXR9c2NoZWR1bGUoKXtpZih0aGlzLmRlbGF5TXM8PTApe3RoaXMuZmlyZSgpO3JldHVybn1pZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lcik7dGhpcy50aW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy50aW1lcj1udWxsLHRoaXMuZmlyZSgpfSx0aGlzLmRlbGF5TXMpfWFzeW5jIGZsdXNoKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKTthd2FpdCB0aGlzLnRhaWwuZmx1c2goKX1jYW5jZWwoKXtpZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj1udWxsfWZpcmUoKXtyZXR1cm4gdGhpcy50YWlsLnJ1bih0aGlzLndvcmspfX12YXIgdGk9ITE7ZnVuY3Rpb24gcmkoZSl7dGk9ZT09PSEwfWZ1bmN0aW9uIFcoZSx0KXtpZighdGkpcmV0dXJuO2xldCByPU1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpO2lmKHQhPT12b2lkIDApY29uc29sZS53YXJuKGBbZGlwICR7cn1tc10gJHtlfWAsdCk7ZWxzZSBjb25zb2xlLndhcm4oYFtkaXAgJHtyfW1zXSAke2V9YCl9cmUoKTtEKCk7ZnVuY3Rpb24gbmkoZSl7bGV0IHQ9bmV3IEwoZS5laWQpLFtyLG5dPWFlLmRlY29kZSh0KTtpZihuIT09MClyZXR1cm47cmV0dXJuIHIudHMuZ2V0VGltZSgpK2Uub2ZmfWZ1bmN0aW9uIGJjKGUsdCl7bGV0IHI9bmkoZSksbj1uaSh0KTtpZihyPT09dm9pZCAwJiZuPT09dm9pZCAwKXJldHVybiAwO2lmKHI9PT12b2lkIDApcmV0dXJuIDE7aWYobj09PXZvaWQgMClyZXR1cm4tMTtpZihuIT09cilyZXR1cm4gbi1yO3JldHVybiB0LmN0ci1lLmN0cn1mdW5jdGlvbiBBdChlLHQpe3JldHVybiBlLnNsaWNlKCkuc29ydCgocixuKT0+YmModChyKSx0KG4pKSl9dmFyIFZuPXtwaGFzZToiaWRsZSJ9LEp0PTUwO2Z1bmN0aW9uIExuKGUsdCxyKXtpZihlPD0wfHx0PD0wKXJldHVybiExO2lmKGU9PT0xfHxlPT09dClyZXR1cm4hMDtyZXR1cm4gZSVyPT09MH1yZSgpO0QoKTtDKCk7dmFyIE9uPSJibG9iOiI7ZnVuY3Rpb24gc2koZSl7cmV0dXJuIE9uK2V9ZnVuY3Rpb24gb2koZSl7cmV0dXJuIGUhPT12b2lkIDAmJmUuc3RhcnRzV2l0aChPbil9ZnVuY3Rpb24gSWMoZSl7aWYoIW9pKGUpKXJldHVybjtsZXQgdD1lLnNsaWNlKE9uLmxlbmd0aCk7aWYodC5sZW5ndGg9PT0wKXJldHVybjtyZXR1cm4gdH1mdW5jdGlvbiBpaShlKXtyZXR1cm4gbmV3IEwoZSkucmVhZFN0cnVjdChqdCl9ZnVuY3Rpb24gd2MoZSx0KXtsZXQgcj17fTtpZihlIT09dm9pZCAwJiZlLnBpZCE9PXZvaWQgMClyLnBpZD1lLnBpZDtpZihlIT09dm9pZCAwJiZlLnRhZ3MhPT12b2lkIDAmJmUudGFncy5sZW5ndGg+MClyLnRhZ3M9ZS50YWdzO2lmKHQubGVuZ3RoPjApci5ib2R5PXQ7cmV0dXJuIHJ9ZnVuY3Rpb24geGMoZSx0LHIpe2xldCBuPXt9LHM9ciE9PXZvaWQgMCYmT2JqZWN0Lmhhc093bihyLCJwaWQiKT9yLnBpZDplLnBpZCxvPXIhPT12b2lkIDAmJk9iamVjdC5oYXNPd24ociwidGFncyIpP3IudGFnczplLnRhZ3M7aWYocyE9PXZvaWQgMCluLnBpZD1zO2lmKG8hPT12b2lkIDAmJm8ubGVuZ3RoPjApbi50YWdzPW87aWYodC5sZW5ndGg+MCluLmJvZHk9dDtyZXR1cm4gbn1mdW5jdGlvbiBQYyhlKXtsZXQgdD1uZXcgTChlLmVpZCksW3Isbl09dC5yZWFkU3RydWN0KGFlKTtpZihuIT09MClyZXR1cm4gYShuKTtyZXR1cm4gZih7ZWlkOmUuZWlkLGN0cjplLmN0cix1cGRhdGVkQXQ6bmV3IERhdGUoci50cy5nZXRUaW1lKCkrZS5vZmYpfSl9ZnVuY3Rpb24gYWkoZSx0LHIpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4gYSgxMCk7bGV0W24sc109YnQod2Mocix0KSk7aWYocyE9PTApcmV0dXJuIGEocyk7cmV0dXJuIGYoe3R5cDpzaShlKSxib2Q6bn0pfWZ1bmN0aW9uIGNpKGUsdCxyKXtpZihlPT09dm9pZCAwfHxlLmJvZD09PXZvaWQgMHx8ZS5ib2QubGVuZ3RoPT09MClyZXR1cm4gYSgxMyk7bGV0IG49SWMoZS50eXApO2lmKG49PT12b2lkIDApcmV0dXJuIGEoMTApO2xldFtzLG9dPVBjKGUpO2lmKG8hPT0wKXJldHVybiBhKG8pO2xldFtpLGNdPWlpKGUuYm9kKTtpZihjIT09MClyZXR1cm4gYShjKTtsZXQgdT1yPy5taW1lPz9uO2lmKHUubGVuZ3RoPT09MClyZXR1cm4gYSgxMCk7bGV0W2QsbF09YnQoeGMoaSx0LHIpKTtpZihsIT09MClyZXR1cm4gYShsKTtyZXR1cm4gZih7dHlwOnNpKHUpLGJvZDpkLHByaW9yOnN9KX1mdW5jdGlvbiB1aShlKXtpZihlPT09dm9pZCAwfHxlLmJvZD09PXZvaWQgMHx8ZS5ib2QubGVuZ3RoPT09MClyZXR1cm4gYSgxMyk7aWYoIW9pKGUudHlwKSlyZXR1cm4gYSgxMyk7bGV0W3Qscl09aWkoZS5ib2QpO2lmKHIhPT0wKXJldHVybiBhKHIpO2lmKHQuYm9keT09PXZvaWQgMClyZXR1cm4gZihuZXcgVWludDhBcnJheSk7cmV0dXJuIGYodC5ib2R5LnNsaWNlKCkpfWZ1bmN0aW9uIGRpKGUsdCl7aWYodHlwZW9mIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iPT09ImZ1bmN0aW9uIil7bmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoZSx0KTtyZXR1cm59bGV0IHI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtuLmhyZWY9cixuLmRvd25sb2FkPXQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSxuLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKSxVUkwucmV2b2tlT2JqZWN0VVJMKHIpfWZ1bmN0aW9uIGxpKGUsdCxyKXtsZXQgbj1bXSxzPVtdLG89MDtmb3IobGV0IGkgb2YgZSl7bGV0IGM9dChpKTtpZihzLmxlbmd0aD4wJiZvK2M+ciluLnB1c2gocykscz1bXSxvPTA7aWYocy5wdXNoKGkpLG8rPWMsbz49ciluLnB1c2gocykscz1bXSxvPTB9aWYocy5sZW5ndGg+MCluLnB1c2gocyk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gcW4oZSx0LHIpe2xldCBuPWUubGVuZ3RoO2lmKG48MSlyZXR1cm5bXTtsZXQgcz1BcnJheShuKSxvPTAsaT1NYXRoLm1pbihNYXRoLm1heCgxLHQpLG4pLGM9YXN5bmMoKT0+e3doaWxlKCEwKXtsZXQgZD1vO2lmKG8rPTEsZD49bilyZXR1cm47c1tkXT1hd2FpdCByKGVbZF0sZCl9fSx1PVtdO2ZvcihsZXQgZD0wO2Q8aTtkKyspdS5wdXNoKGMoKSk7cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHUpLHN9cmUoKTt0dCgpO0QoKTtmZSgpO3JlKCk7RCgpO0MoKTthc3luYyBmdW5jdGlvbiBNcihlLHQscixuKXtsZXQgcz1yLnJsbTtpZihzLmJ5dGVMZW5ndGghPT16KXJldHVybiBhKDEwKTtsZXQgbz1uZXcgTChlLmhlYWRDcGgpLFtpLGNdPW8ucmVhZFN0cnVjdChicik7aWYoYyE9PTApcmV0dXJuIGEoYyk7bGV0e3NpZzp1LGtkbTpkLGhlYWRDcGg6bH09aTtpZighYXdhaXQgbi5jaGVja1NpZ0VkMjU1MTkodSxhcihzLGwpLHQpKXJldHVybiBhKDMpO2xldFt5LG1dPWF3YWl0IHIuZGVjcnlwdChkLGwpO2lmKG0hPT0wKXJldHVybiBhKG0pO3JldHVybiBmKHtrZG06ZCxoZWFkRW5jOnl9KX1EKCk7QygpO3ZhciBNbT1TeW1ib2woIkVudFJsbSIpO2Z1bmN0aW9uIGl0KGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyJ8fGU9PT0iIilyZXR1cm47cmV0dXJuIGV9ZnVuY3Rpb24gQ3IoZSl7aWYoZS5ybG0hPT12b2lkIDAmJmUucmxtIT09IiIpcmV0dXJuIGU7aWYoZS5ybG09PT12b2lkIDApcmV0dXJuIGU7bGV0IHQ9ey4uLmV9O3JldHVybiBkZWxldGUgdC5ybG0sdH1mdW5jdGlvbiBObihlKXtyZXR1cm4gdHlwZW9mIGU9PT0ibnVtYmVyIiYmTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MH1mdW5jdGlvbiBFYyhlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT09Im9iamVjdCJ9ZnVuY3Rpb24gVXIoZSl7aWYoIUVjKGUpfHx0eXBlb2YgZS5sYWJlbCE9PSJzdHJpbmciKXJldHVybjtpZighTm4oZS5pbmRleCkpcmV0dXJuO2xldCB0PXtsYWJlbDplLmxhYmVsLGluZGV4OmUuaW5kZXh9O2lmKGUucHJpb3I9PT12b2lkIDApcmV0dXJuIHQ7aWYoIUFycmF5LmlzQXJyYXkoZS5wcmlvcikpcmV0dXJuO2xldCByPVtdO2ZvcihsZXQgbiBvZiBlLnByaW9yKXtpZighTm4obikpcmV0dXJuO3IucHVzaChuKX1pZihyLmxlbmd0aD4wKXQucHJpb3I9cjtyZXR1cm4gdH1mdW5jdGlvbiBmaShlLHQscil7aWYodHlwZW9mIGUhPT0ic3RyaW5nInx8IU5uKHIpKXJldHVybiBhKDEwKTtpZih0IT09dm9pZCAwJiZyPHQuaW5kZXgpcmV0dXJuIGEoMTApO2xldCBuPXQ/LnByaW9yIT09dm9pZCAwP3QucHJpb3Iuc2xpY2UoKTp2b2lkIDA7aWYodCE9PXZvaWQgMCYmcj50LmluZGV4KXtsZXQgcz1uIT09dm9pZCAwP246W107cmV0dXJuIHMucHVzaCh0LmluZGV4KSxmKHtsYWJlbDplLGluZGV4OnIscHJpb3I6c30pfXJldHVybiBmKHtsYWJlbDplLGluZGV4OnIsLi4ubiE9PXZvaWQgMD97cHJpb3I6bn06e319KX1DKCk7Y2UoKTtEKCk7dmFyIFp0PSJmIixScj0idCIsa3Q9ImUiO2Z1bmN0aW9uIEFjKGUpe2lmKGU9PT0hMHx8ZT09PVJyKXJldHVybiBScjtpZihlPT09a3QpcmV0dXJuIGt0O3JldHVybiBadH1mdW5jdGlvbiBwaShlKXtyZXR1cm4gZSE9PTAmJmUhPT0xNSYmZSE9PTE4JiZlIT09MTd9ZnVuY3Rpb24gX24oZSx0LHIpe2lmKGUuYXBsZD10LHQ9PT1rdCYmciE9PXZvaWQgMCllLmVycj1yO2Vsc2UgZGVsZXRlIGUuZXJyfWFzeW5jIGZ1bmN0aW9uIEhyKGUsdCxyLG4pe2xldCBzPW4/LmJvZHkhPT0hMSxvPUFjKHQuYXBsZCksaT10LmJvZHksYz1pPy5sZW5ndGg/PzAsdTtpZihzJiZpJiZjPjApdT1hd2FpdCByLmJsYWtlMyhpKTtsZXQgZD17ZWlkOnQuZWlkLG9mZjp0Lm9mZj8/MCxjdHI6dC5jdHI/PzAsdHlwOnQudHlwPz8iIixsZW46Yyxoc2g6dX0sbD17aGFzaDplLGhlYWQ6ZCxhcGxkOm99O2lmKHMmJmkhPT12b2lkIDApbC5ib2R5PWk7aWYobz09PWt0JiZ0LmVyciE9PXZvaWQgMClsLmVycj10LmVycjtsZXQgcD1pdCh0LnJsbSk7aWYocCE9PXZvaWQgMClsLnJsbT1wO3JldHVybiBsfXZhciBGbj0xMDQ4NTc2LFduPTEwNDg1NzYsbWk9NjQ7ZnVuY3Rpb24ga2MoZSl7cmV0dXJuIGUuc2lnLmxlbmd0aCtlLmtkbS5sZW5ndGgrZS5oZWFkQ3BoLmxlbmd0aCtlLmJvZHlDcGgubGVuZ3RofWZ1bmN0aW9uIGVyKGUsdCxyLG4pe2xldCBzPWAke3R9XHgwMCR7SXQobj8/cSl9YCxvPWUuZ2V0KHMpO2lmKG8pe28uc2Vxcy5wdXNoKHIpO3JldHVybn1lLnNldChzLHtob3N0OnQscmVhbG06bixzZXFzOltyXX0pfWFzeW5jIGZ1bmN0aW9uIGhpKGUsdCl7Zm9yKGxldCByIG9mIHQudmFsdWVzKCkpYXdhaXQgZS5kb3dubG9hZHMuZGVxKHIuaG9zdCxyLnNlcXMsci5yZWFsbSl9YXN5bmMgZnVuY3Rpb24gRGMoZSx0LHIsbixzLG89cSl7aWYobi5sZW5ndGg8MSlyZXR1cm4gMDtsZXRbaSxjXT1hd2FpdCBlLnB1c2gobik7aWYoYyE9PTApcmV0dXJuIGM7aWYoIWkpcmV0dXJuIDI3O2ZvcihsZXQgZCBvZiBpKXtpZihkLnN0YXR1cyE9PTApe2NvbnNvbGUuZXJyb3IoInB1c2ggZXJyIixkKTtjb250aW51ZX1sZXQgbD1zW2QuaWR4XTtpZighbCl7Y29uc29sZS5lcnJvcigibm8gaGFzaCIsZCk7Y29udGludWV9YXdhaXQgdC51cGxvYWRzLmRlcShyLFtsXSl9bGV0IHU9YXdhaXQgdC5ob3N0cy5nZXQocik7aWYodSl7bGV0IGQ9WHQodSxvKSxsPWQscD1bXTtmb3IobGV0IHkgb2YgaSlpZih5LnN0YXR1cz09PTApcC5wdXNoKHkuc2VxKTtwLnNvcnQoKHksbSk9PnktbSk7Zm9yKGxldCB5IG9mIHApaWYoeT09PWQrMSlkPXk7aWYoZD5sKWF3YWl0IHQuaG9zdHMudG91Y2gocixkLG8pfXJldHVybiAwfWFzeW5jIGZ1bmN0aW9uIHlpKGUsdCl7aWYodC5sZW5ndGg8MSlyZXR1cm4gZihbXSk7bGV0IHI9bmV3IE1hcDtmb3IobGV0IHMgb2YgdCl7bGV0IG89cy5yZWFsbT8/cSxpPUl0KG8pLGM9ci5nZXQoaSk7aWYoIWMpYz17cmVhbG06byxkbHM6bmV3IE1hcCxzZXFzOltdfSxyLnNldChpLGMpO2MuZGxzLnNldChzLnNlcSxzKSxjLnNlcXMucHVzaChzLnNlcSl9bGV0IG49W107Zm9yKGxldCBzIG9mIHIudmFsdWVzKCkpe2xldFtvLGldPWF3YWl0IGUucHVsbChzLnNlcXMscy5yZWFsbSk7aWYoaSE9PTApcmV0dXJuIGEoaSk7aWYoIW8pcmV0dXJuIGEoMjcpO2ZvcihsZXR7c2VxOmMsYm9keUNwaDp1fW9mIG8pe2xldCBkPXMuZGxzLmdldChjKTtpZighZCljb250aW51ZTtuLnB1c2goe2RsOmQsYm9keUNwaDp1fSl9fXJldHVybiBmKG4pfWFzeW5jIGZ1bmN0aW9uIEJjKGUsdCxyLG4pe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIGYoe3BhcnRzOltdLGhhc2hlczpbXX0pO2xldCBzPVtdLG89W10saT1bXSxjPW5ldyBNYXA7Zm9yKGxldHtkbDpkLGJvZHlDcGg6bH1vZiBuKXtsZXR7aGVhZDpwLGtkbTp5LHNlcTptLGhvc3Q6aH09ZCxnPWQucmVhbG0/P3EsW1MsYl09YXdhaXQgZ2koZCxyKTtpZihiIT09MCl7ZXIoYyxoLG0sZC5yZWFsbSk7Y29udGludWV9bGV0e2hlYWRFbmM6eCxoZWFkRW5jSGFzaDpFfT1TLFA9dC5maW5kKChUKT0+X2UoZyxULnJlYWxtS0RNKSk7aWYoUD09PXZvaWQgMCl7ZXIoYyxoLG0sZC5yZWFsbSk7Y29udGludWV9bGV0W3csa109YXdhaXQgZW4oeCxsLHtkZWNyeXB0OihUKT0+UC5kZWNyeXB0KHksVCl9LHIsRSk7aWYoayE9PTApe2VyKGMsaCxtLGQucmVhbG0pO2NvbnRpbnVlfWxldCB2PXtoZWFkOnAsYm9keTp3LmJvZH0sVT13LmhlYWRIYXNoO2kucHVzaCh7a2V5OlUsZGF0YTpUcih2LGcpfSkscy5wdXNoKHYpLG8ucHVzaChVKSxlcihjLGgsbSxkLnJlYWxtKX1sZXQgdT1hd2FpdCBlLm1lc3NhZ2VzLmFkZChpKTthd2FpdCBoaShlLGMpO2ZvcihsZXQgZD0wO2Q8dS5sZW5ndGg7ZCsrKXtsZXQgbD11W2RdO2lmKGwhPT0wJiZsIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLEFbbF0sImZvciBtZXNzYWdlIixkKX1yZXR1cm4gZih7cGFydHM6cyxoYXNoZXM6b30pfWFzeW5jIGZ1bmN0aW9uIGdpKGUsdCl7bGV0IHI9ZS5oZWFkRW5jO2lmKCFyKXtsZXQgcz1uZXcgTyxvPXMud3JpdGVTdHJ1Y3QoSWUsZS5oZWFkKTtpZihvIT09MClyZXR1cm4gYShvKTtyPXMucmVzdWx0KCl9aWYoZS5oZWFkRW5jSGFzaClyZXR1cm4gZih7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOmUuaGVhZEVuY0hhc2h9KTtsZXQgbj1hd2FpdCB0LmJsYWtlMyhyKTtyZXR1cm4gZih7aGVhZEVuYzpyLGhlYWRFbmNIYXNoOm59KX1hc3luYyBmdW5jdGlvbiBTaShlLHQscil7bGV0IG49bmV3IFNldDtmb3IobGV0IGkgb2YgdCluLmFkZChLKGkpKTtpZihuLnNpemU8MSlyZXR1cm47bGV0IHM9QXJyYXkuZnJvbShhd2FpdCBlLmRvd25sb2Fkcy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuO2xldCBvPW5ldyBNYXA7Zm9yKGxldCBpIG9mIHMpe2xldCBjO2lmKGkuaGVhZEVuY0hhc2gpYz1LKGkuaGVhZEVuY0hhc2gpO2Vsc2V7bGV0W3UsZF09YXdhaXQgZ2koaSxyKTtpZihkIT09MCljb250aW51ZTtjPUsodS5oZWFkRW5jSGFzaCl9aWYoIW4uaGFzKGMpKWNvbnRpbnVlO2VyKG8saS5ob3N0LGkuc2VxLGkucmVhbG0pfWF3YWl0IGhpKGUsbyl9YXN5bmMgZnVuY3Rpb24gam4oe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixjcnlwdG86bixvblByb2dyZXNzOnMscGVla1Byb2dyZXNzRXZlcnk6byxwZWVrQ29uY3VycmVuY3k6aSxyZWFsbTpjfSl7bGV0IHU9Yz8/cSxkPWUuYmFnTWdyRm9yKHUpO2lmKGQ9PT12b2lkIDApcmV0dXJuIDEzO2xldFtsLHBdPWF3YWl0IGUuaWRlbnRpdHkoKTtpZihwIT09MClyZXR1cm4gcDtsZXQgeTt0cnl7eT1hd2FpdCBuLmltcG9ydFZlcmlmeUtleShsLnB1YmxpY0tleSl9Y2F0Y2h7cmV0dXJuIDI5fWxldCBtPVtdLFtoLGddPWF3YWl0IGUucGVlayhYdChyLHUpLHUpO2lmKGchPT0wKXJldHVybiBnO2xldCBTPWgubGVuZ3RoLGI9bz8/SnQseD1pPz9taTtpZihzJiZTPjApcyh7cGhhc2U6InBlZWsiLGhvc3Q6ci5sYWJlbCxkb25lOjAsdG90YWw6U30pO2xldCBFPTAsUD1hd2FpdCBxbihoLHgsYXN5bmMoayk9PntsZXRbdixVXT1hd2FpdCBNcihrLHksZCxuKSxUO2lmKFUhPT0wKVQ9e29rOiExLHNlcTprLnNlcSxzdGF0OlV9O2Vsc2V7bGV0IFI9YXdhaXQgbi5ibGFrZTModi5oZWFkRW5jKTtUPXtvazohMCxzZXE6ay5zZXEsa2RtOnYua2RtLGhlYWRFbmM6di5oZWFkRW5jLGhlYWRFbmNIYXNoOlJ9fWlmKEUrPTEscyYmTG4oRSxTLGIpKXMoe3BoYXNlOiJwZWVrIixob3N0OnIubGFiZWwsZG9uZTpFLHRvdGFsOlN9KTtyZXR1cm4gVH0pLHc9bmV3IFNldDtmb3IobGV0IGsgb2YgUCl7aWYoIWsub2spe2NvbnNvbGUuZXJyb3IoInBlZWs6IGRlY3J5cHRpbmcgaXRlbSBoZWFkIixrLnN0YXQpO2NvbnRpbnVlfWxldCB2PUsoay5oZWFkRW5jSGFzaCk7aWYoYXdhaXQgdC5tZXNzYWdlcy5oYXMoay5oZWFkRW5jSGFzaCkpe2NvbnNvbGUuaW5mbygicGVlazogbG9jYWwgbXNnOyBza2lwIGRvd25sb2FkLCBkZXEgdXBsb2FkIiksYXdhaXQgdC51cGxvYWRzLmRlcShyLmxhYmVsLFtrLmhlYWRFbmNIYXNoXSksYXdhaXQgdC5kb3dubG9hZHMuZGVxKHIubGFiZWwsW2suc2VxXSx1KTtjb250aW51ZX1pZih3Lmhhcyh2KSl7YXdhaXQgdC5kb3dubG9hZHMuZGVxKHIubGFiZWwsW2suc2VxXSx1KTtjb250aW51ZX1sZXQgVD1uZXcgTChrLmhlYWRFbmMpLFtSLFZdPVQucmVhZFN0cnVjdChJZSk7aWYoViE9PTApe2NvbnNvbGUuZXJyb3IoInBlZWs6IHJlYWRpbmcgaXRlbSBoZWFkIixWKTtjb250aW51ZX13LmFkZCh2KTtsZXQgSD17a2RtOmsua2RtLGhlYWQ6UixzZXE6ay5zZXEsaG9zdDpyLmxhYmVsLGhlYWRFbmM6ay5oZWFkRW5jLGhlYWRFbmNIYXNoOmsuaGVhZEVuY0hhc2h9LEk9UHIodSk7aWYoSSE9PXZvaWQgMClILnJlYWxtPUk7bS5wdXNoKEgpfWlmKGF3YWl0IHQuZG93bmxvYWRzLmVucShtKSxoLmxlbmd0aD4wKXtsZXQgaz1NYXRoLm1heCguLi5oLm1hcCgodik9PnYuc2VxKSk7YXdhaXQgdC5ob3N0cy5yZWNvcmRTZXFzKHIubGFiZWwse2xhc3RTZXE6a30sdSl9aWYocylzKHtwaGFzZToicGVlayIsaG9zdDpyLmxhYmVsLGRvbmU6Uyx0b3RhbDpTfSk7cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gYmkoe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixtYXhQdXNoQnl0ZXM6bixvblByb2dyZXNzOnN9KXtsZXQgbz1uPz9GbixpPWF3YWl0IHQudXBsb2Fkcy5saXN0KHIubGFiZWwpLGM9aS5sZW5ndGgsdT0wO2lmKHMmJmM+MClzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6MCx0b3RhbDpjfSk7bGV0IGQ9W10sbD1bXSxwPTAseT1xLG09YXN5bmMoKT0+e2lmKGQubGVuZ3RoPDEpcmV0dXJuIDA7bGV0IFM9ZC5sZW5ndGgsYj1hd2FpdCBEYyhlLHQsci5sYWJlbCxkLGwseSk7aWYoZD1bXSxsPVtdLHA9MCxiPT09MCl7aWYodSs9UyxzKXMoe3BoYXNlOiJwdXNoIixob3N0OnIubGFiZWwsZG9uZTp1LHRvdGFsOmN9KX1yZXR1cm4gYn0saD1bXSxnPWF3YWl0IHQucmVhbG1zLmxpc3QoKTtmb3IobGV0IFMgb2YgaSl7bGV0IGI9YXdhaXQgdC5tZXNzYWdlcy5nZXQoUyk7aWYoIWIpe3UrPTE7Y29udGludWV9aC5wdXNoKHtoYXNoOlMscmVhbG06eHIoYi5ybG0sZyksbXNnOnsuLi5iLmhlYWQsYm9kOmIuYm9keX19KX1oLnNvcnQoKFMsYik9PntpZihTLnJlYWxtLmxhYmVsPGIucmVhbG0ubGFiZWwpcmV0dXJuLTE7aWYoUy5yZWFsbS5sYWJlbD5iLnJlYWxtLmxhYmVsKXJldHVybiAxO3JldHVybiBTLnJlYWxtLmluZGV4LWIucmVhbG0uaW5kZXh9KTtmb3IobGV0IFMgb2YgaCl7aWYoZC5sZW5ndGg+MCYmIVZvKHksUy5yZWFsbSkpe2xldCBQPWF3YWl0IG0oKTtpZihQIT09MClyZXR1cm4gUH1sZXRbYix4XT1hd2FpdCBlLnNlYWwoUy5tc2csUy5yZWFsbSk7aWYoeCE9PTApcmV0dXJuIHg7bGV0IEU9a2MoYik7aWYoZC5sZW5ndGg+MCYmcCtFPm8pe2xldCBQPWF3YWl0IG0oKTtpZihQIT09MClyZXR1cm4gUH1pZihkLmxlbmd0aDwxKXk9Uy5yZWFsbTtpZihkLnB1c2goYiksbC5wdXNoKFMuaGFzaCkscCs9RSxwPj1vKXtsZXQgUD1hd2FpdCBtKCk7aWYoUCE9PTApcmV0dXJuIFB9fXJldHVybiBtKCl9YXN5bmMgZnVuY3Rpb24gWG4oe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixjcnlwdG86bixtYXhQdWxsQnl0ZXM6cyxvblByb2dyZXNzOm99LGkpe2xldCBjPXM/P1duLHU9YXdhaXQgdC5kb3dubG9hZHMubGlzdCgpLGQ9QXJyYXkuZnJvbSh1KS5maWx0ZXIoKGcpPT5nLmhvc3Q9PT1yLmxhYmVsKTtpZihkLmxlbmd0aDwxKXJldHVybiAxNTtsZXQgbD1BdChkLChnKT0+Zy5oZWFkKSxwPWxpKGwsKGcpPT5nLmhlYWQubGVuLGMpLHk9bC5sZW5ndGgsbT0wO2lmKG8pbyh7cGhhc2U6InB1bGwiLGhvc3Q6ci5sYWJlbCxkb25lOjAsdG90YWw6eX0pO2xldCBoPXlpKGUscFswXSk7Zm9yKGxldCBnPTA7ZzxwLmxlbmd0aDtnKyspe2xldFtTLGJdPWF3YWl0IGg7aWYoYiE9PTApcmV0dXJuIGI7aWYobSs9cFtnXS5sZW5ndGgsbylvKHtwaGFzZToicHVsbCIsaG9zdDpyLmxhYmVsLGRvbmU6bSx0b3RhbDp5fSk7bGV0IHg9cFtnKzFdO2lmKHgpaD15aShlLHgpO2lmKG8pbyh7cGhhc2U6Im9wZW4iLGhvc3Q6ci5sYWJlbCxkb25lOm0sdG90YWw6eX0pO2xldCBFPUF0KFMsKHcpPT53LmRsLmhlYWQpLFssUF09YXdhaXQgQmModCxlLmJhZ01ncnMoKSxuLEUpO2lmKFAhPT0wKXJldHVybiBQO2lmKGkpe2lmKG8pbyh7cGhhc2U6ImV4ZWMiLGhvc3Q6ci5sYWJlbCxkb25lOm0sdG90YWw6eX0pO2F3YWl0IGkoKX19cmV0dXJuIDB9ZnVuY3Rpb24gVHIoe2hlYWQ6ZSxib2R5OnR9LHIpe2xldCBuPXtlaWQ6ZS5laWQsYm9keTp0LGFwbGQ6WnR9O2lmKGUub2ZmIT09MCluLm9mZj1lLm9mZjtpZihlLmN0ciE9PTApbi5jdHI9ZS5jdHI7aWYoZS50eXApbi50eXA9ZS50eXA7bGV0IHM9aXQocj8ubGFiZWwpO2lmKHMhPT12b2lkIDApbi5ybG09cztyZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBJaShlLHtjb25uOnQsc3RvcmU6cixob3N0Om4sY3J5cHRvOnMsb25Qcm9ncmVzczpvfSxpKXtsZXQgYz1uLmxhYmVsLFt1LGRdPWF3YWl0IHQuaWRlbnRpdHkoKTtpZihkIT09MClyZXR1cm47bGV0IGw7dHJ5e2w9YXdhaXQgcy5pbXBvcnRWZXJpZnlLZXkodS5wdWJsaWNLZXkpfWNhdGNoKHcpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCBpbXBvcnRpbmcgaG9zdCB2ZXJpZnkga2V5Iix3KTtyZXR1cm59bGV0IHA9bmV3IEwoZSksW3ksbV09cC5yZWFkU3RydWN0cyhTcik7aWYobSE9PTApe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCBkZWNvZGluZyBub3RpZiIsQVttXSk7cmV0dXJufWxldCBoPSExLGc9YXdhaXQgci5ob3N0cy5nZXQoYyksUz1uZXcgTWFwLGI9W10seD0hMTtmb3IobGV0IHcgb2YgeSl7bGV0IGs9dC5iYWdNZ3JzKCkuZmluZCgoaik9Pkcoai5ybG0sdy5ybG0pKTtpZihrPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJub3RpZjogcmVhbG0iLEFbMTNdKTtjb250aW51ZX1sZXQgdj1rLnJlYWxtS0RNLFtVLFRdPWF3YWl0IE1yKHtzZXE6dy5zZXEsaGVhZENwaDp3LmhlYWRDcGh9LGwsayxzKTtpZihUIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY3J5cHRpbmcgbm90aWYiLEFbVF0pO2NvbnRpbnVlfWxldCBSPWF3YWl0IHMuYmxha2UzKFUuaGVhZEVuYyk7aWYoYXdhaXQgci5tZXNzYWdlcy5oYXMoUikpY29udGludWU7bGV0IFY9bmV3IEwoVS5oZWFkRW5jKSxbSCxJXT1WLnJlYWRTdHJ1Y3QoSWUpO2lmKEkhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgaGVhZCIsQVtJXSk7Y29udGludWV9aWYoIXcuYm9keUNwaCYmSC5sZW4+MCl7eD0hMDtsZXQgaj17c2VxOncuc2VxLGhvc3Q6YyxrZG06VS5rZG0saGVhZDpILGhlYWRFbmM6VS5oZWFkRW5jLGhlYWRFbmNIYXNoOlJ9LFg9UHIodik7aWYoWCE9PXZvaWQgMClqLnJlYWxtPVg7YXdhaXQgci5kb3dubG9hZHMuZW5xKFtqXSl9ZWxzZSBiLnB1c2goey4uLlUsaGVhZDpILGJvZHlDcGg6dy5ib2R5Q3BoLGhlYWRFbmNIYXNoOlIscmVhbG06dixiYWdNZ3I6a30pO2lmKCFnKXtjb25zb2xlLmxvZygib3V0IG9mIHNlcSIsdy5zZXEsdm9pZCAwKSxoPSEwO2NvbnRpbnVlfWxldCBGPUl0KHYpLE49Uy5nZXQoRik7aWYoIU4pTj17cmVhbG06dixzZXE6WHQoZyx2KX0sUy5zZXQoRixOKTtpZih3LnNlcSE9PU4uc2VxKzEpY29uc29sZS5sb2coIm91dCBvZiBzZXEiLHcuc2VxLE4uc2VxKSxoPSEwO2Vsc2UgTi5zZXE9dy5zZXF9aWYoZyl7Zm9yKGxldCB3IG9mIFMudmFsdWVzKCkpaWYody5zZXE+WHQoZyx3LnJlYWxtKSlhd2FpdCByLmhvc3RzLnRvdWNoKG4ubGFiZWwsdy5zZXEsdy5yZWFsbSl9bGV0IEU9W107Zm9yKGxldCB3IG9mIGIpe2xldFtrLHZdPWF3YWl0IGVuKHcuaGVhZEVuYyx3LmJvZHlDcGgse2RlY3J5cHQ6KFUpPT53LmJhZ01nci5kZWNyeXB0KHcua2RtLFUpfSxzKTtpZih2IT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIG9wZW4gYm9keSIsQVt2XSk7Y29udGludWV9RS5wdXNoKHtrZXk6dy5oZWFkRW5jSGFzaCxkYXRhOlRyKHtoZWFkOncuaGVhZCxib2R5OmsuYm9kfSx3LnJlYWxtKX0pfWxldCBQPWF3YWl0IHIubWVzc2FnZXMuYWRkKEUpO2ZvcihsZXQgdz0wO3c8UC5sZW5ndGg7dysrKXtsZXQgaz1QW3ddO2lmKGshPT0wJiZrIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLEFba10sImZvciBtZXNzYWdlIix3KX1pZihvJiZFLmxlbmd0aD4wKW8oe3BoYXNlOiJvcGVuIixob3N0Om4ubGFiZWwsZG9uZTpFLmxlbmd0aCx0b3RhbDpFLmxlbmd0aH0pO2lmKGh8fHh8fEUubGVuZ3RoPjApaSgpfWFzeW5jIGZ1bmN0aW9uIEduKGUsdD17fSl7bGV0IHI9dC5wdWxsIT09ITEsbj10LnB1c2g9PT0hMCx7Y29ubjpzLHN0b3JlOm8saG9zdDppLGNyeXB0bzpjLG9uUHJvZ3Jlc3M6dSxwZWVrUHJvZ3Jlc3NFdmVyeTpkLHBlZWtDb25jdXJyZW5jeTpsfT1lLFtwLHldPWF3YWl0IHMuaWRlbnRpdHkoKTtpZih5IT09MClyZXR1cm4gYSh5KTtsZXQgbTt0cnl7bT1hd2FpdCBjLmltcG9ydFZlcmlmeUtleShwLnB1YmxpY0tleSl9Y2F0Y2h7cmV0dXJuIGEoMjkpfWxldCBoPW5ldyBNYXAsZz0wLFM9ZD8/SnQsYj1sPz9taSx4PXd0KGF3YWl0IG8ucmVhbG1zLmxpc3QoKSk7Zm9yKGxldCBSIG9mIHgpe2xldCBWPXMuYmFnTWdyRm9yKFIpO2lmKFY9PT12b2lkIDApcmV0dXJuIGEoMTMpO2xldFtILEldPWF3YWl0IHMucGVlaygwLFIpO2lmKEkhPT0wKXJldHVybiBhKEkpO2crPUgubGVuZ3RoO2xldCBGPUgubGVuZ3RoO2lmKHUmJkY+MCl1KHtwaGFzZToicGVlayIsaG9zdDppLmxhYmVsLGRvbmU6MCx0b3RhbDpGfSk7bGV0IE49MCxqPWF3YWl0IHFuKEgsYixhc3luYyhNKT0+e2xldFt0ZSxuZV09YXdhaXQgTXIoTSxtLFYsYyksaWU7aWYobmUhPT0wKWllPXtvazohMSxzZXE6TS5zZXEsc3RhdDpuZX07ZWxzZXtsZXQgSj1hd2FpdCBjLmJsYWtlMyh0ZS5oZWFkRW5jKTtpZT17b2s6ITAsc2VxOk0uc2VxLGtkbTp0ZS5rZG0saGVhZEVuYzp0ZS5oZWFkRW5jLGhlYWRFbmNIYXNoOkp9fWlmKE4rPTEsdSYmTG4oTixGLFMpKXUoe3BoYXNlOiJwZWVrIixob3N0OmkubGFiZWwsZG9uZTpOLHRvdGFsOkZ9KTtyZXR1cm4gaWV9KTtmb3IobGV0IE0gb2Ygail7aWYoIU0ub2spY29udGludWU7bGV0IHRlPUsoTS5oZWFkRW5jSGFzaCksbmU9aC5nZXQodGUpO2lmKG5lKW5lLmNvdW50Kz0xO2Vsc2UgaC5zZXQodGUse2hhc2g6TS5oZWFkRW5jSGFzaCxjb3VudDoxLHNhbXBsZTpNLHJlYWxtOlJ9KX1sZXQgWD1ILmxlbmd0aD4wP01hdGgubWF4KC4uLkgubWFwKChNKT0+TS5zZXEpKTowO2lmKGF3YWl0IG8uaG9zdHMucmVjb3JkU2VxcyhpLmxhYmVsLHtzZXRMYXN0U2VxOlh9LFIpLHUpdSh7cGhhc2U6InBlZWsiLGhvc3Q6aS5sYWJlbCxkb25lOkYsdG90YWw6Rn0pfWxldCBFPTAsUD1bXTtmb3IobGV0IFIgb2YgaC52YWx1ZXMoKSl7aWYoUi5jb3VudD4xKUUrPVIuY291bnQtMTtQLnB1c2goUi5oYXNoKX1sZXQgdz1oLnNpemUsaz1hd2FpdCBRdChQLGMpLHY9W10sVT0wO2ZvcihsZXQgUiBvZiBoLnZhbHVlcygpKXtpZihhd2FpdCBvLm1lc3NhZ2VzLmhhcyhSLmhhc2gpKXthd2FpdCBvLnVwbG9hZHMuZGVxKGkubGFiZWwsW1IuaGFzaF0pO2NvbnRpbnVlfWlmKFUrPTEsIXIpY29udGludWU7bGV0IEg9Ui5zYW1wbGUsST1uZXcgTChILmhlYWRFbmMpLFtGLE5dPUkucmVhZFN0cnVjdChJZSk7aWYoTiE9PTApe2NvbnNvbGUuZXJyb3IoInJlY29uY2lsZTogcmVhZGluZyBtc2cgaGVhZGVyIixOKTtjb250aW51ZX1sZXQgaj17a2RtOkgua2RtLGhlYWQ6RixzZXE6SC5zZXEsaG9zdDppLmxhYmVsLGhlYWRFbmM6SC5oZWFkRW5jLGhlYWRFbmNIYXNoOkguaGVhZEVuY0hhc2h9LFg9UHIoUi5yZWFsbSk7aWYoWCE9PXZvaWQgMClqLnJlYWxtPVg7di5wdXNoKGopfWlmKHYubGVuZ3RoPjApYXdhaXQgby5kb3dubG9hZHMuZW5xKHYpO2xldCBUPTA7aWYobil7bGV0IFI9YXdhaXQgby5tZXNzYWdlcy5saXN0S2V5cygpLFY9bmV3IFNldChoLmtleXMoKSksSD1bXTtmb3IobGV0IEkgb2YgUilpZighVi5oYXMoSyhJKSkpVCs9MSxILnB1c2goSSk7aWYoSC5sZW5ndGg+MClhd2FpdCBvLnVwbG9hZHMuZW5xKGkubGFiZWwsSCl9ZWxzZXtsZXQgUj1hd2FpdCBvLm1lc3NhZ2VzLmxpc3RLZXlzKCksVj1uZXcgU2V0KGgua2V5cygpKTtmb3IobGV0IEggb2YgUilpZighVi5oYXMoSyhIKSkpVCs9MX1yZXR1cm4gZih7bXNnY2hlY2s6ayxudW1CYWdzOmcsdW5pcXVlTXNnczp3LG51bUR1cGVzOkUsbWlzc2luZ0xvY2FsOlUsbWlzc2luZ0hvc3Q6VH0pfWZ1bmN0aW9uIHZjKGUpe3JldHVybiBlLm1hcCgoe2hlYWQ6dCxib2R5OnJ9KT0+KHsuLi50LGJvZDpyfSkpfWZ1bmN0aW9uIE1jKGUsdCl7bGV0IHI9W107Zm9yKGxldCBuIG9mIGUpe2xldCBzPXhyKG4ucmxtLHQpLG89ci5maW5kKChpKT0+X2UoaS5yZWFsbSxzKSk7aWYobz09PXZvaWQgMClvPXtyZWFsbTpzLG1zZ3M6W119LHIucHVzaChvKTtvLm1zZ3MucHVzaCh7aGVhZDpuLmhlYWQsYm9keTpuLmJvZHl9KX1yZXR1cm4gcn1jbGFzcyBRbntjbG9jaztzdGF0ZTtzdG9yZTt0cmFuc3BvcnQ7Y3J5cHRvO2ZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0O29uU2NoZWR1bGVTeW5jO2Nvbm5lY3Rpb25zPW5ldyBNYXA7I2U7YXBwbHlDaGFpbj1Qcm9taXNlLnJlc29sdmUoKTtzeW5jUnVucz1uZXcgdnI7Y2xpZW50U3RhdGU7eGZlclN0YXRlO21heFB1c2hCeXRlczttYXhQdWxsQnl0ZXM7cGVla1Byb2dyZXNzRXZlcnk9SnQ7bGFzdFByb2dyZXNzPVZuO3NjaGVkdWxlZFN5bmM7Y29uc3RydWN0b3IoZSx0LHIsbixzLG89ITAsaT1GbixjPVduLHUpe3RoaXMuY2xvY2s9ZTt0aGlzLnN0YXRlPXQ7dGhpcy5zdG9yZT1yO3RoaXMudHJhbnNwb3J0PW47dGhpcy5jcnlwdG89czt0aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0PW87dGhpcy5vblNjaGVkdWxlU3luYz11O3RoaXMubWF4UHVzaEJ5dGVzPWksdGhpcy5tYXhQdWxsQnl0ZXM9Yyx0aGlzLmNsaWVudFN0YXRlPW5ldyBaZSgoKT0+dGhpcy5nZXRDbGllbnRTdGF0ZSgpKSx0aGlzLnhmZXJTdGF0ZT1uZXcgWmUoKCk9PnRoaXMuZ2V0WGZlclN0YXRlKCkpLHRoaXMuc2NoZWR1bGVkU3luYz1uZXcgS24oZWksYXN5bmMoKT0+e3RyeXtjb25zb2xlLmluZm8oIlJ1bm5pbmcgc2NoZWR1bGVkIHN5bmMiKSxhd2FpdCB0aGlzLnN5bmMoKX1jYXRjaChkKXtjb25zb2xlLmVycm9yKCJEZWJvdW5jZWQgc3luYyBmYWlsZWQ6IixkKX19KX1lbWl0UHJvZ3Jlc3M9KGUpPT57dGhpcy5sYXN0UHJvZ3Jlc3M9ZSx0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9O3NlbGVjdGVkKCl7cmV0dXJuIHRoaXMuI2V9YXN5bmMgc2V0U2VlZChlLHQpe2xldFtyLG5dPWplKHQ/LmxhYmVsKTtpZihuIT09MHx8cj09PXZvaWQgMClyZXR1cm4gMTA7bGV0WyxzXT1hd2FpdCB0aGlzLnN0b3JlLmFjY291bnQuc2F2ZShlLHQpO2lmKHMhPT0wKXJldHVybiBzO2xldCBvPWF3YWl0IHRoaXMuI2kocixlKTtpZihvIT09MClyZXR1cm4gbztyZXR1cm4gdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksMH1hc3luYyBhZG9wdChlLHQ9IiIpe2xldCByPWF3YWl0IHRoaXMuI2kodCxlKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksMH0jdCgpe3JldHVybiB0aGlzLiNlPy5lbmNsYXZlfWFzeW5jI24oKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9YXN5bmMjcygpe2lmKHRoaXMuI2U9PT12b2lkIDApcmV0dXJuO3RoaXMuI2UuaG9zdHM9YXdhaXQgdGhpcy4jbigpfWFzeW5jI3IoKXtpZih0aGlzLiNlPT09dm9pZCAwKXJldHVybjt0aGlzLiNlLnJlYWxtcz1hd2FpdCB0aGlzLnN0b3JlLnJlYWxtcy5saXN0KCl9YXN5bmMjaShlLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuYmluZChlKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gdGhpcy4jZT17bGFiZWw6ZSxlbmNsYXZlOnQsaG9zdHM6YXdhaXQgdGhpcy4jbigpLHJlYWxtczphd2FpdCB0aGlzLnN0b3JlLnJlYWxtcy5saXN0KCl9LDB9YXN5bmMgZ2V0Q2xpZW50U3RhdGUoKXtsZXR7c3RvcmU6ZSxjb25uZWN0aW9uczp0fT10aGlzLHI9dGhpcy4jdCgpLG49YXdhaXQgZS5ob3N0cy5saXN0KCkscz0hMTtmb3IobGV0IG8gb2YgdC52YWx1ZXMoKSlpZihvLmlzQ29ubmVjdGVkKCkpe3M9ITA7YnJlYWt9cmV0dXJue2hhc1NlZWQ6ciE9PXZvaWQgMCxoYXNIb3N0OkFycmF5LmZyb20obikubGVuZ3RoPjAsY29ubmVjdGVkOnN9fWFzeW5jIGdldFhmZXJTdGF0ZSgpe2xldHt1cGxvYWRzOmUsZG93bmxvYWRzOnR9PXRoaXMuc3RvcmUscj1hd2FpdCBlLmNvdW50KCk7cmV0dXJue251bURvd25sb2Fkczphd2FpdCB0LmNvdW50KCksbnVtVXBsb2FkczpyLHByb2dyZXNzOnRoaXMubGFzdFByb2dyZXNzfX1hcHBseT0oZSx0KT0+e1coImFwcGx5IGtpY2siLHtuOmUubGVuZ3RofSk7bGV0IHI9dGhpcy5zdGF0ZS5hcHBseSh2YyhlKSk7cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLmRvQXBwbHkoZSx0LHIpKX07YXN5bmMgZG9BcHBseShlLHQ9e2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMH0scil7bGV0IG49W10scz1bXTtmb3IobGV0IGkgb2YgZSl7bGV0IGM9bmV3IE87Yy53cml0ZVN0cnVjdChJZSxpLmhlYWQpO2xldCB1PWMucmVzdWx0KCksZD1hd2FpdCB0aGlzLmNyeXB0by5ibGFrZTModSksbD1UcihpLHQucmVhbG0pO24ucHVzaChkKSxzLnB1c2goe2tleTpkLGRhdGE6bH0pfVcoImRvQXBwbHkgYXJjaGl2ZSBzdGFydCIpLGF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMuYWRkKHMpLFcoImRvQXBwbHkgYXJjaGl2ZSBkb25lIiksYXdhaXQgU2kodGhpcy5zdG9yZSxuLHRoaXMuY3J5cHRvKSxXKCJkb0FwcGx5IGF3YWl0IHBlcnNpc3QiKTtsZXQgbz1hd2FpdCByO2lmKFcoImRvQXBwbHkgcGVyc2lzdCBkb25lIiksYXdhaXQgdGhpcy5tYXJrQXBwbHlTdGF0cyhuLG8pLHQuZW5xdWV1ZVVwbG9hZCl7bGV0IGk9W107Zm9yKGxldCBjPTA7YzxuLmxlbmd0aDtjKyspe2xldCB1PW9bY107aWYodT09PTB8fHU9PT0xNSlpLnB1c2gobltjXSl9aWYoaS5sZW5ndGg+MCl7bGV0IGM9YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5saXN0KCk7Zm9yKGxldCB1IG9mIGMpYXdhaXQgdGhpcy5zdG9yZS51cGxvYWRzLmVucSh1LmxhYmVsLGkpO3RoaXMueGZlclN0YXRlLmVtaXQoKX19aWYodC50cmlnZ2VyVXBsb2FkKXRoaXMuc2NoZWR1bGVTeW5jKCk7cmV0dXJuIG99ZW5xdWV1ZUFwcGx5Sm9iKGUpe2xldCB0PXRoaXMuYXBwbHlDaGFpbi50aGVuKGUsZSk7cmV0dXJuIHRoaXMuYXBwbHlDaGFpbj10LnRoZW4oKCk9PntyZXR1cm59LCgpPT57cmV0dXJufSksdH1kcmFpbkFwcGx5UXVldWUoKXtyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9EcmFpbkFwcGx5UXVldWUoKSl9YXN5bmMgZG9EcmFpbkFwcGx5UXVldWUoKXtsZXQgZT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3Qoe2FwbGQ6WnR9KTtpZihlLmxlbmd0aDwxKXJldHVybltdO2xldCB0PUF0KGUsKHIpPT5yLmhlYWQpO3JldHVybiB0aGlzLmFwcGx5U3RvcmVkKHQpfWFwcGx5SGFzaGVzPShlKT0+dGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseUhhc2hlcyhlKSk7YXN5bmMgZG9BcHBseUhhc2hlcyhlKXtsZXQgdD1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IG89YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5nZXQocyk7aWYobyl0LnB1c2gobyl9bGV0IHI9YXdhaXQgdGhpcy5hcHBseVN0b3JlZCh0KSxuPW5ldyBNYXA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspbi5zZXQoSyh0W3NdLmhhc2gpLHJbc10/PzEyKTtyZXR1cm4gZS5tYXAoKHMpPT5uLmdldChLKHMpKT8/MTMpfWFzeW5jIGFwcGx5U3RvcmVkKGUpe2lmKGUubGVuZ3RoPDEpcmV0dXJuW107bGV0IHQ9ZS5tYXAoKG4pPT4oey4uLm4uaGVhZCxib2Q6bi5ib2R5fSkpLHI9YXdhaXQgdGhpcy5zdGF0ZS5hcHBseSh0KTtyZXR1cm4gYXdhaXQgdGhpcy5tYXJrQXBwbHlTdGF0cyhlLm1hcCgobik9Pm4uaGFzaCkscikscn1hc3luYyBtYXJrQXBwbHlTdGF0cyhlLHQpe2xldCByPVtdLG49W107Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2xldCBvPXRbc107aWYobz09PTB8fG89PT0xNSlyLnB1c2goZVtzXSk7ZWxzZSBpZihvIT09dm9pZCAwJiZwaShvKSluLnB1c2goe2tleTplW3NdLGVycjpvfSl9aWYoci5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtBcHBsaWVkKHIpO2lmKG4ubGVuZ3RoPjApYXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5tYXJrRmFpbGVkKG4pfWFzeW5jIGluc2VydFJhdyhlLHQ9IiIpe1coImluc2VydFJhdyIpO2xldHtjbG9jazpyLGNyeXB0bzpufT10aGlzLHM9ci5ub3coKSxbbyxpXT1hd2FpdCB6byh7bm93OnMsYm9kOmUsdHlwOnQsY3J5cHRvOm59KTtpZihpIT09MClyZXR1cm4gYShpKTtsZXQgdT0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6byxib2R5OmV9XSkpWzBdO2lmKHUhPT0wJiZ1IT09MTUpcmV0dXJuIGEodT8/MTIpO3JldHVybiBmKG8pfWFzeW5jIG1ha2VVcGRhdGUoZSx0LHI9IiIpe2xldHtjbG9jazpuLGNyeXB0bzpzfT10aGlzLG89bi5ub3coKTtpZihlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+by5nZXRUaW1lKCkpcmV0dXJuIGEoNCk7bGV0IGk9ZS5jdHIrMSxbYyx1XT1hd2FpdCBBcih7bm93Om8sZWlkOmUuZWlkLGN0cjppLHR5cDpyLGJvZDp0LGNyeXB0bzpzfSk7aWYodSE9PTApcmV0dXJuIGEodSk7cmV0dXJuIGYoe2hlYWQ6Yyxib2R5OnR9KX1hc3luYyB1cGRhdGVXaXRoU2tldyhlLHQscixuPSIiKXtpZihyPT09ITEpcmV0dXJuIGEoNCk7bGV0e2Nsb2NrOnMsY3J5cHRvOm99PXRoaXMsaT1zLm5vdygpLGM9bmV3IEwoZS5laWQpLFt1LGRdPWMucmVhZFN0cnVjdChhZSk7aWYoZCE9PTApcmV0dXJuIGEoZCk7bGV0IGw9ZS51cGRhdGVkQXQuZ2V0VGltZSgpLXUudHMuZ2V0VGltZSgpLHA9e2VpZDplLmVpZCxvZmY6bCsxLGN0cjplLmN0cisxLHR5cDoiIixsZW46MH0sbT0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6cCxib2R5OnZvaWQgMH1dKSlbMF07aWYobSE9PTAmJm0hPT0xNSlyZXR1cm4gYShtPz8xMik7aWYodD09PXZvaWQgMClyZXR1cm4gZihwKTtsZXRbaCxnXT1mdCh7aWQ6dS5pZCx0czppfSk7aWYoZyE9PTApcmV0dXJuIGEoZyk7bGV0W1MsYl09YXdhaXQgQXIoe25vdzppLGVpZDpoLGN0cjowLHR5cDpuLGJvZDp0LGNyeXB0bzpvfSk7aWYoYiE9PTApcmV0dXJuIGEoYik7bGV0IEU9KGF3YWl0IHRoaXMuYXBwbHkoW3toZWFkOlMsYm9keTp0fV0pKVswXTtpZihFIT09MCYmRSE9PTE1KXJldHVybiBhKEU/PzEyKTtyZXR1cm4gZihTKX1hc3luYyB1cGRhdGVSYXcoZSx0LHI9dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdCxuPSIiKXtpZihXKCJ1cGRhdGVSYXciKSxlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+dGhpcy5jbG9jay5ub3coKS5nZXRUaW1lKCkpcmV0dXJuIHRoaXMudXBkYXRlV2l0aFNrZXcoZSx0LHIsbik7bGV0W3Msb109YXdhaXQgdGhpcy5tYWtlVXBkYXRlKGUsdCxuKTtpZihvIT09MClyZXR1cm4gYShvKTtsZXQgYz0oYXdhaXQgdGhpcy5hcHBseShbc10pKVswXTtpZihjIT09MCYmYyE9PTE1KXJldHVybiBhKGM/PzEyKTtyZXR1cm4gZihzLmhlYWQpfWFzeW5jIGluc2VydChlKXtsZXRbdCxyXT1idChlKTtpZihyIT09MClyZXR1cm4gYShyKTtyZXR1cm4gdGhpcy5pbnNlcnRSYXcodCxlLnR5cGUpfWFzeW5jIHVwZGF0ZShlKXtsZXRbdCxyXT1idChlKTtpZihyIT09MClyZXR1cm4gYShyKTtyZXR1cm4gdGhpcy51cGRhdGVSYXcoZS5wcmlvcix0LGUuZm9yY2U/P3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQsZS50eXBlKX1hc3luYyBkZWxldGUoZSl7bGV0IHQ9ZS5mb3JjZT8/ITA7aWYoInByaW9yImluIGUpcmV0dXJuIHRoaXMudXBkYXRlUmF3KGUucHJpb3Isdm9pZCAwLHQpO2xldFtyLG5dPWF3YWl0IHRoaXMucmV2RnJvbUFyY2hpdmUoZS5laWQpO2lmKG4hPT0wKXJldHVybiBhKG4pO3JldHVybiB0aGlzLnVwZGF0ZVJhdyhyLHZvaWQgMCx0KX1hc3luYyBpbnNlcnRCbG9iKGUsdCxyKXtsZXRbbixzXT1haShlLHQscik7aWYocyE9PTApcmV0dXJuIGEocyk7cmV0dXJuIHRoaXMuaW5zZXJ0UmF3KG4uYm9kLG4udHlwKX1hc3luYyB1cGRhdGVCbG9iKGUsdCxyKXtsZXRbbixzXT1jaShhd2FpdCB0aGlzLmxhc3RNc2coZSksdCxyKTtpZihzIT09MClyZXR1cm4gYShzKTtyZXR1cm4gdGhpcy51cGRhdGVSYXcobi5wcmlvcixuLmJvZCx2b2lkIDAsbi50eXApfWRlbGV0ZUJsb2IoZSl7cmV0dXJuIHRoaXMuZGVsZXRlKHtlaWQ6ZX0pfWFzeW5jIHJlYWRCbG9iKGUpe3JldHVybiB1aShhd2FpdCB0aGlzLmxhc3RNc2coZSkpfWFzeW5jIGxhc3RNc2coZSl7bGV0IHQ9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5sYXN0KGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuO2xldCByPXsuLi50LmhlYWR9O2lmKHQuYm9keSE9PXZvaWQgMClyLmJvZD10LmJvZHk7cmV0dXJuIHJ9YXN5bmMgcmV2RnJvbUFyY2hpdmUoZSl7bGV0IHQ9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5sYXN0KGUpO2lmKHQpcmV0dXJuIFpvKHQuaGVhZCk7bGV0IHI9bmV3IEwoZSksW24sc109ci5yZWFkU3RydWN0KGFlKTtpZihzIT09MClyZXR1cm4gYShzKTtyZXR1cm4gZih7ZWlkOmUsY3RyOi0xLHVwZGF0ZWRBdDpuLnRzfSl9YXN5bmMgZ2VuRUlEKGUpe2xldHtjbG9jazp0LGNyeXB0bzpyfT10aGlzLG49dC5ub3coKTtpZihlIT09dm9pZCAwKXJldHVybiBmdCh7aWQ6ZSx0czpufSk7bGV0IHM9YXdhaXQgci5nZW5SYW5kb21CeXRlcyg4KTtyZXR1cm4gZnQoe2lkOnMsdHM6bn0pfXN5bmMoKXtyZXR1cm4gdGhpcy5zeW5jUnVucy5ydW4oKCk9PnRoaXMuZG9TeW5jKCkpfWFzeW5jIGRvU3luYygpe2xldHtjb25uZWN0aW9uczplLGNyeXB0bzp0LHN0b3JlOnJ9PXRoaXM7aWYoIXRoaXMuI3QoKSlyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKSxhd2FpdCB0aGlzLiNyKCk7bGV0IHM9d3QodGhpcy4jZT8ucmVhbG1zPz9bXSk7Zm9yKGxldFtvLGldb2YgZSl7bGV0IGM9YXdhaXQgci5ob3N0cy5nZXQobyk7aWYoIWMpY29udGludWU7bGV0IHU9YXdhaXQgdGhpcy4jbyhpLGMpO2lmKHUhPT0wKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksdTtsZXQgZD17Y29ubjppLHN0b3JlOnIsaG9zdDpjLGNyeXB0bzp0LG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtmb3IobGV0IHkgb2Ygcyl7bGV0IG09YXdhaXQgam4oey4uLmQscmVhbG06eX0pO2lmKG0hPT0wKXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGVlazogJHttfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxtO3RoaXMueGZlclN0YXRlLmVtaXQoKX1sZXQgbD1hd2FpdCBiaShkKTtpZihsIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHB1c2g6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IHA9YXdhaXQgWG4oZCxhc3luYygpPT57YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKX0pO2lmKHAhPT0wJiZwIT09MTUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwdWxsOiAke3B9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHA7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMH1hc3luYyByZWJ1aWxkKGUpe2lmKHRoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCksZT8uY2hlY2tIb3N0Pz8hMCl7bGV0IHI9YXdhaXQgdGhpcy5yZXB1bGwoKTtpZihyIT09MClyZXR1cm4gcn1yZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMucmVwbGF5KCkpfWFzeW5jIG1zZ2NoZWNrKCl7bGV0IGU9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5saXN0S2V5cygpO3JldHVybiBRdChlLHRoaXMuY3J5cHRvKX1saXN0TXNncyhlKXtyZXR1cm4gdGhpcy5zdG9yZS5tZXNzYWdlcy5saXN0KGUpfWNvdW50TXNncyhlKXtyZXR1cm4gdGhpcy5zdG9yZS5tZXNzYWdlcy5jb3VudChlKX1hc3luYyByZWNvbmNpbGUoZSx0KXt0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpO2xldHtjb25uZWN0aW9uczpyLGNyeXB0bzpuLHN0b3JlOnN9PXRoaXM7aWYoIXRoaXMuI3QoKSlyZXR1cm4gYSgyMik7bGV0IGk9YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIWkpcmV0dXJuIGEoMTMpO2xldCBjPXIuZ2V0KGUpO2lmKCFjfHwhYy5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QoaSwhMSwhMSksaT1hd2FpdCBzLmhvc3RzLmdldChlKSwhaSlyZXR1cm4gYSgxMyk7Yz1yLmdldChlKX1pZighYylyZXR1cm4gYSgxMik7bGV0IHU9YXdhaXQgdGhpcy4jbyhjLGkpO2lmKHUhPT0wKXJldHVybiBhKHUpO2xldCBkPXtjb25uOmMsc3RvcmU6cyxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW2wscF09YXdhaXQgR24oey4uLmQsaG9zdDppfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCkscCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxhKHApO2lmKCFsKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYSgxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZihsKTtsZXQgeT1hd2FpdCB0aGlzLnN5bmMoKTtpZih5IT09MClyZXR1cm4gYSh5KTtsZXQgbT1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighbSlyZXR1cm4gYSgxMyk7bGV0W2gsZ109YXdhaXQgR24oey4uLmQsaG9zdDptfSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxnIT09MClyZXR1cm4gYShnKTtpZighaClyZXR1cm4gYSgxMik7cmV0dXJuIGYoaCl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcztpZighdGhpcy4jdCgpKXJldHVybiAyMjtsZXQgcz1BcnJheS5mcm9tKGF3YWl0IHIuaG9zdHMubGlzdCgpKTtpZihzLmxlbmd0aDwxKXJldHVybiAwO2F3YWl0IHRoaXMuI3IoKTtsZXQgbz13dCh0aGlzLiNlPy5yZWFsbXM/P1tdKTtmb3IobGV0IGkgb2Ygcyl7bGV0IGM9ZS5nZXQoaS5sYWJlbCk7aWYoIWN8fCFjLmlzQ29ubmVjdGVkKCkpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KGksITEsITEpfWZvcihsZXRbaSxjXW9mIGUpe2xldCB1PWF3YWl0IHIuaG9zdHMuZ2V0KGkpO2lmKCF1KWNvbnRpbnVlO2xldCBkPWF3YWl0IHRoaXMuI28oYyx1KTtpZihkIT09MClyZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLGQ7bGV0IGw9e2Nvbm46YyxzdG9yZTpyLGhvc3Q6ey4uLnUsbGFzdFNlcTowLHNlcXM6dm9pZCAwfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX07Zm9yKGxldCB5IG9mIG8pe2xldCBtPWF3YWl0IGpuKHsuLi5sLHJlYWxtOnl9KTtpZihtIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7bX1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9bGV0IHA9YXdhaXQgWG4obCk7aWYocCE9PTAmJnAhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7cH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPUF0KHQsKG8pPT5vLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBvPTAsaT0wLGM9cztmb3IobGV0IGQ9cztkPHIubGVuZ3RoJiZpPDEwMCYmbzwxMDI0MDA7ZCsrKW8rPXJbZF0uaGVhZC5sZW4saSsrLGM9ZCsxO2xldCB1PXIuc2xpY2UocyxjKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKHUpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTpjLHRvdGFsOm59KSxzPWN9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOm99PXRoaXM7aWYobilhd2FpdCBvLmhvc3RzLndpcGUoKSxhd2FpdCBvLnVwbG9hZHMud2lwZSgpLGF3YWl0IG8uZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IG8ubWVzc2FnZXMud2lwZSgpO2lmKHIpYXdhaXQgdGhpcy5zdGF0ZS5jbGVhcigpO2lmKHMpYXdhaXQgby5hY2NvdW50LndpcGUoKSxhd2FpdCBvLnJlYWxtcy53aXBlKCksdGhpcy4jZT12b2lkIDA7ZWxzZSBpZihuKWF3YWl0IHRoaXMuI3MoKSxhd2FpdCB0aGlzLiNyKCk7dGhpcy5sYXN0UHJvZ3Jlc3M9Vm4sdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksdGhpcy54ZmVyU3RhdGUuZW1pdCgpfWltcG9ydD1hc3luYyhlLHQpPT57bGV0e2NyeXB0bzpyfT10aGlzLG49dD8ub25Qcm9ncmVzcyxzPXRoaXMuI3QoKTtpZighcylyZXR1cm4gMjI7Y29uc29sZS50aW1lKCJpbXBvcnQ6IGRlY29kaW5nIGZpbGUuLi4iKTtsZXQgbz1hd2FpdCBlLmJ5dGVzKCksW2ksY109R3QuZXhwb3J0Tm9uY2Uobyk7aWYoYyE9PTApcmV0dXJuIGNvbnNvbGUudGltZUVuZCgiaW1wb3J0OiBkZWNvZGluZyBmaWxlLi4uIiksYztsZXRbdSxkXT1hd2FpdCBzLmV4cG9ydEtleShpKTtpZihkIT09MClyZXR1cm4gY29uc29sZS50aW1lRW5kKCJpbXBvcnQ6IGRlY29kaW5nIGZpbGUuLi4iKSxkO2xldCBsO3RyeXtsPWF3YWl0IEd0LmRlY29kZUZpbGUobyxyLHUpfWZpbmFsbHl7dS5maWxsKDApLGNvbnNvbGUudGltZUVuZCgiaW1wb3J0OiBkZWNvZGluZyBmaWxlLi4uIil9bGV0W3AseV09bDtpZih5IT09MClyZXR1cm4geTtsZXQgbT0wLGg9bmV3IE1hcDtmb3IobGV0IFMgb2YgcCl7aWYobSs9Uy5tc2dzLmxlbmd0aCxTLnJlYWxtLmxhYmVsPT09IiIpY29udGludWU7bGV0IGI9aC5nZXQoUy5yZWFsbS5sYWJlbCk7aWYoYj09PXZvaWQgMHx8Uy5yZWFsbS5pbmRleD5iKWguc2V0KFMucmVhbG0ubGFiZWwsUy5yZWFsbS5pbmRleCl9Zm9yKGxldFtTLGJdb2YgaCl7bGV0IHg9YXdhaXQgdGhpcy5zdG9yZS5yZWFsbXMucHV0KFMsYik7aWYoeD09PTEwKWNvbnRpbnVlO2lmKHghPT0wKXJldHVybiB4fWlmKGguc2l6ZT4wKWF3YWl0IHRoaXMuI3IoKTtsZXQgZz0wO2ZvcihsZXQgUyBvZiBwKXtsZXQgYj0wO3doaWxlKGI8Uy5tc2dzLmxlbmd0aCl7bGV0IHg9MCxFPTAsUD1iO2ZvcihsZXQgdj1iO3Y8Uy5tc2dzLmxlbmd0aCYmRTwxMDAmJng8MTAyNDAwO3YrKyl4Kz1TLm1zZ3Nbdl0uaGVhZC5sZW4sRSsrLFA9disxO2xldCB3PVMubXNncy5zbGljZShiLFApO2NvbnNvbGUudGltZShgaW1wb3J0OiBhcHBseWluZyBbJHtnfSwgJHtnK3cubGVuZ3RofV1gKTtsZXQgaz1hd2FpdCB0aGlzLmFwcGx5KHcse2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMSxyZWFsbTpTLnJlYWxtfSk7Y29uc29sZS50aW1lRW5kKGBpbXBvcnQ6IGFwcGx5aW5nIFske2d9LCAke2crdy5sZW5ndGh9XWApO2ZvcihsZXQgdj0wO3Y8dy5sZW5ndGg7disrKXtsZXQgVT1rW3ZdO2lmKFUhPT0wJiZVIT09MTUpY29uc29sZS53YXJuKGBmYWlsZWQgdG8gaW1wb3J0IG1zZyAke2crdn06ICR7QVtVXX1gKX1pZihnKz13Lmxlbmd0aCxuKXF1ZXVlTWljcm90YXNrKCgpPT5uKGcsbSwwKSk7dGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpbXBvcnQiLGRvbmU6Zyx0b3RhbDptfSksYj1QfX1yZXR1cm4gdGhpcy5zY2hlZHVsZVN5bmMoKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMH07c2NoZWR1bGVTeW5jPSgpPT57aWYodGhpcy5vblNjaGVkdWxlU3luYyl7dGhpcy5vblNjaGVkdWxlU3luYygpO3JldHVybn10aGlzLnNjaGVkdWxlZFN5bmMuc2NoZWR1bGUoKX07YXN5bmMgZXhwb3J0Qnl0ZXMoKXtsZXR7Y3J5cHRvOmUsc3RvcmU6dH09dGhpcyxyPXRoaXMuI3QoKTtpZighcilyZXR1cm4gYSgyMik7bGV0IG49YXdhaXQgdC5yZWFsbXMubGlzdCgpLHM9YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIEd0LmV4cG9ydEZpbGUocixlLE1jKHMsbikpfWFzeW5jIGV4cG9ydChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmV4cG9ydEJ5dGVzKCk7aWYociE9PTApcmV0dXJuIHI7aWYoIXQpcmV0dXJuIDEyO2xldCBuPW5ldyBCbG9iKFt0LnNsaWNlKCldKTtyZXR1cm4gZGkobixlKSwwfWFzeW5jIGxpbmsoZSx0PSEwKXtpZihhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmFkZChlKSxhd2FpdCB0aGlzLiNzKCksYXdhaXQgdGhpcy4jcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KGUubGFiZWwpO2lmKHIpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KHIpfX1hc3luYyB1bmxpbmsoZSl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoZSksYXdhaXQgdGhpcy4jcygpLGF3YWl0IHRoaXMuI3IoKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKX1hc3luYyBob3N0cygpe3JldHVybiBBcnJheS5mcm9tKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMubGlzdCgpKX1jb25uZWN0VG9Ib3N0PWFzeW5jKGUsdD0hMCxyPSEwKT0+e2xldHtjbG9jazpuLGNvbm5lY3Rpb25zOnMsY3J5cHRvOm8sc3RvcmU6aSx0cmFuc3BvcnQ6Y309dGhpcyx1PXMuZ2V0KGUubGFiZWwpO2lmKHUpe2lmKHUuaXNDb25uZWN0ZWQoKSlyZXR1cm47dHJ5e3UuY2xvc2VMaXN0ZW5lcigpfWNhdGNoe31zLmRlbGV0ZShlLmxhYmVsKX1pZighdGhpcy4jdCgpKXJldHVybjtjb25zb2xlLmluZm8oYENvbm5lY3RpbmcgdG8gJHtlLmhhbmRsZX0gKCR7ZS5sYWJlbH0pYCk7bGV0IGw9bmV3IElyKFtdLG8sbixjKGUpLGFzeW5jKHkpPT57bGV0IG09YXdhaXQgaS5ob3N0cy5zZXQoZS5sYWJlbCx5KTtyZXR1cm4gYXdhaXQgdGhpcy4jcygpLGF3YWl0IHRoaXMuI3IoKSxtfSk7aWYoYXdhaXQgdGhpcy4jbyhsLGUpIT09MClyZXR1cm47aWYoYXdhaXQgbC5yZWdpc3RlcigpLHQpYXdhaXQgbC5saXN0ZW4oYXN5bmMoeSk9PntpZihhd2FpdCB0aGlzLiNvKGwsZSkhPT0wKXJldHVybjtsZXQgaD17Y29ubjpsLHN0b3JlOmksaG9zdDplLGNyeXB0bzpvLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4gSWkoeSxoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jI28oZSx0KXtsZXQgcj10aGlzLiN0KCk7aWYoIXIpcmV0dXJuIDIyO2xldCBuPXtsYWJlbDp0LmxhYmVsLGluZGV4OnQuaWR4Pz8wfSxzPXd0KGF3YWl0IHRoaXMuc3RvcmUucmVhbG1zLmxpc3QoKSk7Zm9yKGxldCBvIG9mIHMpe2lmKGUuYmFnTWdyRm9yKG8pIT09dm9pZCAwKWNvbnRpbnVlO2xldFtpLGNdPWF3YWl0IHIuYmFnbWFuKG4sbyk7aWYoYyE9PTApcmV0dXJuIGM7ZS5hZGQoaSl9cmV0dXJuIDB9YXN5bmMgY29ubmVjdChlPSEwLHQ9ITApe2xldHtjb25uZWN0VG9Ib3N0OnIsc2NoZWR1bGVTeW5jOm4sc3RvcmU6c309dGhpcztpZighdGhpcy4jdCgpKXJldHVybjthd2FpdCB0aGlzLmRyYWluQXBwbHlRdWV1ZSgpO2xldCBpPWF3YWl0IHMuaG9zdHMubGlzdCgpO2ZvcihsZXQgYyBvZiBpKWF3YWl0IHIoYyxlLCExKTtpZih0KW4oKX1kaXNjb25uZWN0PWFzeW5jKCk9Pntmb3IobGV0IGUgb2YgdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKSl0cnl7ZS5jbG9zZUxpc3RlbmVyKCl9Y2F0Y2h7fXRoaXMuY29ubmVjdGlvbnMuY2xlYXIoKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKX19U3QoKTt2YXIgRHQ9QW87Y2UoKTtEKCk7ZnVuY3Rpb24gd2koZSx0KXtpZihlPT09bnVsbHx8dD09PW51bGx8fHR5cGVvZiBlIT09Im9iamVjdCJ8fHR5cGVvZiB0IT09Im9iamVjdCIpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShlKT09PUpTT04uc3RyaW5naWZ5KHQpfWNhdGNoe3JldHVybiExfX1DKCk7Y2UoKTtEKCk7dHIoKTtDKCk7dHIoKTtmZSgpO0QoKTtjZSgpOyR0KCk7QygpO29zKCk7Q3QoKTt2YXIgUWM9ODtjbGFzcyAkcnsjZTsjdDsjbjsjczsjcjsjaTsjbztjb25zdHJ1Y3RvcihlKXt0aGlzLiNyPWUucGVyc2lzdEtleXJpbmcsdGhpcy4jbj17cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lfSx0aGlzLiNzPWUudXNlck5hbWU/P2UucnBJZD8/ZS5ycE5hbWU/P3JyLHRoaXMuI2k9ZS51bmxvY2tBY2NvdW50fXN0YXRpYyBvcGVuKGUpe2xldCB0PW5ldyAkcihlKTtpZihlLmtleXJpbmc9PT12b2lkIDApcmV0dXJuIGYodCk7bGV0W3Isbl09bnIoZS5rZXlyaW5nKTtpZihuIT09MClyZXR1cm4gYShuKTtyZXR1cm4gdC4jdD1yLGYodCl9Z2V0IGtleXJpbmcoKXtpZih0aGlzLiN0PT09dm9pZCAwKXJldHVybjtsZXRbZSx0XT1ucih0aGlzLiN0KTtpZih0IT09MClyZXR1cm47cmV0dXJuIGV9bGlzdCgpe2lmKHRoaXMuI3Q9PT12b2lkIDApcmV0dXJuW107cmV0dXJuIHRoaXMuI3QuZW50cmllcy5tYXAoSmMpfWFzeW5jIHNhdmUoZSx0KXtsZXQgcj10aGlzLiNlIT09dm9pZCAwfHx0aGlzLiN0IT09dm9pZCAwJiZ0aGlzLiN0LmVudHJpZXMubGVuZ3RoPjAsW24sc109cW8odGhpcy4jbyx0Py5sYWJlbCxyKTtpZihzIT09MHx8bj09PXZvaWQgMClyZXR1cm4gYSgxMCk7aWYodD8ucGVyc2lzdD09PSEwKXJldHVybiBhKDEwKTtyZXR1cm4gdGhpcy4jbz1uLHRoaXMuI2U9ZSxmKHRoaXMuI2UpfWFzeW5jIGJpbmRBbmRTYXZlKGUsdCl7bGV0IHI9dGhpcy4jdCxuPXQ/LmNyZWRJZCxzPW4gaW5zdGFuY2VvZiBVaW50OEFycmF5P24uYnl0ZUxlbmd0aD4wOm4hPT12b2lkIDAmJm4ubGVuZ3RoPjA7aWYoIXMmJnIhPT12b2lkIDAmJnIuZW50cmllcy5sZW5ndGg+PVFjKXJldHVybiBhKDI2KTtsZXQgbz1ZaSh0Py5uaWNrKSxpPXQ/LmV4Y2x1ZGVDcmVkZW50aWFscz8/KHM/dm9pZCAwOlpjKHIpKSxjPXQ/LnNhbHQ/P3I/LnNhbHQsdT1yPT09dm9pZCAwP3ZvaWQgMDpyLmVudHJpZXMubWFwKChiKT0+KHtjcmVkSWQ6Yi5jcmVkSWQsdGFnOmIudGFnfSkpLFtkLGxdPWF3YWl0IGUuYmluZCh7Li4udGhpcy4jbixzYWx0OmMsY3JlZElkOm4sY3JlYXRlQ3JlZElmTmVlZGVkOnQ/LmNyZWF0ZUNyZWRJZk5lZWRlZD8/IXMsZXhjbHVkZUNyZWRlbnRpYWxzOmksdXNlck5hbWU6dGhpcy4jcyxkaXNwbGF5TmFtZTpvPz90aGlzLiNuLnJwTmFtZT8/dGhpcy4jcyxhdXRoZW50aWNhdG9yQXR0YWNobWVudDp0Py5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxoaW50czp0Py5oaW50c30sdSk7aWYobCE9PTApcmV0dXJuIGEobCk7bGV0IHA9RGF0ZS5ub3coKSx5PXt0eXBlOiJwcmYiLHNlYWxlZE1hc3RlcjpkLnNlYWxlZE1hc3RlcixjcmVkSWQ6ZC5jcmVkSWQsdGFnOmQudGFnLHVzZXJJZDpkLnVzZXJJZCxuaWNrOm8sZW5yb2xsZWRBdDpwLGxhc3RVc2VkQXQ6cCxhdHRhY2htZW50OmQuYXR0YWNobWVudCx0cmFuc3BvcnRzOmQudHJhbnNwb3J0cyxhYWd1aWQ6ZC5hYWd1aWQsZW5yb2xsZWRPczokYygpfSxtPXI9PT12b2lkIDA/e3NhbHQ6ZC5zYWx0LnNsaWNlKCksZW50cmllczpbXX06cixbaCxnXT1ldShtLHkpO2lmKGchPT0wKXJldHVybiBhKGcpO2xldCBTPWF3YWl0IHRoaXMuI3IoaCk7aWYoUyE9PTApcmV0dXJuIGEoUyk7cmV0dXJuIHRoaXMuI3Q9aCx0aGlzLiNlPWUsZih0aGlzLiNlKX1hc3luYyBsb2FkKCl7cmV0dXJuIHRoaXMuI2V9YXN5bmMgdW5sb2NrKCl7bGV0IGU9dGhpcy4jaTtpZihlIT09dm9pZCAwKXtsZXRbaSxjXT1hd2FpdCBlKCk7aWYoYyE9PTApcmV0dXJuIGEoYyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYSgxMyk7aWYoaS5rZXlyaW5nPT09dm9pZCAwKXRoaXMuI3Q9dm9pZCAwO2Vsc2V7bGV0W3UsZF09bnIoaS5rZXlyaW5nKTtpZihkIT09MClyZXR1cm4gYShkKTt0aGlzLiN0PXV9cmV0dXJuIHRoaXMuI2U9aS5lbmNsYXZlLGYoaS5lbmNsYXZlKX1sZXQgdD10aGlzLiN0O2lmKHQ9PT12b2lkIDB8fHQuZW50cmllcy5sZW5ndGg9PT0wKXJldHVybiBhKDIyKTtsZXRbcixuXT1hd2FpdCB5ZS51bnNlYWxXaXRoUGFzc2tleSh0LmVudHJpZXMubWFwKChpKT0+KHtzZWFsZWRNYXN0ZXI6aS5zZWFsZWRNYXN0ZXIsY3JlZElkOmkuY3JlZElkfSkpLHsuLi50aGlzLiNuLHNhbHQ6dC5zYWx0fSk7aWYobiE9PTApcmV0dXJuIGEobik7dGhpcy4jZT1yLmVuY2xhdmU7bGV0W3Msb109YXModCxyLmNyZWRJZCk7aWYobyE9PTApcmV0dXJuIGEobyk7aWYocyE9PXZvaWQgMCl7bGV0IGk9YXdhaXQgdGhpcy4jcihzKTtpZihpIT09MClyZXR1cm4gYShpKTt0aGlzLiN0PXN9cmV0dXJuIGYoci5lbmNsYXZlKX1hc3luYyByZW5hbWUoZSx0KXtsZXQgcj10aGlzLiN0O2lmKHI9PT12b2lkIDApcmV0dXJuIGEoMjIpO2xldCBuPXIuZW50cmllcy5maW5kSW5kZXgoKGwpPT5HKGwuY3JlZElkLGUpKTtpZihuPDApcmV0dXJuIGEoMTMpO2xldFtzLG9dPXNyKHIuZW50cmllcyk7aWYobyE9PTApcmV0dXJuIGEobyk7bGV0IGk9c1tuXTtpZihpPT09dm9pZCAwKXJldHVybiBhKDEzKTtsZXQgYz1ZaSh0KTtzW25dPXsuLi5pLG5pY2s6Y307bGV0IHU9e3NhbHQ6ci5zYWx0LnNsaWNlKCksZW50cmllczpzfSxkPWF3YWl0IHRoaXMuI3IodSk7aWYoZCE9PTApcmV0dXJuIGEoZCk7cmV0dXJuIHRoaXMuI3Q9dSxmKHZvaWQgMCl9YXN5bmMgcmVtb3ZlKGUpe2xldCB0PXRoaXMuI3Q7aWYodD09PXZvaWQgMClyZXR1cm4gYSgyMik7bGV0IHI9dC5lbnRyaWVzLmZpbHRlcigoYyk9PiFHKGMuY3JlZElkLGUpKTtpZihyLmxlbmd0aD09PXQuZW50cmllcy5sZW5ndGgpcmV0dXJuIGEoMTMpO2lmKHIubGVuZ3RoPT09MCl7bGV0IGM9YXdhaXQgdGhpcy4jcih2b2lkIDApO2lmKGMhPT0wKXJldHVybiBhKGMpO3JldHVybiB0aGlzLiN0PXZvaWQgMCxmKHZvaWQgMCl9bGV0W24sc109c3Iocik7aWYocyE9PTApcmV0dXJuIGEocyk7bGV0IG89e3NhbHQ6dC5zYWx0LnNsaWNlKCksZW50cmllczpufSxpPWF3YWl0IHRoaXMuI3Iobyk7aWYoaSE9PTApcmV0dXJuIGEoaSk7cmV0dXJuIHRoaXMuI3Q9byxmKHZvaWQgMCl9YXN5bmMgd2lwZSgpe3RoaXMuI2U9dm9pZCAwLHRoaXMuI3Q9dm9pZCAwLHRoaXMuI289dm9pZCAwLGF3YWl0IHRoaXMuI3Iodm9pZCAwKX19ZnVuY3Rpb24gWWkoZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9ZS50cmltKCk7cmV0dXJuIHQ9PT0iIj92b2lkIDA6dH1mdW5jdGlvbiAkYygpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUiKXJldHVybjtyZXR1cm4gUmkobmF2aWdhdG9yLnVzZXJBZ2VudCl9ZnVuY3Rpb24gemMoZSl7bGV0W3Qscl09b3QoZS5zZWFsZWRNYXN0ZXIuc2xpY2UoKSk7aWYociE9PTApcmV0dXJuIGEocik7bGV0W24sc109RmUoZS50YWcuc2xpY2UoKSxZLkJpbmRUYWcpO2lmKHMhPT0wKXJldHVybiBhKHMpO3JldHVybiBmKHt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp0LGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzpuLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfSl9ZnVuY3Rpb24gc3IoZSl7bGV0IHQ9W107Zm9yKGxldCByIG9mIGUpe2xldFtuLHNdPXpjKHIpO2lmKHMhPT0wKXJldHVybiBhKHMpO3QucHVzaChuKX1yZXR1cm4gZih0KX1mdW5jdGlvbiBucihlKXtsZXRbdCxyXT1zcihlLmVudHJpZXMpO2lmKHIhPT0wKXJldHVybiBhKHIpO3JldHVybiBmKHtzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6dH0pfWZ1bmN0aW9uIEppKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiBZYyhlKXtpZighSmkoZSl8fGUudHlwZSE9PSJwcmYiKXJldHVybjtpZighKGUuc2VhbGVkTWFzdGVyIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEoZS5jcmVkSWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShlLnRhZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHx0eXBlb2YgZS5lbnJvbGxlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoZS5lbnJvbGxlZEF0KSlyZXR1cm47bGV0W3Qscl09b3QoZS5zZWFsZWRNYXN0ZXIpO2lmKHIhPT0wKXJldHVybjtsZXRbbixzXT1GZShlLnRhZy5zbGljZSgpLFkuQmluZFRhZyk7aWYocyE9PTApcmV0dXJuO2xldCBvPWUuYXR0YWNobWVudD09PSJwbGF0Zm9ybSJ8fGUuYXR0YWNobWVudD09PSJjcm9zcy1wbGF0Zm9ybSI/ZS5hdHRhY2htZW50OnZvaWQgMCxpPWUuZW5yb2xsZWRPcyxjPWk9PT0iaW9zInx8aT09PSJtYWNvcyJ8fGk9PT0iYW5kcm9pZCJ8fGk9PT0id2luZG93cyJ8fGk9PT0ibGludXgifHxpPT09Im90aGVyIj9pOnZvaWQgMCx1PUFycmF5LmlzQXJyYXkoZS50cmFuc3BvcnRzKT9lLnRyYW5zcG9ydHMuZmlsdGVyKChkKT0+dHlwZW9mIGQ9PT0ic3RyaW5nIik6dm9pZCAwO3JldHVybnt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp0LGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzpuLHVzZXJJZDplLnVzZXJJZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZS51c2VySWQuc2xpY2UoKTp2b2lkIDAsbmljazp0eXBlb2YgZS5uaWNrPT09InN0cmluZyI/ZS5uaWNrOnZvaWQgMCxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OnR5cGVvZiBlLmxhc3RVc2VkQXQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKGUubGFzdFVzZWRBdCk/ZS5sYXN0VXNlZEF0OnZvaWQgMCxhdHRhY2htZW50Om8sdHJhbnNwb3J0czp1PT09dm9pZCAwfHx1Lmxlbmd0aD09PTA/dm9pZCAwOnUsYWFndWlkOmUuYWFndWlkIGluc3RhbmNlb2YgVWludDhBcnJheT9lLmFhZ3VpZC5zbGljZSgpOnZvaWQgMCxlbnJvbGxlZE9zOmN9fWZ1bmN0aW9uIFppKGUpe2lmKCFKaShlKSlyZXR1cm47aWYoIShlLnNhbHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IUFycmF5LmlzQXJyYXkoZS5lbnRyaWVzKSlyZXR1cm47bGV0IHQ9W107Zm9yKGxldCByIG9mIGUuZW50cmllcyl7bGV0IG49WWMocik7aWYobiE9PXZvaWQgMCl0LnB1c2gobil9aWYodC5sZW5ndGg9PT0wKXJldHVybjtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnR9fWZ1bmN0aW9uIEpjKGUpe3JldHVybnt0eXBlOiJwcmYiLGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfX1mdW5jdGlvbiBaYyhlKXtpZihlPT09dm9pZCAwKXJldHVybltdO3JldHVybiBlLmVudHJpZXMuZmlsdGVyKCh0KT0+dC5jcmVkSWQuYnl0ZUxlbmd0aD4wKS5tYXAoKHQpPT50LmNyZWRJZC5zbGljZSgpKX1mdW5jdGlvbiBldShlLHQpe2xldFtyLG5dPXNyKGUuZW50cmllcyk7aWYobiE9PTApcmV0dXJuIGEobik7bGV0IHM9ci5maW5kSW5kZXgoKG8pPT5HKG8uY3JlZElkLHQuY3JlZElkKSk7aWYocz49MCl7bGV0IG89cltzXTtyW3NdPXsuLi50LGVucm9sbGVkQXQ6bz8uZW5yb2xsZWRBdD8/dC5lbnJvbGxlZEF0LG5pY2s6dC5uaWNrPz9vPy5uaWNrfX1lbHNlIHIucHVzaCh0KTtyZXR1cm4gZih7c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnJ9KX1mdW5jdGlvbiBhcyhlLHQpe2lmKHQuYnl0ZUxlbmd0aD09PTApcmV0dXJuIGYodm9pZCAwKTtsZXQgcj1lLmVudHJpZXMuZmluZEluZGV4KChpKT0+RyhpLmNyZWRJZCx0KSk7aWYocjwwKXJldHVybiBmKHZvaWQgMCk7bGV0W24sc109c3IoZS5lbnRyaWVzKTtpZihzIT09MClyZXR1cm4gYShzKTtsZXQgbz1uW3JdO2lmKG89PT12b2lkIDApcmV0dXJuIGEoMTMpO3JldHVybiBuW3JdPXsuLi5vLGxhc3RVc2VkQXQ6RGF0ZS5ub3coKX0sZih7c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOm59KX12YXIgZ1M9enIoImZiZmMzMDA3MTU0ZTRlY2M4YzBiNmUwMjA1NTdkN2JkIiksU1M9enIoImVhOWI4ZDY2NGQwMTFkMjEzY2U0YjZiNDhjYjU3NWQ0IiksYlM9enIoIjA4OTg3MDU4Y2FkYzRiODFiNmUxMzBkZTUwZGNiZTk2IiksSVM9enIoIjJmYzA1NzlmODExMzQ3ZWFiMTE2YmI1YThkYjkyMDJhIik7ZnVuY3Rpb24genIoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoMTYpO2ZvcihsZXQgcj0wO3I8MTY7cisrKXRbcl09TnVtYmVyLnBhcnNlSW50KGUuc2xpY2UocioyLHIqMisyKSwxNik7cmV0dXJuIHR9RCgpO2ZlKCk7QygpO2FzeW5jIGZ1bmN0aW9uIGVhKGUsdCl7bGV0W3Isbl09YXdhaXQgZS5maW5nZXJwcmludCh0KTtpZihuIT09MClyZXR1cm4gYShuKTtyZXR1cm4gRmUoci5zbGljZSgpLFkuRmluZ2VycHJpbnQpfWFzeW5jIGZ1bmN0aW9uIHRhKGUsdCl7bGV0IHI9YXdhaXQgZS5nZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCksW24sc109YXdhaXQgZWEodCxyKTtpZihzIT09MClyZXR1cm4gYShzKTtyZXR1cm4gZih7bjpyLGg6bn0pfWFzeW5jIGZ1bmN0aW9uIGNzKGUsdCl7bGV0W3Isbl09YXdhaXQgZWEoZSx0Lm4pO2lmKG4hPT0wKXJldHVybiExO3JldHVybiB0dShyLHQuaCl9ZnVuY3Rpb24gcmEoZSl7aWYoZT09PXZvaWQgMHx8ZT09PW51bGx8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuO2xldCB0PWU7aWYoISh0Lm4gaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8ISh0LmggaW5zdGFuY2VvZiBVaW50OEFycmF5KSlyZXR1cm47aWYodC5uLmJ5dGVMZW5ndGg8MSlyZXR1cm47bGV0W3Isbl09RmUodC5oLnNsaWNlKCksWS5GaW5nZXJwcmludCk7aWYobiE9PTApcmV0dXJuO3JldHVybntuOnQubi5zbGljZSgpLGg6cn19ZnVuY3Rpb24gbmEoZSl7bGV0IHQ9ZS5uLnNsaWNlKCksW3Isbl09RmUoZS5oLnNsaWNlKCksWS5GaW5nZXJwcmludCk7aWYobiE9PTApcmV0dXJue246dCxoOmUuaH07cmV0dXJue246dCxoOnJ9fWZ1bmN0aW9uIHR1KGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmJ5dGVMZW5ndGg7bisrKXJ8PWVbbl1edFtuXTtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gdXMoZSl7aWYoZT09PSIifHx0eXBlb2YgaW5kZXhlZERCPiJ1IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIG5ldyBQcm9taXNlKCh0LHIpPT57bGV0IG49aW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGUpO24ub25zdWNjZXNzPSgpPT50KCksbi5vbmVycm9yPSgpPT5yKG4uZXJyb3I/P0Vycm9yKGBbRElQTE9NQVRJQ10gZGVsZXRlRGF0YWJhc2UgZmFpbGVkICgke2V9KWApKSxuLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIGRlbGV0ZURhdGFiYXNlIGJsb2NrZWQgKCR7ZX0pYCl9fSl9ZnVuY3Rpb24gZHMoZSx0LHIpe3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBvPWluZGV4ZWREQi5vcGVuKGUsdCk7by5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0OmksdHJhbnNhY3Rpb246Y309bztpZihjPT09bnVsbCl7cyhFcnJvcihgW0RJUExPTUFUSUNdIG1pc3NpbmcgdXBncmFkZSB0cmFuc2FjdGlvbiAoJHtlfSlgKSk7cmV0dXJufXRyeXtyKGksYyl9Y2F0Y2godSl7cyh1IGluc3RhbmNlb2YgRXJyb3I/dTpFcnJvcihTdHJpbmcodSkpKX19LG8ub25ibG9ja2VkPSgpPT57Y29uc29sZS53YXJuKGBbRElQTE9NQVRJQ10gSURCIHVwZ3JhZGUgYmxvY2tlZCAoJHtlfSDihpIgdiR7dH0pYCl9LG8ub25zdWNjZXNzPSgpPT57bGV0IGk9by5yZXN1bHQ7aS5vbnZlcnNpb25jaGFuZ2U9KCk9PntpLmNsb3NlKCl9LG4oaSl9LG8ub25lcnJvcj0oKT0+e3Moby5lcnJvcj8/RXJyb3IoYFtESVBMT01BVElDXSBJREIgb3BlbiBmYWlsZWQgKCR7ZX0pYCkpfX0pfWNlKCk7dmFyIHNhPSJtZXRhIixvYT0xLGlhPTk7ZnVuY3Rpb24gcnUoKXtsZXQgZT1uZXcgVWludDhBcnJheSgxNik7cmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSxldChlKX1mdW5jdGlvbiBudShlKXtyZXR1cm5gZGF0YS0ke2V9YH1mdW5jdGlvbiBzdShlKXtyZXR1cm5gZW50cy0ke2V9YH1mdW5jdGlvbiBscyhlLHQpe2xldCByPWUhPT12b2lkIDAmJmUhPT0iIj9lOnJ1KCk7aWYodCE9PXZvaWQgMCYmdCE9PSIiKXJldHVybnthY2N0OnIsZGF0YTp0fTtyZXR1cm57YWNjdDpyLGRhdGE6bnUocil9fWZ1bmN0aW9uIGFhKGUsdCl7aWYodCE9PXZvaWQgMCYmdCE9PSIiKXJldHVybiB0O3JldHVybiBzdShlKX1EKCk7QygpO2NsYXNzIGZze2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBlbnEoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihTZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFNlKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsbyk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pm8oci5lcnJvcik7Zm9yKGxldCBpIG9mIHQpbi5wdXQoaSxCbihpLmhvc3QsaS5zZXEsaS5yZWFsbSkpfSl9YXN5bmMgZGVxKGUsdCxyKXtsZXQgbj1bLi4udF07aWYobi5sZW5ndGg9PT0wKXJldHVybjtsZXQgcz10aGlzLmRiLnRyYW5zYWN0aW9uKFNlLCJyZWFkd3JpdGUiKSxvPXMub2JqZWN0U3RvcmUoU2UpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxjKT0+e3Mub25jb21wbGV0ZT0oKT0+aSgpLHMub25lcnJvcj0oKT0+YyhzLmVycm9yKTtmb3IobGV0IHUgb2YgbilvLmRlbGV0ZShCbihlLHUscikpfSl9YXN5bmMgbGlzdCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oU2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoU2UpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PnIocy5yZXN1bHQpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihTZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShTZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihTZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKFNlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fUQoKTtmZSgpO2Z1bmN0aW9uIHBzKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiB5cyhlKXtpZighcHMoZSkpcmV0dXJuITE7cmV0dXJuIHR5cGVvZiBlLmhvc3Q9PT0ic3RyaW5nIiYmdHlwZW9mIGUubGFiZWw9PT0ic3RyaW5nIiYmdHlwZW9mIGUuaW5kZXg9PT0ibnVtYmVyIiYmTnVtYmVyLmlzSW50ZWdlcihlLmluZGV4KSYmdHlwZW9mIGUubGFzdFNlcT09PSJudW1iZXIiJiZOdW1iZXIuaXNJbnRlZ2VyKGUubGFzdFNlcSkmJmUubGFzdFNlcT49MH1mdW5jdGlvbiBvdShlKXtsZXQgdD1bXTtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdDtmb3IobGV0IHIgb2YgZSl7aWYoIXlzKHIpKWNvbnRpbnVlO3QucHVzaCh7bGFiZWw6ci5sYWJlbCxpbmRleDpyLmluZGV4LGxhc3RTZXE6ci5sYXN0U2VxfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaXUoZSl7bGV0IHQ9bmV3IE1hcDtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdDtmb3IobGV0IHIgb2YgZSl7aWYoIXlzKHIpKWNvbnRpbnVlO2xldCBuPXQuZ2V0KHIuaG9zdCk/P1tdO24ucHVzaCh7bGFiZWw6ci5sYWJlbCxpbmRleDpyLmluZGV4LGxhc3RTZXE6ci5sYXN0U2VxfSksdC5zZXQoci5ob3N0LG4pfXJldHVybiB0fWZ1bmN0aW9uIGNhKGUsdCl7bGV0IHI9T28odCksbj17bGFiZWw6ZS5sYWJlbCxoYW5kbGU6bmV3IFVSTChlLmhhbmRsZSksaWR4OmUuaWR4LGxhc3RTZXE6ci5sYXN0U2VxLGNsb2NrT2Zmc2V0OmUuY2xvY2tPZmZzZXQsc3Vic2NyaXB0aW9uOmUuc3Vic2NyaXB0aW9ufTtpZihyLnNlcXMhPT12b2lkIDApbi5zZXFzPXIuc2VxcztyZXR1cm4gbn1mdW5jdGlvbiB1YShlKXtsZXQgdD17bGFiZWw6ZS5sYWJlbCxoYW5kbGU6ZS5oYW5kbGUudG9TdHJpbmcoKX07aWYoZS5pZHghPT12b2lkIDApdC5pZHg9ZS5pZHg7aWYoZS5jbG9ja09mZnNldCE9PXZvaWQgMCl0LmNsb2NrT2Zmc2V0PWUuY2xvY2tPZmZzZXQ7aWYoZS5zdWJzY3JpcHRpb24hPT12b2lkIDApdC5zdWJzY3JpcHRpb249ZS5zdWJzY3JpcHRpb247cmV0dXJuIHR9Y2xhc3MgbXN7ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGFkZChlKXtsZXQgdD1hd2FpdCB0aGlzLmdldChlLmxhYmVsKSxyPXQhPT12b2lkIDAmJnQuaGFuZGxlLmhyZWY9PT1lLmhhbmRsZS5ocmVmJiYodC5pZHg/PzApPT09KGUuaWR4Pz8wKSxuPXVhKHImJnQhPT12b2lkIDA/ey4uLmUsY2xvY2tPZmZzZXQ6dC5jbG9ja09mZnNldCxzdWJzY3JpcHRpb246dC5zdWJzY3JpcHRpb259OmUpLHM9dGhpcy5kYi50cmFuc2FjdGlvbihbZGUsbWVdLCJyZWFkd3JpdGUiKSxvPXMub2JqZWN0U3RvcmUoZGUpLGk9cy5vYmplY3RTdG9yZShtZSk7cmV0dXJuIG5ldyBQcm9taXNlKChjLHUpPT57aWYocy5vbmNvbXBsZXRlPSgpPT5jKCkscy5vbmVycm9yPSgpPT51KHMuZXJyb3IpLHIpe28ucHV0KG4pO3JldHVybn1sZXQgZD1pLmluZGV4KCJob3N0IikuZ2V0QWxsS2V5cyhlLmxhYmVsKTtkLm9uc3VjY2Vzcz0oKT0+e2ZvcihsZXQgbCBvZiBkLnJlc3VsdClpLmRlbGV0ZShsKTtvLnB1dChuKX19KX1hc3luYyB0b3VjaChlLHQscil7cmV0dXJuIHRoaXMucmVjb3JkU2VxcyhlLHtsYXN0U2VxOnR9LHIpfWFzeW5jIHJlY29yZFNlcXMoZSx0LHIpe2xldCBuPXI/P3Escz10aGlzLmRiLnRyYW5zYWN0aW9uKFtkZSxtZV0sInJlYWR3cml0ZSIpLG89cy5vYmplY3RTdG9yZShkZSksaT1zLm9iamVjdFN0b3JlKG1lKSxjPVtlLG4ubGFiZWwsbi5pbmRleF07cmV0dXJuIG5ldyBQcm9taXNlKCh1LGQpPT57cy5vbmNvbXBsZXRlPSgpPT51KCkscy5vbmVycm9yPSgpPT5kKHMuZXJyb3IpO2xldCBsPW8uZ2V0KGUpO2wub25zdWNjZXNzPSgpPT57aWYoIWwucmVzdWx0KXJldHVybjtsZXQgcD1pLmdldChjKTtwLm9uc3VjY2Vzcz0oKT0+e2xldCB5PXAucmVzdWx0LG09eXMoeSk/eS5sYXN0U2VxOjAsaD1MbyhtLHQpO2lmKGg9PT12b2lkIDApcmV0dXJuO2kucHV0KHtob3N0OmUsbGFiZWw6bi5sYWJlbCxpbmRleDpuLmluZGV4LGxhc3RTZXE6aH0pfX19KX1hc3luYyBnZXQoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihbZGUsbWVdLCJyZWFkb25seSIpLHI9dC5vYmplY3RTdG9yZShkZSksbj10Lm9iamVjdFN0b3JlKG1lKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsbyk9Pnt0Lm9uZXJyb3I9KCk9Pm8odC5lcnJvcik7bGV0IGksYyx1PTIsZD0oKT0+e2lmKHUtPTEsdT4wKXJldHVybjtpZighcHMoaSkpe3Modm9pZCAwKTtyZXR1cm59cyhjYShpLG91KGMpKSl9LGw9ci5nZXQoZSk7bC5vbnN1Y2Nlc3M9KCk9PntpPWwucmVzdWx0LGQoKX07bGV0IHA9bi5pbmRleCgiaG9zdCIpLmdldEFsbChlKTtwLm9uc3VjY2Vzcz0oKT0+e2M9cC5yZXN1bHQsZCgpfX0pfWFzeW5jIHNldChlLHQpe2xldCByPWF3YWl0IHRoaXMuZ2V0KGUpO2lmKCFyKXJldHVybiAxMzt0cnl7cmV0dXJuIGF3YWl0IHRoaXMucHV0KHVhKHsuLi5yLC4uLnR9KSksMH1jYXRjaHtyZXR1cm4gMTh9fWFzeW5jIGRlbChlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKFtkZSxtZV0sInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShkZSksbj10Lm9iamVjdFN0b3JlKG1lKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsbyk9Pnt0Lm9uY29tcGxldGU9KCk9PnMoKSx0Lm9uZXJyb3I9KCk9Pm8odC5lcnJvciksci5kZWxldGUoZSk7bGV0IGk9bi5pbmRleCgiaG9zdCIpLmdldEFsbEtleXMoZSk7aS5vbnN1Y2Nlc3M9KCk9Pntmb3IobGV0IGMgb2YgaS5yZXN1bHQpbi5kZWxldGUoYyl9fSl9YXN5bmMgbGlzdCgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oW2RlLG1lXSwicmVhZG9ubHkiKSx0PWUub2JqZWN0U3RvcmUoZGUpLHI9ZS5vYmplY3RTdG9yZShtZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57ZS5vbmVycm9yPSgpPT5zKGUuZXJyb3IpO2xldCBvLGksYz0yLHU9KCk9PntpZihjLT0xLGM+MClyZXR1cm47bGV0IHA9aXUoaSkseT1bXTtpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgbSBvZiBvKXtpZighcHMobSl8fHR5cGVvZiBtLmxhYmVsIT09InN0cmluZyIpY29udGludWU7eS5wdXNoKGNhKG0scC5nZXQobS5sYWJlbCk/P1tdKSl9bih5KX0sZD10LmdldEFsbCgpO2Qub25zdWNjZXNzPSgpPT57bz1kLnJlc3VsdCx1KCl9O2xldCBsPXIuZ2V0QWxsKCk7bC5vbnN1Y2Nlc3M9KCk9PntpPWwucmVzdWx0LHUoKX19KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihbZGUsbWVdLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoZGUpLHI9ZS5vYmplY3RTdG9yZShtZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57ZS5vbmNvbXBsZXRlPSgpPT5uKCksZS5vbmVycm9yPSgpPT5zKGUuZXJyb3IpLHQuY2xlYXIoKSxyLmNsZWFyKCl9KX1wdXQoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihkZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKGRlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5wdXQoZSl9KX19ZnVuY3Rpb24gZ3MoKXtyZXR1cm4gZHMoc2Esb2EsKGUpPT57aWYoIWUub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh3ZSkpZS5jcmVhdGVPYmplY3RTdG9yZSh3ZSx7a2V5UGF0aDoibGFiZWwifSl9KX1mdW5jdGlvbiBTcyhlKXtyZXR1cm4gZHMoZSxpYSxhdSl9ZnVuY3Rpb24gYXUoZSx0KXtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGRlKSllLmNyZWF0ZU9iamVjdFN0b3JlKGRlLHtrZXlQYXRoOiJsYWJlbCJ9KTtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGJlKSllLmNyZWF0ZU9iamVjdFN0b3JlKGJlLHtrZXlQYXRoOlsiaG9zdCIsImhhc2giXX0pO2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU2UpKWUuY3JlYXRlT2JqZWN0U3RvcmUoU2UpO2xldCByO2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoZWUpKXI9ZS5jcmVhdGVPYmplY3RTdG9yZShlZSk7ZWxzZSByPXQub2JqZWN0U3RvcmUoZWUpO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoVXQpKXIuY3JlYXRlSW5kZXgoVXQsImFwbGQiLHt1bmlxdWU6ITF9KTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKGhzKSlyLmNyZWF0ZUluZGV4KGhzLCJybG0iLHt1bmlxdWU6ITF9KTtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHhlKSllLmNyZWF0ZU9iamVjdFN0b3JlKHhlLHtrZXlQYXRoOiJsYWJlbCJ9KTtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG1lKSllLmNyZWF0ZU9iamVjdFN0b3JlKG1lLHtrZXlQYXRoOlsiaG9zdCIsImxhYmVsIiwiaW5kZXgiXX0pLmNyZWF0ZUluZGV4KCJob3N0IiwiaG9zdCIse3VuaXF1ZTohMX0pfWNlKCk7RCgpO2NsYXNzIGJze2RiO2NyeXB0bztjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGI9ZTt0aGlzLmNyeXB0bz10fWFzeW5jIGFkZChlKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGVlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoZWUpO3JldHVybiBuZXcgUHJvbWlzZSgobik9PntpZihlLmxlbmd0aD09PTApe24oW10pO3JldHVybn1sZXQgcz1BcnJheShlLmxlbmd0aCkuZmlsbCgwKTt0Lm9uY29tcGxldGU9KCk9Pm4ocyksdC5vbmVycm9yPSgpPT57Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT0xODtuKHMpfTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7bGV0e2tleTppLGRhdGE6Y309ZVtvXSx1PUsoaSksZD1yLnB1dChDcihjKSx1KTtkLm9uZXJyb3I9KGwpPT57bC5wcmV2ZW50RGVmYXVsdCgpLHNbb109MTh9fX0pfWFzeW5jIGRlbChlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKGVlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoZWUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxvKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+byhyLmVycm9yKTtmb3IobGV0IGkgb2YgdCl7bGV0IGM9SyhpKTtuLmRlbGV0ZShjKX19KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihlZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShlZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IG89SyhlKSxpPXIuZ2V0KG8pO2kub25zdWNjZXNzPWFzeW5jKCk9PntsZXQgYz1pLnJlc3VsdDtpZihjKW4oYXdhaXQgSHIoZSxjLHRoaXMuY3J5cHRvKSk7ZWxzZSBuKHZvaWQgMCl9LGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIGhhcyhlKXtyZXR1cm4gYXdhaXQgdGhpcy5nZXQoZSkhPT12b2lkIDB9YXN5bmMgbGlzdChlKXtsZXQgdD1lPy5hcGxkLHI9ZT8uYm9keSE9PSExLHM9dGhpcy5kYi50cmFuc2FjdGlvbihlZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShlZSk7cmV0dXJuIG5ldyBQcm9taXNlKChvLGkpPT57bGV0IGM9W10sdT10PT09dm9pZCAwP3Mub3BlbkN1cnNvcigpOnMuaW5kZXgoVXQpLm9wZW5DdXJzb3IoSURCS2V5UmFuZ2Uub25seSh0KSk7dS5vbnN1Y2Nlc3M9KGQpPT57bGV0IGw9ZC50YXJnZXQucmVzdWx0O2lmKGwpe2xldCBwPXQ9PT12b2lkIDA/bC5rZXk6bC5wcmltYXJ5S2V5LHk9bC52YWx1ZTtjLnB1c2goe2hhc2g6RWUocCksZGF0YTp5fSksbC5jb250aW51ZSgpfWVsc2UgUHJvbWlzZS5hbGwoYy5tYXAoKHtoYXNoOnAsZGF0YTp5fSk9PkhyKHAseSx0aGlzLmNyeXB0byx7Ym9keTpyfSkpKS50aGVuKG8pLmNhdGNoKGkpfSx1Lm9uZXJyb3I9KCk9PmkodS5lcnJvcil9KX1hc3luYyBjb3VudChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKGVlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGVlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntsZXQgbz1lPT09dm9pZCAwP3IuY291bnQoKTpyLmluZGV4KFV0KS5jb3VudChJREJLZXlSYW5nZS5vbmx5KGUpKTtvLm9uc3VjY2Vzcz0oKT0+bihvLnJlc3VsdCksby5vbmVycm9yPSgpPT5zKG8uZXJyb3IpfSl9YXN5bmMgbGlzdEtleXMoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKGVlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGVlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz1bXSxvPXQub3BlbktleUN1cnNvcigpO28ub25zdWNjZXNzPShpKT0+e2xldCBjPWkudGFyZ2V0LnJlc3VsdDtpZihjKXMucHVzaChFZShjLmtleSkpLGMuY29udGludWUoKTtlbHNlIHIocyl9LG8ub25lcnJvcj0oKT0+bihvLmVycm9yKX0pfWFzeW5jIGxhc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihlZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShlZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IG8saT1yLm9wZW5DdXJzb3IoKTtpLm9uc3VjY2Vzcz1hc3luYyhjKT0+e2xldCB1PWMudGFyZ2V0LnJlc3VsdDtpZih1KXtsZXR7a2V5OmQsdmFsdWU6bH09dTtpZihHKGUsbC5laWQpKXtpZighb3x8KGwuY3RyPz8wKT4oby5kYXRhLmN0cj8/MCl8fChsLmN0cj8/MCk9PT0oby5kYXRhLmN0cj8/MCkmJihsLm9mZj8/MCk+KG8uZGF0YS5vZmY/PzApKW89e2tleTpkLGRhdGE6bH19dS5jb250aW51ZSgpfWVsc2UgaWYobyl7bGV0IGQ9RWUoby5rZXkpO24oYXdhaXQgSHIoZCxvLmRhdGEsdGhpcy5jcnlwdG8pKX1lbHNlIG4odm9pZCAwKX0saS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgbWFya0FwcGxpZWQoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihlZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKGVlKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsbyk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pm8oci5lcnJvcik7Zm9yKGxldCBpIG9mIHQpe2xldCBjPUsoaSksdT1uLmdldChjKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBkPXUucmVzdWx0O2lmKCFkKXJldHVybjtfbihkLFJyKSxuLnB1dChkLGMpfSx1Lm9uZXJyb3I9KGQpPT57ZC5wcmV2ZW50RGVmYXVsdCgpfX19KX1hc3luYyBtYXJrRmFpbGVkKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oZWUsInJlYWR3cml0ZSIpLG49ci5vYmplY3RTdG9yZShlZSk7cmV0dXJuIG5ldyBQcm9taXNlKChzLG8pPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5vKHIuZXJyb3IpO2ZvcihsZXR7a2V5OmksZXJyOmN9b2YgdCl7bGV0IHU9SyhpKSxkPW4uZ2V0KHUpO2Qub25zdWNjZXNzPSgpPT57bGV0IGw9ZC5yZXN1bHQ7aWYoIWwpcmV0dXJuO19uKGwsa3QsYyksbi5wdXQobCx1KX0sZC5vbmVycm9yPShsKT0+e2wucHJldmVudERlZmF1bHQoKX19fSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oZWUsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShlZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1EKCk7Y2xhc3MgSXN7ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGxpc3QoKXtsZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKHhlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHhlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz10LmdldEFsbCgpO3Mub25zdWNjZXNzPSgpPT57bGV0IG89cy5yZXN1bHQsaT1bXTtpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgYyBvZiBvKXtsZXQgdT1VcihjKTtpZih1IT09dm9pZCAwKWkucHVzaCh1KX1yKGkpfSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbih4ZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh4ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IG89ci5nZXQoZSk7by5vbnN1Y2Nlc3M9KCk9Pm4oVXIoby5yZXN1bHQpKSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBwdXQoZSx0KXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHhlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoeGUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxvKT0+e2xldCBpPTA7ci5vbmNvbXBsZXRlPSgpPT5zKGkpLHIub25lcnJvcj0oKT0+byhyLmVycm9yKTtsZXQgYz1uLmdldChlKTtjLm9uc3VjY2Vzcz0oKT0+e2xldFt1LGRdPWZpKGUsVXIoYy5yZXN1bHQpLHQpO2lmKGQhPT0wKXtpPWQ7cmV0dXJufW4ucHV0KHUpfX0pfWFzeW5jIHdpcGUoKXtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKHhlLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoeGUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19Y2UoKTtjbGFzcyB3c3tkYjtjb25zdHJ1Y3RvcihlKXt0aGlzLmRiPWV9YXN5bmMgZW5xKGUsdCl7bGV0IHI9Wy4uLnRdO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IG49dGhpcy5kYi50cmFuc2FjdGlvbihiZSwicmVhZHdyaXRlIikscz1uLm9iamVjdFN0b3JlKGJlKTtyZXR1cm4gbmV3IFByb21pc2UoKG8saSk9PntuLm9uY29tcGxldGU9KCk9Pm8oKSxuLm9uZXJyb3I9KCk9Pmkobi5lcnJvcik7Zm9yKGxldCBjIG9mIHIpe2xldCB1PWV0KGMpO3MucHV0KHtob3N0OmUsaGFzaDp1fSl9fSl9YXN5bmMgZGVxKGUsdCl7bGV0IHI9Wy4uLnRdO2lmKHIubGVuZ3RoPT09MClyZXR1cm47bGV0IG49dGhpcy5kYi50cmFuc2FjdGlvbihiZSwicmVhZHdyaXRlIikscz1uLm9iamVjdFN0b3JlKGJlKTtyZXR1cm4gbmV3IFByb21pc2UoKG8saSk9PntuLm9uY29tcGxldGU9KCk9Pm8oKSxuLm9uZXJyb3I9KCk9Pmkobi5lcnJvcik7Zm9yKGxldCBjIG9mIHIpe2xldCB1PWV0KGMpO3MuZGVsZXRlKFtlLHVdKX19KX1hc3luYyBsaXN0KGUpe2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oYmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoYmUpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBvPXIuZ2V0QWxsKCk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgYz1vLnJlc3VsdC5maWx0ZXIoKHUpPT51Lmhvc3Q9PT1lKS5tYXAoKHUpPT51Lmhhc2gpO24oYy5tYXAoKHUpPT5Lcyh1KSkpfSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX1hc3luYyBjb3VudCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oYmUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoYmUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuY291bnQoKTtzLm9uc3VjY2Vzcz0oKT0+cihzLnJlc3VsdCkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oYmUsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShiZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX12YXIgd2U9ImFjY291bnRzIixkZT0iaG9zdHMiLG1lPSJob3N0X3NlcXMiLGJlPSJ1cGxvYWRRdWV1ZSIsU2U9ImRvd25sb2FkUXVldWUiLGVlPSJtZXNzYWdlcyIsVXQ9ImFwbGQiLGhzPSJybG0iLHhlPSJyZWFsbXMiO2Z1bmN0aW9uIGN1KGUsdCl7cmV0dXJue3JlYWxtczpuZXcgSXMoZSksaG9zdHM6bmV3IG1zKGUpLHVwbG9hZHM6bmV3IHdzKGUpLGRvd25sb2FkczpuZXcgZnMoZSksbWVzc2FnZXM6bmV3IGJzKGUsdCl9fWZ1bmN0aW9uIGRhKCl7cmV0dXJue3JlYWxtczp7YXN5bmMgbGlzdCgpe3JldHVybltdfSxhc3luYyBnZXQoKXtyZXR1cm59LGFzeW5jIHB1dCgpe3JldHVybiAxM30sYXN5bmMgd2lwZSgpe319LGhvc3RzOnthc3luYyBhZGQoKXt9LGFzeW5jIGdldCgpe3JldHVybn0sYXN5bmMgZGVsKCl7fSxhc3luYyBzZXQoKXtyZXR1cm4gMTN9LGFzeW5jIGxpc3QoKXtyZXR1cm5bXX0sYXN5bmMgd2lwZSgpe30sYXN5bmMgdG91Y2goKXt9LGFzeW5jIHJlY29yZFNlcXMoKXt9fSx1cGxvYWRzOnthc3luYyBlbnEoKXt9LGFzeW5jIGRlcSgpe30sYXN5bmMgbGlzdCgpe3JldHVybltdfSxhc3luYyBjb3VudCgpe3JldHVybiAwfSxhc3luYyB3aXBlKCl7fX0sZG93bmxvYWRzOnthc3luYyBlbnEoKXt9LGFzeW5jIGRlcSgpe30sYXN5bmMgbGlzdCgpe3JldHVybltdfSxhc3luYyBjb3VudCgpe3JldHVybiAwfSxhc3luYyB3aXBlKCl7fX0sbWVzc2FnZXM6e2FzeW5jIGFkZChlKXtyZXR1cm4gZS5tYXAoKCk9PjE4KX0sYXN5bmMgZ2V0KCl7cmV0dXJufSxhc3luYyBoYXMoKXtyZXR1cm4hMX0sYXN5bmMgZGVsKCl7fSxhc3luYyBsaXN0KCl7cmV0dXJuW119LGFzeW5jIGNvdW50KCl7cmV0dXJuIDB9LGFzeW5jIGxpc3RLZXlzKCl7cmV0dXJuW119LGFzeW5jIGxhc3QoKXtyZXR1cm59LGFzeW5jIG1hcmtBcHBsaWVkKCl7fSxhc3luYyBtYXJrRmFpbGVkKCl7fSxhc3luYyB3aXBlKCl7fX19fWNsYXNzIGxhe2FjY291bnQ7cmVhbG1zO2hvc3RzO3VwbG9hZHM7ZG93bmxvYWRzO21lc3NhZ2VzOyNlOyN0OyNuO2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuYWNjb3VudD1lLHRoaXMuI3Q9dCx0aGlzLiNuPXI7bGV0IHM9ZGEoKTtpZih0aGlzLnJlYWxtcz1zLnJlYWxtcyx0aGlzLmhvc3RzPXMuaG9zdHMsdGhpcy51cGxvYWRzPXMudXBsb2Fkcyx0aGlzLmRvd25sb2Fkcz1zLmRvd25sb2Fkcyx0aGlzLm1lc3NhZ2VzPXMubWVzc2FnZXMsbiE9PXZvaWQgMCl0aGlzLiNzKG4pfSNzKGUpe2xldCB0PXRoaXMuI2U7aWYodGhpcy4jZT1lLGUub252ZXJzaW9uY2hhbmdlPSgpPT57aWYodGhpcy4jZSE9PWUpcmV0dXJuO3RoaXMuI3IoKX0sdGhpcy4jaShjdShlLHRoaXMuI3QpKSx0IT09dm9pZCAwJiZ0IT09ZSl0LmNsb3NlKCl9I3IoKXtsZXQgZT10aGlzLiNlO2lmKHRoaXMuI2U9dm9pZCAwLHRoaXMuI2koZGEoKSksZSE9PXZvaWQgMCllLmNsb3NlKCl9I2koZSl7dGhpcy5yZWFsbXM9ZS5yZWFsbXMsdGhpcy5ob3N0cz1lLmhvc3RzLHRoaXMudXBsb2Fkcz1lLnVwbG9hZHMsdGhpcy5kb3dubG9hZHM9ZS5kb3dubG9hZHMsdGhpcy5tZXNzYWdlcz1lLm1lc3NhZ2VzfWFzeW5jIGJpbmQoZSl7aWYodGhpcy4jbj09PXZvaWQgMClyZXR1cm4gdGhpcy4jZT09PXZvaWQgMD8xMzowO2xldCB0PWF3YWl0IHRoaXMuI24oZSk7aWYodD09PXZvaWQgMClyZXR1cm4gMTM7aWYodGhpcy4jZSE9PXZvaWQgMCYmdGhpcy4jZS5uYW1lPT09dClyZXR1cm4gMDtsZXQgcj1hd2FpdCBTcyh0KTtyZXR1cm4gdGhpcy4jcyhyKSwwfWFzeW5jIHByZXBhcmVXb3JrZXIoZSl7bGV0IHQ9YXdhaXQgdGhpcy4jbj8uKGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuIGEoMTMpO2lmKCEodGhpcy5hY2NvdW50IGluc3RhbmNlb2Ygb3IpKXJldHVybiBhKDEwKTtsZXQgcj1hd2FpdCB0aGlzLmFjY291bnQuZW5zdXJlRW50cyhlKTtyZXR1cm4gZih7ZGF0YTp0LGVudHM6cn0pfWNsb3NlKCl7dGhpcy4jcigpfWFzeW5jIHdpcGUoKXthd2FpdCB0aGlzLmhvc3RzLndpcGUoKSxhd2FpdCB0aGlzLnVwbG9hZHMud2lwZSgpLGF3YWl0IHRoaXMuZG93bmxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLm1lc3NhZ2VzLndpcGUoKX19YXN5bmMgZnVuY3Rpb24gZmEoZSx0KXtsZXQgcj1hd2FpdCBTcyh0KTtyZXR1cm4gbmV3IGxhKHthc3luYyBzYXZlKCl7cmV0dXJuIGEoMTApfSxhc3luYyB3aXBlKCl7fX0sZSx2b2lkIDAscil9ZnVuY3Rpb24gcGEoZSl7cmV0dXJuIGUhPT1udWxsJiZ0eXBlb2YgZT09PSJvYmplY3QifWZ1bmN0aW9uIHhzKGUsdCl7bGV0IHI9ZVt0XTtpZih0eXBlb2YgciE9PSJzdHJpbmcifHxyPT09IiIpcmV0dXJuO3JldHVybiByfWZ1bmN0aW9uIHV1KGUsdCl7aWYoZT09PXZvaWQgMClyZXR1cm4gdDtpZih0LmFjY3Q9PT12b2lkIDApdC5hY2N0PWUuYWNjdDtpZih0LmRhdGE9PT12b2lkIDApdC5kYXRhPWUuZGF0YTtpZih0LmVudHM9PT12b2lkIDApdC5lbnRzPWUuZW50cztyZXR1cm4gdH1mdW5jdGlvbiBQcyhlKXtpZighcGEoZSl8fHR5cGVvZiBlLmxhYmVsIT09InN0cmluZyIpcmV0dXJuO2xldCB0PXtsYWJlbDplLmxhYmVsfSxyPXhzKGUsImFjY3QiKSxuPXhzKGUsImRhdGEiKSxzPXhzKGUsImVudHMiKTtpZihyIT09dm9pZCAwKXQuYWNjdD1yO2lmKG4hPT12b2lkIDApdC5kYXRhPW47aWYocyE9PXZvaWQgMCl0LmVudHM9cztsZXQgbz1yYShlLmtleVRhZyksaT1aaShlLmtleXJpbmcpO2lmKG8hPT12b2lkIDApdC5rZXlUYWc9bztpZihpIT09dm9pZCAwKXQua2V5cmluZz1pO3JldHVybiB0fWZ1bmN0aW9uIGR1KGUpe2xldCB0PVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgbj1yLmtleXJpbmc7aWYobj09PXZvaWQgMCljb250aW51ZTtmb3IobGV0IHMgb2Ygbi5lbnRyaWVzKXtpZihzLmNyZWRJZC5ieXRlTGVuZ3RoPT09MCljb250aW51ZTtsZXQgbz0hMTtmb3IobGV0IGkgb2YgdCl7aWYoIUcoaS5jcmVkSWQscy5jcmVkSWQpKWNvbnRpbnVlO2lmKGkubGFiZWwhPT1yLmxhYmVsKXJldHVybiBhKDEwKTtvPSEwO2JyZWFrfWlmKG8pY29udGludWU7dC5wdXNoKHtsYWJlbDpyLmxhYmVsLHNhbHQ6bi5zYWx0LHNlYWxlZE1hc3RlcjpzLnNlYWxlZE1hc3RlcixjcmVkSWQ6cy5jcmVkSWR9KX19cmV0dXJuIGYodCl9ZnVuY3Rpb24gbHUoZSl7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuW107bGV0IHQ9W107Zm9yKGxldCByIG9mIGUpe2xldCBuPVBzKHIpO2lmKG4hPT12b2lkIDApdC5wdXNoKG4pfXJldHVybiB0fWZ1bmN0aW9uIGZ1KGUsdCxyLG4pe2xldCBzPXtsYWJlbDp0LmxhYmVsfTtpZih0LmFjY3QhPT12b2lkIDApcy5hY2N0PXQuYWNjdDtpZih0LmRhdGEhPT12b2lkIDApcy5kYXRhPXQuZGF0YTtpZih0LmVudHMhPT12b2lkIDApcy5lbnRzPXQuZW50cztpZihyIT09dm9pZCAwKXMua2V5VGFnPXI7aWYobiE9PXZvaWQgMClzLmtleXJpbmc9bjtlLnB1dChzKX1jbGFzcyBvcntkYjsjZTsjdDtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuZGI9ZSx0aGlzLiNlPXR9c2V0Q2xvc2VyKGUpe3RoaXMuI3Q9ZX1hc3luYyBjcmVhdGUoZSx0KXtsZXRbcixuXT1qZShlKTtpZihuIT09MHx8cj09PXZvaWQgMClyZXR1cm4gdC5maWxsKDApLGEoMTApO2lmKChhd2FpdCB0aGlzLiNyKHIpKT8ua2V5VGFnIT09dm9pZCAwKXJldHVybiB0LmZpbGwoMCksYSgxOSk7aWYodC5ieXRlTGVuZ3RoPFFyKXJldHVybiB0LmZpbGwoMCksYSgxMCk7bGV0W28saV09YXdhaXQgeWUuZnJvbVJhbmRvbSh0KTtpZihpIT09MClyZXR1cm4gYShpKTtyZXR1cm4gdGhpcy5zYXZlKG8se2xhYmVsOnJ9KX1hc3luYyBzYXZlKGUsdCl7bGV0W3Isbl09amUodD8ubGFiZWwpO2lmKG4hPT0wfHxyPT09dm9pZCAwKXJldHVybiBhKDEwKTtsZXQgcz1hd2FpdCB0aGlzLiNuKGUscik7aWYocyE9PTApcmV0dXJuIGEocyk7cmV0dXJuIGYoZSl9YXN5bmMgZGF0YU5hbWUoZSl7bGV0IHQ9YXdhaXQgdGhpcy4jcihlKTtpZih0PT09dm9pZCAwKXJldHVybjtpZih0LmRhdGEhPT12b2lkIDAmJnQuZGF0YSE9PSIiKXJldHVybiB0LmRhdGE7cmV0dXJuIGF3YWl0IHRoaXMuI28oZSwobik9PntpZihuPT09dm9pZCAwKXJldHVybjtyZXR1cm57Li4ubn19KSwoYXdhaXQgdGhpcy4jcihlKSk/LmRhdGF9YXN5bmMgZW5zdXJlRW50cyhlKXtsZXRbdCxyXT1qZShlKTtpZihyIT09MHx8dD09PXZvaWQgMCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIGludmFsaWQgYWNjb3VudCBsYWJlbCIpO2xldCBuPWF3YWl0IHRoaXMuI3IodCkscz1scyhuPy5hY2N0LG4/LmRhdGEpLG89YWEocy5hY2N0LG4/LmVudHMpO3JldHVybiBhd2FpdCB0aGlzLiNvKHQsKGkpPT4oey4uLmk9PT12b2lkIDA/e2xhYmVsOnR9OnsuLi5pfSxhY2N0OnMuYWNjdCxkYXRhOnMuZGF0YSxlbnRzOm99KSksb31hc3luYyB3aXBlKCl7bGV0IGU9YXdhaXQgdGhpcy4jaSgpO3RoaXMuI3Q/LigpO2ZvcihsZXQgbiBvZiBlKXtpZihuLmRhdGEhPT12b2lkIDApYXdhaXQgdXMobi5kYXRhKTtpZihuLmVudHMhPT12b2lkIDApYXdhaXQgdXMobi5lbnRzKX1sZXQgdD10aGlzLmRiLnRyYW5zYWN0aW9uKHdlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUod2UpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e3Qub25jb21wbGV0ZT0oKT0+bigpLHQub25lcnJvcj0oKT0+cyh0LmVycm9yKSxyLmNsZWFyKCl9KX1hc3luYyBsb2FkS2V5cmluZyhlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLiNzKGUpO2lmKHIhPT0wfHx0PT09dm9pZCAwKXJldHVybjtyZXR1cm4oYXdhaXQgdGhpcy4jcih0KSk/LmtleXJpbmd9YXN5bmMgcGVyc2lzdEtleXJpbmcoZSx0KXtsZXQgcjtpZihlIT09dm9pZCAwKXtsZXRbbyxpXT1ucihlKTtpZihpIT09MClyZXR1cm4gaTtyPW99bGV0W24sc109YXdhaXQgdGhpcy4jcyh0KTtpZihzIT09MClyZXR1cm4gcztpZihuPT09dm9pZCAwKXJldHVybiAxMztyZXR1cm4gYXdhaXQgdGhpcy4jbyhuLChvKT0+e2lmKHI9PT12b2lkIDApe2lmKG8/LmtleVRhZz09PXZvaWQgMClyZXR1cm47cmV0dXJue2xhYmVsOm4sa2V5VGFnOm8ua2V5VGFnfX1sZXQgaT17bGFiZWw6bixrZXlyaW5nOnJ9O2lmKG8/LmtleVRhZyE9PXZvaWQgMClpLmtleVRhZz1vLmtleVRhZztyZXR1cm4gaX0pLDB9YXN5bmMgaGFzS2V5cmluZyhlKXtsZXQgdD1hd2FpdCB0aGlzLmxvYWRLZXlyaW5nKGUpO3JldHVybiB0IT09dm9pZCAwJiZ0LmVudHJpZXMubGVuZ3RoPjB9YXN5bmMgdW5sb2NrKGUpe2xldFt0LHJdPWR1KGF3YWl0IHRoaXMuI2koKSk7aWYociE9PTApcmV0dXJuIGEocik7aWYodD09PXZvaWQgMHx8dC5sZW5ndGg9PT0wKXJldHVybiBhKDIyKTtsZXQgbj10WzBdO2lmKG49PT12b2lkIDApcmV0dXJuIGEoMjIpO2xldFtzLG9dPWF3YWl0IHllLnVuc2VhbFdpdGhQYXNza2V5KHQubWFwKCh5KT0+KHtzZWFsZWRNYXN0ZXI6eS5zZWFsZWRNYXN0ZXIsY3JlZElkOnkuY3JlZElkLHNhbHQ6eS5zYWx0fSkpLHtycElkOmUucnBJZCxycE5hbWU6ZS5ycE5hbWUsc2FsdDpuLnNhbHR9KTtpZihvIT09MClyZXR1cm4gYShvKTtpZihzPT09dm9pZCAwKXJldHVybiBhKDIwKTtsZXQgaT10LmZpbmQoKHkpPT5HKHkuY3JlZElkLHMuY3JlZElkKSk7aWYoaT09PXZvaWQgMClyZXR1cm4gYSgxMyk7bGV0IGM9YXdhaXQgdGhpcy4jcihpLmxhYmVsKSx1PWM/LmtleVRhZztpZih1IT09dm9pZCAwKXtpZighYXdhaXQgY3Mocy5lbmNsYXZlLHUpKXJldHVybiBhKDE5KX1sZXQgZD1jPy5rZXlyaW5nO2lmKGQ9PT12b2lkIDApcmV0dXJuIGEoMTMpO2xldFtsLHBdPWFzKGQscy5jcmVkSWQpO2lmKHAhPT0wKXJldHVybiBhKHApO2lmKGwhPT12b2lkIDApYXdhaXQgdGhpcy4jbyhpLmxhYmVsLCh5KT0+e2xldCBtPXtsYWJlbDppLmxhYmVsLGtleXJpbmc6bH07aWYoeT8ua2V5VGFnIT09dm9pZCAwKW0ua2V5VGFnPXkua2V5VGFnO3JldHVybiBtfSk7cmV0dXJuIGYoe2VuY2xhdmU6cy5lbmNsYXZlLGxhYmVsOmkubGFiZWx9KX1hc3luYyBvcGVuUHJmU3RvcmUoZSx0KXtsZXRbcixuXT1hd2FpdCB0aGlzLiNzKHQpLHM9bj09PTA/YXdhaXQgdGhpcy5sb2FkS2V5cmluZyhyKTp2b2lkIDAsbz1uPT09MD9yOnZvaWQgMDtyZXR1cm4gJHIub3Blbih7cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lLHVzZXJOYW1lOmUudXNlck5hbWUsa2V5cmluZzpzLHBlcnNpc3RLZXlyaW5nOihpKT0+dGhpcy5wZXJzaXN0S2V5cmluZyhpLG8pLHVubG9ja0FjY291bnQ6YXN5bmMoKT0+e2xldFtpLGNdPWF3YWl0IHRoaXMudW5sb2NrKGUpO2lmKGMhPT0wKXJldHVybiBhKGMpO2lmKGk9PT12b2lkIDApcmV0dXJuIGEoMTMpO3JldHVybiBvPWkubGFiZWwsZih7ZW5jbGF2ZTppLmVuY2xhdmUsa2V5cmluZzphd2FpdCB0aGlzLmxvYWRLZXlyaW5nKGkubGFiZWwpfSl9fSl9YXN5bmMjbihlLHQpe2xldCByPWF3YWl0IHRoaXMuI3IodCk7aWYocj8ua2V5VGFnIT09dm9pZCAwKXtpZighYXdhaXQgY3MoZSxyLmtleVRhZykpcmV0dXJuIDE5O3JldHVybiAwfWxldFtuLHNdPWF3YWl0IHRhKHRoaXMuI2UsZSk7aWYocyE9PTApcmV0dXJuIHM7bGV0IG89bmEobiksaT0hMTtpZihhd2FpdCB0aGlzLiNvKHQsKGMpPT57aWYoYz8ua2V5VGFnIT09dm9pZCAwKXJldHVybiBpPSEwLGM7bGV0IHU9e2xhYmVsOnQsa2V5VGFnOm99O2lmKGM/LmtleXJpbmchPT12b2lkIDApdS5rZXlyaW5nPWMua2V5cmluZztyZXR1cm4gdX0pLCFpKXJldHVybiAwO3JldHVybiB0aGlzLiNuKGUsdCl9YXN5bmMjcyhlKXtpZihlIT09dm9pZCAwKXtsZXRbbixzXT1qZShlKTtpZihzIT09MHx8bj09PXZvaWQgMClyZXR1cm4gYSgxMCk7cmV0dXJuIGYobil9bGV0IHQ9YXdhaXQgdGhpcy4jaSgpLHI9dC5sZW5ndGg9PT0xP3RbMF06dm9pZCAwO2lmKHIhPT12b2lkIDApcmV0dXJuIGYoci5sYWJlbCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiBhKDEzKTtyZXR1cm4gYSgxMCl9I3IoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbih3ZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh3ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IG89ci5nZXQoZSk7by5vbnN1Y2Nlc3M9KCk9Pm4oUHMoby5yZXN1bHQpKSxvLm9uZXJyb3I9KCk9PnMoby5lcnJvcil9KX0jaSgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24od2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUod2UpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PnIobHUocy5yZXN1bHQpKSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyNvKGUsdCl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbih3ZSwicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKHdlKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsbyk9PntyLm9uY29tcGxldGU9KCk9PnMoKSxyLm9uZXJyb3I9KCk9Pm8oci5lcnJvcik7bGV0IGk9bi5nZXQoZSk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgYz1wYShpLnJlc3VsdCk/aS5yZXN1bHQ6dm9pZCAwLHU9UHMoaS5yZXN1bHQpLGQ9dCh1KTtpZihkPT09dm9pZCAwKXtpZih1IT09dm9pZCAwKW4uZGVsZXRlKGUpO3JldHVybn1sZXQgbD11dSh1LGQ9PT11P3suLi5kfTpkKSxwPWxzKGwuYWNjdCxsLmRhdGEpO2lmKGwuYWNjdD1wLmFjY3QsbC5kYXRhPXAuZGF0YSxkPT09dSYmdT8uYWNjdD09PWwuYWNjdCYmdT8uZGF0YT09PWwuZGF0YSYmdT8uZW50cz09PWwuZW50cylyZXR1cm47bGV0IHk9dm9pZCAwO2lmKGwua2V5VGFnIT09dm9pZCAwKXk9bC5rZXlUYWc9PT11Py5rZXlUYWcmJmM/LmtleVRhZyE9PXZvaWQgMD9jLmtleVRhZzpsLmtleVRhZztsZXQgbT12b2lkIDA7aWYobC5rZXlyaW5nIT09dm9pZCAwKW09bC5rZXlyaW5nPT09dT8ua2V5cmluZyYmYz8ua2V5cmluZyE9PXZvaWQgMD9jLmtleXJpbmc6bC5rZXlyaW5nO2Z1KG4sbCx5LG0pfX0pfX1hc3luYyBmdW5jdGlvbiB5YShlKXtsZXQgdD1hd2FpdCBncygpO3RyeXtyZXR1cm4gYXdhaXQgbmV3IG9yKHQsRHQpLmVuc3VyZUVudHMoZSl9ZmluYWxseXt0LmNsb3NlKCl9fUQoKTtDKCk7Y2UoKTt2YXIgc2U9ImVudGl0aWVzIixZcj0iZW50aXR5X3R5cGVfY3JlYXRlZF9hdCIsQXM9ImVudGl0eV90eXBlX3VwZGF0ZWRfYXQiLGtzPSJlbnRpdHlfdHlwZV9wYXJlbnRfaWQiLERzPSJlbnRpdHlfdGFncyIsbWE9ImVudGl0eV9ybG0iLGhhPTE1O2Z1bmN0aW9uIHB1KGUpe3JldHVybiJ0eXAiaW4gZX1mdW5jdGlvbiB5dShlKXtsZXQgdD1pdChlLnJsbSkscj17Ym9kOmUuYm9keSxjcmQ6ZS5jcmVhdGVkQXQsLi4uZS5jdHIhPT0wP3tjdHI6ZS5jdHJ9Ont9LGVpZDpLKGUuZWlkKSxwaWQ6ZS5waWQ/SyhlLnBpZCk6dm9pZCAwLC4uLnQhPT12b2lkIDA/e3JsbTp0fTp7fSx0Z3M6ZS50YWdzLHR5cDplLnR5cGUsdXBkOmUudXBkYXRlZEF0fTtpZihyLnBpZD09PXZvaWQgMClkZWxldGUgci5waWQ7aWYoci50Z3M9PT12b2lkIDApZGVsZXRlIHIudGdzO2lmKHIuY3RyPT09dm9pZCAwKWRlbGV0ZSByLmN0cjtyZXR1cm4gcn1mdW5jdGlvbiBtdShlKXtpZighWihlKSlyZXR1cm57ZWlkOksoZS5laWQpLHVwZDplLnVwZGF0ZWRBdCwuLi5lLmN0ciE9PTA/e2N0cjplLmN0cn06e319O3JldHVybiB5dShlKX1mdW5jdGlvbiBSdChlKXtsZXQgdD1pdChlLnJsbSk7cmV0dXJue2JvZHk6ZS5ib2QsY3JlYXRlZEF0OmUuY3JkLHVwZGF0ZWRBdDplLnVwZCxjdHI6ZS5jdHI/PzAsdHlwZTplLnR5cCxlaWQ6RWUoZS5laWQpLHBpZDplLnBpZD9FZShlLnBpZCk6dm9pZCAwLC4uLmUudGdzIT09dm9pZCAwP3t0YWdzOmUudGdzfTp7fSwuLi50IT09dm9pZCAwP3tybG06dH06e319fWZ1bmN0aW9uIEVzKGUpe2lmKHB1KGUpKXJldHVybiBSdChlKTtyZXR1cm57ZWlkOkVlKGUuZWlkKSx1cGRhdGVkQXQ6ZS51cGQsY3RyOmUuY3RyPz8wfX1mdW5jdGlvbiBodShlLHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBJREJLZXlSYW5nZS5vbmx5KFtlLHRdKTtsZXQgcj10LnJhbmdlO3JldHVybiBJREJLZXlSYW5nZS5ib3VuZChbZSxyLnN0YXJ0XSxbZSxyLmVuZF0sci5leGNsdWRlU3RhcnQ9PT0hMCxyLmV4Y2x1ZGVFbmQ9PT0hMCl9ZnVuY3Rpb24gZ3UoZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIilyZXR1cm4gSURCS2V5UmFuZ2Uub25seShlKTtpZigicmFuZ2UiaW4gZSl7bGV0IHQ9ZS5yYW5nZTtyZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQodC5zdGFydCx0LmVuZCx0LmV4Y2x1ZGVTdGFydD09PSEwLHQuZXhjbHVkZUVuZD09PSEwKX1yZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZS5wcmVmaXgsZS5wcmVmaXgrIu+/vyIpfWZ1bmN0aW9uIFN1KGUsdCxyKXtsZXQgbj1bXTtpZih0eXBlb2Ygcj09PSJzdHJpbmciKXtmb3IobGV0IGkgb2YgZSlpZihpLnR5cD09PXQpbi5wdXNoKFJ0KGkpKTtyZXR1cm4gbn1sZXQgcz1uZXcgU2V0LG89InByZWZpeCJpbiByP3IucHJlZml4OnZvaWQgMDtmb3IobGV0IGkgb2YgZSl7aWYoaS50eXAhPT10KWNvbnRpbnVlO2lmKHMuaGFzKGkuZWlkKSljb250aW51ZTtpZihvIT09dm9pZCAwKXtsZXQgYz1pLnRncztpZighY3x8IWMuc29tZSgodSk9PnUuc3RhcnRzV2l0aChvKSkpY29udGludWV9cy5hZGQoaS5laWQpLG4ucHVzaChSdChpKSl9cmV0dXJuIG59Y2xhc3MgZ2F7bmFtZTtkYjtvcGVuaW5nO2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lfWFzeW5jIGluaXQoKXthd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2xvc2UoKXtsZXQgZT10aGlzLmRiO2lmKHRoaXMuZGI9dm9pZCAwLHRoaXMub3BlbmluZz12b2lkIDAsZSE9PXZvaWQgMCllLmNsb3NlKCl9YXN5bmMgZW5zdXJlRGIoKXtpZih0aGlzLmRiKXJldHVybiB0aGlzLmRiO2lmKHRoaXMub3BlbmluZylyZXR1cm4gdGhpcy5vcGVuaW5nO3JldHVybiB0aGlzLm9wZW5pbmc9SXUodGhpcy5uYW1lKS50aGVuKChlKT0+KGUub252ZXJzaW9uY2hhbmdlPSgpPT57aWYoZS5jbG9zZSgpLHRoaXMuZGI9PT1lKXRoaXMuZGI9dm9pZCAwfSx0aGlzLmRiPWUsdGhpcy5vcGVuaW5nPXZvaWQgMCxlKSwoZSk9Pnt0aHJvdyB0aGlzLm9wZW5pbmc9dm9pZCAwLGV9KSx0aGlzLm9wZW5pbmd9YXBwbHk9YXN5bmMoZSk9PntsZXQgdD1uZXcgU2V0LHI9W10sbj1wZXJmb3JtYW5jZS5ub3coKTtXKCJpZGIgYXBwbHkgc3RhcnQiLHtvcHM6ZS5sZW5ndGh9KTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJue3N0YXRzOmUubWFwKCgpPT4xNiksdHlwZXM6dCxlaWRzOnJ9fWxldCBvPXMudHJhbnNhY3Rpb24oc2UsInJlYWR3cml0ZSIpLGk9by5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChjKT0+e2xldCB1PUFycmF5KGUubGVuZ3RoKS5maWxsKDApO2lmKGUubGVuZ3RoPDEpe2Moe3N0YXRzOltdLHR5cGVzOnQsZWlkczpyfSk7cmV0dXJufW8ub25jb21wbGV0ZT0oKT0+e1coImlkYiBhcHBseSBjb21wbGV0ZSIse29wczplLmxlbmd0aCxtczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLW4pfSksYyh7c3RhdHM6dSx0eXBlczp0LGVpZHM6cn0pfSxvLm9uZXJyb3I9KCk9Pntmb3IobGV0IGw9MDtsPHUubGVuZ3RoO2wrKylpZih1W2xdPT09dm9pZCAwKXVbbF09MTg7Yyh7c3RhdHM6dSx0eXBlczp0LGVpZHM6cn0pfTtsZXQgZD1uZXcgTWFwO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7bCsrKXtsZXQgcD1lW2xdLHk9SyhwLmVpZCksbT17b3A6cCxpbmRleDpsfSxoPWQuZ2V0KHkpO2lmKGgpaC5wdXNoKG0pO2Vsc2UgZC5zZXQoeSxbbV0pfWZvcihsZXRbbCxwXW9mIGQpe2lmKHAubGVuZ3RoPDEpY29udGludWU7bGV0IHk9aS5nZXQobCk7eS5vbnN1Y2Nlc3M9KCk9PntsZXQgbT15LnJlc3VsdCxoPW0/RXMobSk6dm9pZCAwLGc9ITE7Zm9yKGxldHtvcDpTLGluZGV4OmJ9b2YgcCl7bGV0W3gsRV09UHQoaCxTKTtpZihFIT09MCl7dVtiXT1FO2NvbnRpbnVlfWlmKHg9PT12b2lkIDApe3VbYl09MTI7Y29udGludWV9Zz0hMDtmb3IobGV0IFAgb2YgRXQoaCx4KSl0LmFkZChQKTtoPXh9aWYoZylyLnB1c2gocFswXS5vcC5laWQpO2lmKGgpe2xldCBTPWkucHV0KG11KGgpKTtTLm9uZXJyb3I9KGIpPT57Yi5wcmV2ZW50RGVmYXVsdCgpO2ZvcihsZXR7aW5kZXg6eH1vZiBwKXVbeF09MTh9fX0seS5vbmVycm9yPSgpPT57Zm9yKGxldHtpbmRleDptfW9mIHApdVttXT0xOH19fSl9O2FzeW5jIGNsZWFyKCl7bGV0IGU7dHJ5e2U9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiAxNn1sZXQgdD1lLnRyYW5zYWN0aW9uKHNlLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoc2UpO3JldHVybiBuZXcgUHJvbWlzZSgobik9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oMCksdC5vbmVycm9yPSgpPT5uKDE4KSxyLmNsZWFyKCl9KX1hc3luYyBnZXRSb3coZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBhKDE2KX1sZXQgcj1LKGUpLHM9dC50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChvKT0+e2xldCBpPXMuZ2V0KHIpO2kub25zdWNjZXNzPSgpPT57bGV0IGM9aS5yZXN1bHQ7aWYoIWMpbyhmKHZvaWQgMCkpO2Vsc2UgbyhmKEVzKGMpKSl9LGkub25lcnJvcj0oKT0+byhhKDE4KSl9KX1hc3luYyBnZXRFbnQoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRSb3coZSk7aWYociE9PTApcmV0dXJuIGEocik7aWYodD09PXZvaWQgMHx8IVoodCkpcmV0dXJuIGYodm9pZCAwKTtyZXR1cm4gZih0KX1hc3luYyBnZXRCeVVwZGF0ZWRBdChlLHQpe2xldFtyLG5dPXp0KHQpO2lmKG4hPT0wKXJldHVybiBhKG4pO2lmKCFyKXJldHVybiBmKFtdKTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGEoMTYpfWxldCBpPXMudHJhbnNhY3Rpb24oc2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoc2UpLmluZGV4KEFzKSxjPWh1KGUsdCk7cmV0dXJuIG5ldyBQcm9taXNlKCh1KT0+e2xldCBkPWkuZ2V0QWxsKGMpO2Qub25zdWNjZXNzPSgpPT57bGV0IGw9ZC5yZXN1bHQ7dShmKGwubWFwKFJ0KSkpfSxkLm9uZXJyb3I9KCk9PnUoYSgxOCkpfSl9YXN5bmMgZ2V0QWxsT2ZUeXBlKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYSgxNil9bGV0IG49dC50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSkuaW5kZXgoWXIpO3JldHVybiBuZXcgUHJvbWlzZSgocyk9PntsZXQgbz1uLmdldEFsbChJREJLZXlSYW5nZS5ib3VuZChbZV0sW2UsW11dKSk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgaT1vLnJlc3VsdDtzKGYoaS5tYXAoUnQpKSl9LG8ub25lcnJvcj0oKT0+cyhhKDE4KSl9KX1hc3luYyBnZXRCeVRhZyhlLHQpe2xldFtyLG5dPVl0KHQpO2lmKG4hPT0wKXJldHVybiBhKG4pO2lmKCFyKXJldHVybiBmKFtdKTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGEoMTYpfWxldCBvPWd1KHQpLGM9cy50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSkuaW5kZXgoRHMpO3JldHVybiBuZXcgUHJvbWlzZSgodSk9PntsZXQgZD1jLmdldEFsbChvKTtkLm9uc3VjY2Vzcz0oKT0+e2xldCBsPWQucmVzdWx0O3UoZihTdShsLGUsdCkpKX0sZC5vbmVycm9yPSgpPT51KGEoMTgpKX0pfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2lmKCJwaWQiaW4gZSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBhKDE2KX1sZXQgcj1LKGUucGlkKSxzPXQudHJhbnNhY3Rpb24oc2UsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoc2UpLmluZGV4KGtzKTtyZXR1cm4gbmV3IFByb21pc2UoKG8pPT57bGV0IGk9cy5nZXRBbGwoSURCS2V5UmFuZ2Uub25seShbZS50eXBlLHJdKSk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgdT1pLnJlc3VsdC5tYXAoUnQpO28oZih1KSl9LGkub25lcnJvcj0oKT0+byhhKDE4KSl9KX1lbHNlIGlmKCJ0YWciaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVRhZyhlLnR5cGUsZS50YWcpO2Vsc2UgaWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiBhd2FpdCB0aGlzLmdldEJ5VXBkYXRlZEF0KGUudHlwZSxlLnVwZGF0ZWRBdCk7cmV0dXJuIGF3YWl0IHRoaXMuZ2V0QWxsT2ZUeXBlKGUudHlwZSl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7bGV0IHQ9cGVyZm9ybWFuY2Uubm93KCksW3Isbl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcyhlKTtpZihXKCJpZGIgZ2V0RW50aXRpZXMiLHt0eXBlOmUudHlwZSxuOnI/Lmxlbmd0aD8/MCxtczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSksbiE9PTApcmV0dXJuIGEobik7cmV0dXJuIGYocil9YXN5bmMgY291bnRFbnRpdGllcyh7dHlwZTplfSl7bGV0IHQ7dHJ5e3Q9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBhKDE2KX1sZXQgbj10LnRyYW5zYWN0aW9uKHNlLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHNlKS5pbmRleChZcik7cmV0dXJuIG5ldyBQcm9taXNlKChzKT0+e2xldCBvPUlEQktleVJhbmdlLmJvdW5kKFtlXSxbZSxbXV0pLGk9bi5jb3VudChvKTtpLm9uc3VjY2Vzcz0oKT0+cyhmKGkucmVzdWx0KSksaS5vbmVycm9yPSgpPT5zKGEoMTgpKX0pfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYSgxNil9bGV0IG49dC50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSkscz1bXTtyZXR1cm4gbmV3IFByb21pc2UoKG8pPT57bGV0IGk9bi5vcGVuQ3Vyc29yKCk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgYz1pLnJlc3VsdDtpZihjKXtsZXQgdT1jLnZhbHVlO3MucHVzaChCcihFcyh1KSkpLGMuY29udGludWUoKX1lbHNlIGtyKHMsZSkudGhlbihvKX0saS5vbmVycm9yPSgpPT5vKGEoMTgpKX0pfX1mdW5jdGlvbiBidShlLHQpe2lmKCFlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoc2UpKWUuY3JlYXRlT2JqZWN0U3RvcmUoc2Use2tleVBhdGg6ImVpZCIsYXV0b0luY3JlbWVudDohMX0pO2xldCByPXQub2JqZWN0U3RvcmUoc2UpO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoWXIpKXIuY3JlYXRlSW5kZXgoWXIsWyJ0eXAiLCJjcmQiXSx7dW5pcXVlOiExfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhBcykpci5jcmVhdGVJbmRleChBcyxbInR5cCIsInVwZCJdLHt1bmlxdWU6ITF9KTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKGtzKSlyLmNyZWF0ZUluZGV4KGtzLFsidHlwIiwicGlkIl0se3VuaXF1ZTohMX0pO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoRHMpKXIuY3JlYXRlSW5kZXgoRHMsInRncyIse3VuaXF1ZTohMSxtdWx0aUVudHJ5OiEwfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhtYSkpci5jcmVhdGVJbmRleChtYSwicmxtIix7dW5pcXVlOiExfSl9ZnVuY3Rpb24gSXUoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LHIpPT57bGV0IG49aW5kZXhlZERCLm9wZW4oZSxoYSk7bi5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0OnMsdHJhbnNhY3Rpb246b309bjtpZighbyl7cihFcnJvcigiVHJhbnNhY3Rpb24gaXMgbnVsbCBkdXJpbmcgRW50REIgdXBncmFkZSIpKTtyZXR1cm59dHJ5e2J1KHMsbyl9Y2F0Y2goaSl7cihpIGluc3RhbmNlb2YgRXJyb3I/aTpFcnJvcihTdHJpbmcoaSkpKX19LG4ub25ibG9ja2VkPSgpPT57Y29uc29sZS53YXJuKGBbRElQTE9NQVRJQ10gRW50REIgSURCIHVwZ3JhZGUgYmxvY2tlZCAoJHtlfSDihpIgdiR7aGF9KTsgd2FpdGluZyBmb3Igb3RoZXIgY29ubmVjdGlvbnMgdG8gY2xvc2VgKX0sbi5vbnN1Y2Nlc3M9KCk9PnQobi5yZXN1bHQpLG4ub25lcnJvcj0oKT0+cihuLmVycm9yPz9FcnJvcigiRW50REIgSW5kZXhlZERCIG9wZW4gZmFpbGVkIikpfSl9YXN5bmMgZnVuY3Rpb24gU2EoZSl7bGV0IHQ9bmV3IGdhKGUpO3JldHVybiBhd2FpdCB0LmluaXQoKSx0fWNlKCk7RCgpO0MoKTtjbGFzcyBCc3tlbnRzPW5ldyBNYXA7dXNlSW5kZXg7YnlUeXBlPW5ldyBNYXA7YnlUeXBlUGlkPW5ldyBNYXA7YnlUeXBlVGFnPW5ldyBNYXA7Y29uc3RydWN0b3IoZT1bXSx0KXt0aGlzLnVzZUluZGV4PXQ/LmluZGV4ZXMhPT0hMTtmb3IobGV0IHIgb2YgZSl0aGlzLnB1dChyKX1wdXQoZSl7bGV0IHQ9WihlKT9DcihlKTplLHI9Syh0LmVpZCksbj10aGlzLmVudHMuZ2V0KHIpO2lmKG4hPT12b2lkIDAmJloobikpdGhpcy51bmluZGV4KHIsbik7aWYodGhpcy5lbnRzLnNldChyLHQpLFoodCkpdGhpcy5pbmRleChyLHQpfWRlbChlKXtsZXQgdD10aGlzLmVudHMuZ2V0KGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuO2lmKFoodCkpdGhpcy51bmluZGV4KGUsdCk7dGhpcy5lbnRzLmRlbGV0ZShlKX1pbmRleChlLHQpe2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgcj10aGlzLmJ5VHlwZS5nZXQodC50eXBlKTtpZighcilyPW5ldyBNYXAsdGhpcy5ieVR5cGUuc2V0KHQudHlwZSxyKTtpZihyLnNldChlLHQpLHQucGlkKXtsZXQgbj1LKHQucGlkKSxzPXRoaXMuYnlUeXBlUGlkLmdldCh0LnR5cGUpO2lmKCFzKXM9bmV3IE1hcCx0aGlzLmJ5VHlwZVBpZC5zZXQodC50eXBlLHMpO2xldCBvPXMuZ2V0KG4pO2lmKCFvKW89bmV3IE1hcCxzLnNldChuLG8pO28uc2V0KGUsdCl9aWYodC50YWdzKXtsZXQgbj10aGlzLmJ5VHlwZVRhZy5nZXQodC50eXBlKTtpZighbiluPW5ldyBNYXAsdGhpcy5ieVR5cGVUYWcuc2V0KHQudHlwZSxuKTtmb3IobGV0IHMgb2YgdC50YWdzKXtsZXQgbz1uLmdldChzKTtpZighbylvPW5ldyBNYXAsbi5zZXQocyxvKTtvLnNldChlLHQpfX19dW5pbmRleChlLHQpe2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgcj10aGlzLmJ5VHlwZS5nZXQodC50eXBlKTtpZihyKXtpZihyLmRlbGV0ZShlKSxyLnNpemU9PT0wKXRoaXMuYnlUeXBlLmRlbGV0ZSh0LnR5cGUpfWlmKHQucGlkKXtsZXQgbj1LKHQucGlkKSxzPXRoaXMuYnlUeXBlUGlkLmdldCh0LnR5cGUpLG89cz8uZ2V0KG4pO2lmKG8pe2lmKG8uZGVsZXRlKGUpLG8uc2l6ZT09PTApcz8uZGVsZXRlKG4pfWlmKHMmJnMuc2l6ZT09PTApdGhpcy5ieVR5cGVQaWQuZGVsZXRlKHQudHlwZSl9aWYodC50YWdzKXtsZXQgbj10aGlzLmJ5VHlwZVRhZy5nZXQodC50eXBlKTtpZihuKXtmb3IobGV0IHMgb2YgdC50YWdzKXtsZXQgbz1uLmdldChzKTtpZihvKXtpZihvLmRlbGV0ZShlKSxvLnNpemU9PT0wKW4uZGVsZXRlKHMpfX1pZihuLnNpemU9PT0wKXRoaXMuYnlUeXBlVGFnLmRlbGV0ZSh0LnR5cGUpfX19Y2xlYXJJbmRleGVzKCl7dGhpcy5ieVR5cGUuY2xlYXIoKSx0aGlzLmJ5VHlwZVBpZC5jbGVhcigpLHRoaXMuYnlUeXBlVGFnLmNsZWFyKCl9YnVja2V0TGlzdChlKXtpZighZXx8ZS5zaXplPT09MClyZXR1cm5bXTtsZXQgdD1bXTtmb3IobGV0IHIgb2YgZS52YWx1ZXMoKSl0LnB1c2gocik7cmV0dXJuIHR9YnlUYWdTcGVjKGUsdCl7bGV0W3Isbl09WXQodCk7aWYobiE9PTApcmV0dXJuIGEobik7aWYoIXIpcmV0dXJuIGYoW10pO2lmKHR5cGVvZiB0PT09InN0cmluZyIpcmV0dXJuIGYodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlVGFnLmdldChlKT8uZ2V0KHQpKSk7bGV0IHM9dGhpcy5ieVR5cGVUYWcuZ2V0KGUpO2lmKCFzKXJldHVybiBmKFtdKTtsZXQgbz1uZXcgU2V0LGk9W107Zm9yKGxldFtjLHVdb2Ygcyl7aWYoIVRuKGMsdCkpY29udGludWU7Zm9yKGxldFtkLGxdb2YgdSl7aWYoby5oYXMoZCkpY29udGludWU7by5hZGQoZCksaS5wdXNoKGwpfX1yZXR1cm4gZihpKX1ieURhdGVTcGVjKGUsdCl7bGV0W3Isbl09enQodCk7aWYobiE9PTApcmV0dXJuIGEobik7aWYoIXIpcmV0dXJuIGYoW10pO2xldCBzPVtdLG89dGhpcy5ieVR5cGUuZ2V0KGUpO2lmKG8pe2ZvcihsZXQgaSBvZiBvLnZhbHVlcygpKWlmKEhuKGkudXBkYXRlZEF0LHQpKXMucHVzaChpKX1yZXR1cm4gZihzKX1hc3luYyBhcHBseShlKXtsZXQgdD1uZXcgU2V0LHI9W10sbj1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IG89SyhzLmVpZCksaT10aGlzLmVudHMuZ2V0KG8pLFtjLHVdPVB0KGkscyk7aWYodSE9PTApe24ucHVzaCh1KTtjb250aW51ZX1pZihjPT09dm9pZCAwKXtuLnB1c2goMTIpO2NvbnRpbnVlfWZvcihsZXQgZCBvZiBFdChpLGMpKXQuYWRkKGQpO3RoaXMucHV0KGMpLHIucHVzaChzLmVpZCksbi5wdXNoKDApfXJldHVybntzdGF0czpuLHR5cGVzOnQsZWlkczpyfX1hc3luYyBjbGVhcigpe3JldHVybiB0aGlzLmVudHMuY2xlYXIoKSx0aGlzLmNsZWFySW5kZXhlcygpLDB9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUsoZSkscj10aGlzLmVudHMuZ2V0KHQpO3JldHVybiBmKHIpfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYShyKTtpZih0PT09dm9pZCAwfHwhWih0KSlyZXR1cm4gZih2b2lkIDApO3JldHVybiBmKHQpfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2xldHt0eXBlOnR9PWU7aWYodGhpcy51c2VJbmRleCl7aWYoInBpZCJpbiBlKXtsZXQgbj1LKGUucGlkKTtyZXR1cm4gZih0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVQaWQuZ2V0KHQpPy5nZXQobikpKX1pZigidGFnImluIGUpcmV0dXJuIHRoaXMuYnlUYWdTcGVjKHQsZS50YWcpO2lmKCJ1cGRhdGVkQXQiaW4gZSlyZXR1cm4gdGhpcy5ieURhdGVTcGVjKHQsZS51cGRhdGVkQXQpO3JldHVybiBmKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZS5nZXQodCkpKX1sZXQgcj1bXTtpZigicGlkImluIGUpe2ZvcihsZXQgbiBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoWihuKSYmbi50eXBlPT09dCYmbi5waWQmJkcobi5waWQsZS5waWQpKXIucHVzaChuKX1lbHNlIGlmKCJ0YWciaW4gZSl7bGV0IG49ZS50YWcsW3Msb109WXQobik7aWYobyE9PTApcmV0dXJuIGEobyk7aWYoIXMpcmV0dXJuIGYocik7Zm9yKGxldCBpIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihaKGkpJiZpLnR5cGU9PT10JiZpLnRhZ3MmJmkudGFncy5zb21lKChjKT0+VG4oYyxuKSkpci5wdXNoKGkpfWVsc2UgaWYoInVwZGF0ZWRBdCJpbiBlKXtsZXQgbj1lLnVwZGF0ZWRBdCxbcyxvXT16dChuKTtpZihvIT09MClyZXR1cm4gYShvKTtpZighcylyZXR1cm4gZihyKTtmb3IobGV0IGkgb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKFooaSkmJmkudHlwZT09PXQmJkhuKGkudXBkYXRlZEF0LG4pKXIucHVzaChpKX1lbHNlIGZvcihsZXQgbiBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoWihuKSYmbi50eXBlPT09dClyLnB1c2gobik7cmV0dXJuIGYocil9YXN5bmMgZ2V0RW50aXRpZXMoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcyhlKTtpZihyIT09MClyZXR1cm4gYShyKTtyZXR1cm4gZih0KX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtpZih0aGlzLnVzZUluZGV4KXJldHVybiBmKHRoaXMuYnlUeXBlLmdldChlKT8uc2l6ZT8/MCk7bGV0IHQ9MDtmb3IobGV0IHIgb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKFoocikmJnIudHlwZT09PWUpdCs9MTtyZXR1cm4gZih0KX1hc3luYyBjaGVja3N1bShlKXtsZXQgdD1bXTtmb3IobGV0IHIgb2YgdGhpcy5lbnRzLnZhbHVlcygpKXQucHVzaChCcihyKSk7cmV0dXJuIGtyKHQsZSl9fWZ1bmN0aW9uIHd1KGUpe2xldCB0PWdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lO2lmKHR5cGVvZiB0IT09ImZ1bmN0aW9uIil7cXVldWVNaWNyb3Rhc2soZSk7cmV0dXJufXQoKCk9Pnt0KGUpfSl9YXN5bmMgZnVuY3Rpb24gSWEoZSl7aWYoZT8udmVyYm9zZSE9PXZvaWQgMClyaShlLnZlcmJvc2UpO2xldCB0PWU/Lm5hbWU/P2F3YWl0IHlhKGU/LmxhYmVsPz8iIikscj1hd2FpdCBTYSh0KTtpZihlPy5jYWNoZT09PSExKXJldHVybiByO3JldHVybiBuZXcgd2Eocix2b2lkIDAse2luZGV4ZXM6ZT8uaW5kZXhlcyxvcHRpbWlzdGljOmU/Lm9wdGltaXN0aWN9KX1jbGFzcyB3YXttZW07ZHVyYWJsZTt3YXJtZWQ9bmV3IFNldDtsaXN0ZW5lcnM9bmV3IFNldDtjaGFpbj1Qcm9taXNlLnJlc29sdmUoKTtvcHRpbWlzdGljO2luZmxpZ2h0PTA7d2FybVA9bmV3IE1hcDtjb25zdHJ1Y3RvcihlLHQscil7aWYodGhpcy5kdXJhYmxlPWUsdGhpcy5vcHRpbWlzdGljPXI/Lm9wdGltaXN0aWMhPT0hMSxXKCJDYWNoZWRFbnREQiBvcGVuIix7b3B0aW1pc3RpYzp0aGlzLm9wdGltaXN0aWN9KSx0aGlzLm1lbT1uZXcgQnModD8/W10se2luZGV4ZXM6cj8uaW5kZXhlc30pLHQpZm9yKGxldCBuIG9mIHQpdGhpcy53YXJtZWQuYWRkKG4udHlwZSl9c3Vic2NyaWJlKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5hZGQoZSksKCk9Pnt0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSl7aWYoZS5zaXplPDEpcmV0dXJuO2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO1coImVtaXQgc3RhcnQiLHt0eXBlczpbLi4uZV0sbGlzdGVuZXJzOnRoaXMubGlzdGVuZXJzLnNpemV9KTtmb3IobGV0IHIgb2YgdGhpcy5saXN0ZW5lcnMpcihlKTtXKCJlbWl0IGRvbmUiLHttczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSl9cnVuKGUpe2xldCB0PXRoaXMuY2hhaW4udGhlbihlLGUpO3JldHVybiB0aGlzLmNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWFwcGx5KGUpe2xldCB0LHI7aWYodGhpcy5vcHRpbWlzdGljKXtyPUR1KHRoaXMubWVtLGUpLnR5cGVzLHQ9bmV3IE1hcDtmb3IobGV0IHMgb2YgZSl7bGV0IG89SyhzLmVpZCk7dC5zZXQobyxiYSh0aGlzLm1lbS5lbnRzLmdldChvKSkpfXRoaXMuaW5mbGlnaHQrPTEsVygiYXBwbHkgbWVtIHBhdGNoZWQiLHtvcHM6ZS5sZW5ndGgsdHlwZXM6cj9bLi4ucl06W10saW5mbGlnaHQ6dGhpcy5pbmZsaWdodH0pfWxldCBuPXRoaXMucnVuKGFzeW5jKCk9PntXKCJwZXJzaXN0IHN0YXJ0Iix7b3BzOmUubGVuZ3RofSk7dHJ5e2xldCBzPXBlcmZvcm1hbmNlLm5vdygpLG89YXdhaXQgdGhpcy5kdXJhYmxlLmFwcGx5KGUpO2lmKFcoInBlcnNpc3QgZHVyYWJsZS5hcHBseSBkb25lIix7bXM6TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKS1zKX0pLCF0aGlzLm9wdGltaXN0aWMpe2xldHtjaGFuZ2VkOmMsc3RhdHVzOnV9PWF3YWl0IHRoaXMucHVsbEVpZHMoZS5tYXAoKGQpPT5kLmVpZCkpO2lmKHRoaXMuZW1pdChjKSx1IT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PnUpLHR5cGVzOm8udHlwZXMsZWlkczpvLmVpZHN9O3JldHVybiBvfWxldCBpPVtdO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKWlmKG8uc3RhdHNbY10hPT0wKWkucHVzaChlW2NdLmVpZCk7aWYoaS5sZW5ndGg+MCl7VygicGVyc2lzdCBwdWxsIHJlamVjdGVkIGVpZHMiLHtuOmkubGVuZ3RofSk7bGV0e2NoYW5nZWQ6YyxzdGF0dXM6dX09YXdhaXQgdGhpcy5wdWxsRWlkcyhpLHQpO2lmKHRoaXMuZW1pdChjKSx1IT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PnUpLHR5cGVzOm8udHlwZXMsZWlkczpvLmVpZHN9fXJldHVybiBXKCJwZXJzaXN0IGRvbmUiKSxvfWZpbmFsbHl7aWYodGhpcy5vcHRpbWlzdGljKXRoaXMuaW5mbGlnaHQtPTF9fSk7aWYocil3dSgoKT0+e1coImVtaXQgYWZ0ZXIgcGFpbnQiKSx0aGlzLmVtaXQocil9KTtyZXR1cm4gbn1jbGVhcigpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5kdXJhYmxlLmNsZWFyKCk7aWYoZSE9PTApcmV0dXJuIGU7bGV0IHQ9dGhpcy5tZW0uZW50cy5zaXplPjA7cmV0dXJuIGF3YWl0IHRoaXMubWVtLmNsZWFyKCksdGhpcy53YXJtZWQuY2xlYXIoKSwwfSl9aW5nZXN0RnJvbUR1cmFibGUoZSl7bGV0IHQ9Wy4uLmVdLmxlbmd0aDtyZXR1cm4gVygiaW5nZXN0IHF1ZXVlZCIse2VpZHM6dH0pLHRoaXMucnVuKGFzeW5jKCk9PntsZXQgcj1wZXJmb3JtYW5jZS5ub3coKTtXKCJpbmdlc3Qgc3RhcnQiLHtlaWRzOnR9KTtsZXR7Y2hhbmdlZDpuLHN0YXR1czpzfT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUpO3JldHVybiBXKCJpbmdlc3QgZG9uZSIse21zOk1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCktciksY2hhbmdlZDpbLi4ubl19KSx0aGlzLmVtaXQobiksc30pfWFzeW5jIHB1bGxFaWRzKGUsdCl7bGV0IHI9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBvPUsocyk7aWYobi5oYXMobykpY29udGludWU7bi5hZGQobyk7bGV0W2ksY109YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhzKTtpZihjIT09MClyZXR1cm57Y2hhbmdlZDpyLHN0YXR1czpjfTtsZXQgdT10aGlzLm1lbS5lbnRzLmdldChvKTtpZih1IT09dm9pZCAwJiZpIT09dm9pZCAwJiZ2cyh1LGkpKWNvbnRpbnVlO2lmKHQpe2lmKCFrdShiYSh1KSx0LmdldChvKSkpY29udGludWV9aWYoaSl7aWYodGhpcy5tZW0ucHV0KGkpLCF1fHwheHUodSxpKSl7aWYoWihpKSlyLmFkZChpLnR5cGUpO2lmKHUhPT12b2lkIDAmJloodSkpci5hZGQodS50eXBlKX19ZWxzZSBpZih1IT09dm9pZCAwKXtpZih0aGlzLm1lbS5kZWwobyksWih1KSlyLmFkZCh1LnR5cGUpfX1yZXR1cm57Y2hhbmdlZDpyLHN0YXR1czowfX1hc3luYyB3YXJtVHlwZShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIDA7bGV0IHQ9cGVyZm9ybWFuY2Uubm93KCk7Vygid2FybVR5cGUgc3RhcnQiLHt0eXBlOmV9KTtsZXRbcixuXT1hd2FpdCB0aGlzLmR1cmFibGUuZ2V0RW50aXRpZXMoe3R5cGU6ZX0pO2lmKG4hPT0wKXJldHVybiBuO2lmKHIpZm9yKGxldCBzIG9mIHIpe2xldCBvPUsocy5laWQpLGk9dGhpcy5tZW0uZW50cy5nZXQobyk7aWYoIWl8fHZzKHMsaSkpdGhpcy5tZW0ucHV0KHMpfXJldHVybiB0aGlzLndhcm1lZC5hZGQoZSksVygid2FybVR5cGUgZG9uZSIse3R5cGU6ZSxuOnI/Lmxlbmd0aD8/MCxtczpNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpLXQpfSksMH1iZWdpbldhcm0oZSl7aWYodGhpcy53YXJtZWQuaGFzKGUpKXJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7bGV0IHQ9dGhpcy53YXJtUC5nZXQoZSk7aWYodClyZXR1cm4gdDtsZXQgcj10aGlzLndhcm1UeXBlKGUpLmZpbmFsbHkoKCk9Pnt0aGlzLndhcm1QLmRlbGV0ZShlKX0pO3JldHVybiB0aGlzLndhcm1QLnNldChlLHIpLHJ9ZW5zdXJlV2FybShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuO3RoaXMuYmVnaW5XYXJtKGUpLnRoZW4oKHQpPT57aWYodD09PTApdGhpcy5lbWl0KG5ldyBTZXQoW2VdKSl9KX1hc3luYyBnZXRSb3coZSl7bGV0IHQ9SyhlKTtpZih0aGlzLm1lbS5lbnRzLmhhcyh0KSlyZXR1cm4gdGhpcy5tZW0uZ2V0Um93KGUpO2xldFtyLG5dPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3coZSk7aWYobiE9PTApcmV0dXJuIGEobik7aWYocil7bGV0IHM9dGhpcy5tZW0uZW50cy5nZXQodCk7aWYoIXN8fHZzKHIscykpdGhpcy5tZW0ucHV0KHIpfXJldHVybiB0aGlzLm1lbS5nZXRSb3coZSl9YXN5bmMgZ2V0RW50KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZ2V0Um93KGUpO2lmKHIhPT0wKXJldHVybiBhKHIpO2lmKHQ9PT12b2lkIDB8fCFaKHQpKXJldHVybiBmKHZvaWQgMCk7cmV0dXJuIGYodCl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7aWYodGhpcy53YXJtZWQuaGFzKGUudHlwZSkpcmV0dXJuIFcoImdldEVudGl0aWVzIG1lbSIse3R5cGU6ZS50eXBlfSksdGhpcy5tZW0uZ2V0RW50aXRpZXMoZSk7aWYodGhpcy5pbmZsaWdodD4wKXJldHVybiBXKCJnZXRFbnRpdGllcyBpbmZsaWdodC1tZW0iLHt0eXBlOmUudHlwZX0pLHRoaXMuZW5zdXJlV2FybShlLnR5cGUpLHRoaXMubWVtLmdldEVudGl0aWVzKGUpO1coImdldEVudGl0aWVzIGJlZ2luV2FybSIse3R5cGU6ZS50eXBlfSk7bGV0IHQ9YXdhaXQgdGhpcy5iZWdpbldhcm0oZS50eXBlKTtpZih0IT09MClyZXR1cm4gYSh0KTtyZXR1cm4gVygiZ2V0RW50aXRpZXMgYWZ0ZXJXYXJtIix7dHlwZTplLnR5cGV9KSx0aGlzLm1lbS5nZXRFbnRpdGllcyhlKX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2lmKHRoaXMuaW5mbGlnaHQ+MClyZXR1cm4gdGhpcy5lbnN1cmVXYXJtKGUpLHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6ZX0pO2xldCB0PWF3YWl0IHRoaXMuYmVnaW5XYXJtKGUpO2lmKHQhPT0wKXJldHVybiBhKHQpO3JldHVybiB0aGlzLm1lbS5jb3VudEVudGl0aWVzKHt0eXBlOmV9KX1hc3luYyBjaGVja3N1bShlKXtyZXR1cm4gdGhpcy5kdXJhYmxlLmNoZWNrc3VtKGUpfX1mdW5jdGlvbiB4dShlLHQpe2lmKFooZSkhPT1aKHQpKXJldHVybiExO2lmKGUuY3RyIT09dC5jdHIpcmV0dXJuITE7aWYoZS51cGRhdGVkQXQuZ2V0VGltZSgpIT09dC51cGRhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKCFHKGUuZWlkLHQuZWlkKSlyZXR1cm4hMTtpZighWihlKXx8IVoodCkpcmV0dXJuITA7aWYoZS5jcmVhdGVkQXQuZ2V0VGltZSgpIT09dC5jcmVhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKGUudHlwZSE9PXQudHlwZSlyZXR1cm4hMTtpZighRXUoZS5waWQsdC5waWQpKXJldHVybiExO2lmKCFQdShlLnRhZ3MsdC50YWdzKSlyZXR1cm4hMTtyZXR1cm4gQXUoZS5ib2R5LHQuYm9keSl9ZnVuY3Rpb24gUHUoZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gRXUoZSx0KXtpZihlPT09dm9pZCAwJiZ0PT09dm9pZCAwKXJldHVybiEwO2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuITE7cmV0dXJuIEcoZSx0KX1mdW5jdGlvbiBBdShlLHQpe2lmKE9iamVjdC5pcyhlLHQpKXJldHVybiEwO2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZ0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gRyhlLHQpO2lmKGUgaW5zdGFuY2VvZiBEYXRlJiZ0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTtyZXR1cm4gd2koZSx0KX1mdW5jdGlvbiB2cyhlLHQpe2xldCByPWUudXBkYXRlZEF0LmdldFRpbWUoKSxuPXQudXBkYXRlZEF0LmdldFRpbWUoKTtpZihyIT09bilyZXR1cm4gcj5uO3JldHVybiBlLmN0cj50LmN0cn1mdW5jdGlvbiBiYShlKXtpZihlPT09dm9pZCAwKXJldHVybjtyZXR1cm57dDplLnVwZGF0ZWRBdC5nZXRUaW1lKCksY3RyOmUuY3RyfX1mdW5jdGlvbiBrdShlLHQpe2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuIGU9PT10O3JldHVybiBlLnQ9PT10LnQmJmUuY3RyPT09dC5jdHJ9ZnVuY3Rpb24gRHUoZSx0KXtsZXQgcj1uZXcgU2V0LG49W107Zm9yKGxldCBzIG9mIHQpe2xldCBvPUsocy5laWQpLGk9ZS5lbnRzLmdldChvKSxbYyx1XT1QdChpLHMpO2lmKHUhPT0wKXtuLnB1c2godSk7Y29udGludWV9aWYoYz09PXZvaWQgMCl7bi5wdXNoKDEyKTtjb250aW51ZX1mb3IobGV0IGQgb2YgRXQoaSxjKSlyLmFkZChkKTtlLnB1dChjKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6cn19RCgpO3RyKCk7ZnVuY3Rpb24gQnUoZSl7cmV0dXJuImNsb3NlImluIGUmJnR5cGVvZiBlLmNsb3NlPT09ImZ1bmN0aW9uIn1jbGFzcyBNc3tjbGllbnQ7c3RvcmU7ZW50REI7Ym91bmRMYWJlbD0iIjtwb3N0O3doZW5SZWFkeTtyZXNvbHZlUmVhZHk7cmVqZWN0UmVhZHk7Y29uc3RydWN0b3IoZSl7dGhpcy5wb3N0PWUsdGhpcy53aGVuUmVhZHk9bmV3IFByb21pc2UoKHQscik9Pnt0aGlzLnJlc29sdmVSZWFkeT10LHRoaXMucmVqZWN0UmVhZHk9cn0pfWFzeW5jIGJpbmRTdG9yZXMoZSl7aWYodGhpcy5jbGllbnQhPT12b2lkIDApcmV0dXJuO3RyeXtsZXQgdD1hd2FpdCBmYShEdCxlLmRhdGEpLHI9YXdhaXQgSWEoe2NhY2hlOiExLG5hbWU6ZS5lbnRzfSksbj1uZXcgRHIoci5hcHBseSwoKT0+ci5jbGVhcigpLChpKT0+e2lmKGkubGVuZ3RoPDEpcmV0dXJuO3RoaXMucG9zdCh7a2luZDoiZGlydHkiLGVpZHM6aS5tYXAoKGMpPT5jLnNsaWNlKCkpfSl9KSxzPW4uY2xlYXI7bi5jbGVhcj1hc3luYygpPT57bGV0IGk9YXdhaXQgcygpO2lmKGk9PT0wKXRoaXMucG9zdCh7a2luZDoid2lwZWQifSk7cmV0dXJuIGl9O2xldCBvPW5ldyBRbihuZXcgdG4sbix0LEtvLER0KTt0aGlzLmNsaWVudD1vLHRoaXMuc3RvcmU9dCx0aGlzLmVudERCPXIsdGhpcy5ib3VuZExhYmVsPWUubGFiZWwsby5jbGllbnRTdGF0ZS5saXN0ZW4oKCk9Pnt0aGlzLmVtaXRDbGllbnRTdGF0ZSgpfSksby54ZmVyU3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0WGZlclN0YXRlKCl9KSxhd2FpdCB0aGlzLmVtaXRYZmVyU3RhdGUoKSx0aGlzLnBvc3Qoe2tpbmQ6InJlYWR5In0pLHRoaXMubWFya1JlYWR5KCl9Y2F0Y2godCl7bGV0IHI9dCBpbnN0YW5jZW9mIEVycm9yP3Q6RXJyb3IoU3RyaW5nKHQpKTt0aHJvdyB0aGlzLnBvc3Qoe2tpbmQ6ImluaXRFcnJvciIsbWVzc2FnZTpyLm1lc3NhZ2V9KSx0aGlzLmZhaWxSZWFkeShyKSxyfX1tYXJrUmVhZHkoKXtsZXQgZT10aGlzLnJlc29sdmVSZWFkeTtpZih0aGlzLnJlc29sdmVSZWFkeT12b2lkIDAsdGhpcy5yZWplY3RSZWFkeT12b2lkIDAsZSllKCl9ZmFpbFJlYWR5KGUpe2xldCB0PXRoaXMucmVqZWN0UmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLHQpdChlKX1yZXF1aXJlQ2xpZW50KCl7aWYoIXRoaXMuY2xpZW50KXRocm93IEVycm9yKCJXb3JrZXJSdW50aW1lIG5vdCBpbml0aWFsaXplZCIpO3JldHVybiB0aGlzLmNsaWVudH1hc3luYyBlbWl0Q2xpZW50U3RhdGUoKXtsZXQgZT10aGlzLmNsaWVudDtpZighZSlyZXR1cm47bGV0IHQ9YXdhaXQgZS5jbGllbnRTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6ImNsaWVudFN0YXRlIixjb25uZWN0ZWQ6dC5jb25uZWN0ZWR9KX1hc3luYyBlbWl0WGZlclN0YXRlKCl7bGV0IGU9dGhpcy5jbGllbnQ7aWYoIWUpcmV0dXJuO2xldCB0PWF3YWl0IGUueGZlclN0YXRlLmdldCgpO3RoaXMucG9zdCh7a2luZDoieGZlclN0YXRlIixzdGF0ZTp0fSl9aG9zdEZyb21TZXJpYWxpemVkKGUpe3JldHVybntoYW5kbGU6bmV3IFVSTChlLmhhbmRsZSksbGFiZWw6ZS5sYWJlbCxpZHg6ZS5pZHh9fWFzeW5jIGhhbmRsZShlKXtpZihlLm9wPT09ImJpbmQiKXthd2FpdCB0aGlzLmJpbmRTdG9yZXMoZSk7cmV0dXJufWF3YWl0IHRoaXMud2hlblJlYWR5O2xldCB0PXRoaXMucmVxdWlyZUNsaWVudCgpO3N3aXRjaChlLm9wKXtjYXNlInBpbmciOnJldHVybiJwb25nIjtjYXNlInNldFNlZWQiOntsZXRbcixuXT15ZS5mcm9tQnl0ZXMoZS5zZWVkKTtpZihlLnNlZWQuZmlsbCgwKSxuIT09MCl0aHJvdyBuZXcgUGUobik7bGV0IHM9YXdhaXQgdC5hZG9wdChyLHRoaXMuYm91bmRMYWJlbCk7aWYocyE9PTApdGhyb3cgbmV3IFBlKHMpO3JldHVybn1jYXNlImxpbmsiOnthd2FpdCB0LmxpbmsodGhpcy5ob3N0RnJvbVNlcmlhbGl6ZWQoZS5ob3N0KSxlLmNvbm5lY3Q/PyEwKTtyZXR1cm59Y2FzZSJ1bmxpbmsiOnthd2FpdCB0LnVubGluayhlLmxhYmVsKTtyZXR1cm59Y2FzZSJjb25uZWN0Ijp7YXdhaXQgdC5jb25uZWN0KGUubGlzdGVuPz8hMCxlLnN5bmM/PyEwKTtyZXR1cm59Y2FzZSJkaXNjb25uZWN0Ijp7YXdhaXQgdC5kaXNjb25uZWN0KCk7cmV0dXJufWNhc2Uic3luYyI6cmV0dXJuIGF3YWl0IHQuc3luYygpO2Nhc2UicmVidWlsZCI6cmV0dXJuIGF3YWl0IHQucmVidWlsZCh7Y2hlY2tIb3N0OmUuY2hlY2tIb3N0Pz8hMH0pO2Nhc2UicmVjb25jaWxlIjp7bGV0W3Isbl09YXdhaXQgdC5yZWNvbmNpbGUoZS5ob3N0TGFiZWwse3B1bGw6ZS5wdWxsLHB1c2g6ZS5wdXNoLHN5bmM6ZS5zeW5jfSk7aWYobiE9PTApdGhyb3cgbmV3IFBlKG4pO2lmKCFyKXRocm93IG5ldyBQZSgxMik7cmV0dXJuIHJ9Y2FzZSJtc2djaGVjayI6cmV0dXJuIGF3YWl0IHQubXNnY2hlY2soKTtjYXNlImVudGNoZWNrIjp7bGV0IHI9dGhpcy5lbnREQjtpZighcil0aHJvdyBuZXcgUGUoMTIpO2xldFtuLHNdPWF3YWl0IHIuY2hlY2tzdW0oRHQpO2lmKHMhPT0wKXRocm93IG5ldyBQZShzKTtpZighbil0aHJvdyBuZXcgUGUoMTIpO3JldHVybiBufWNhc2Uid2lwZSI6e2lmKGF3YWl0IHQud2lwZSh7bXNnczplLm1zZ3MsZW50czplLmVudHMsbWV0YTplLm1ldGEsc2VlZDplLnNlZWR9KSxlLnNlZWQ9PT0hMCl7dGhpcy5zdG9yZT8uY2xvc2UoKTtsZXQgcj10aGlzLmVudERCO2lmKHIhPT12b2lkIDAmJkJ1KHIpKXIuY2xvc2UoKX1yZXR1cm59Y2FzZSJpbXBvcnQiOntsZXQgcj1lLmJ5dGVzLnNsaWNlKCksbj1uZXcgQmxvYihbcl0pLHM9bmV3IEZpbGUoW25dLCJpbXBvcnQuZGlwIik7cmV0dXJuIGF3YWl0IHQuaW1wb3J0KHMpfWNhc2UiZXhwb3J0Ijp7bGV0W3Isbl09YXdhaXQgdC5leHBvcnRCeXRlcygpO2lmKG4hPT0wKXRocm93IG5ldyBQZShuKTtpZighcil0aHJvdyBuZXcgUGUoMTIpO3JldHVybiByfWNhc2UiZ2V0WGZlclN0YXRlIjpyZXR1cm4gYXdhaXQgdC54ZmVyU3RhdGUuZ2V0KCk7ZGVmYXVsdDp7bGV0IHI9ZTt0aHJvdyBFcnJvcigidW5rbm93biB3b3JrZXIgY29tbWFuZCIpfX19fWNsYXNzIFBlIGV4dGVuZHMgRXJyb3J7c3RhdHVzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBXb3JrZXJTdGF0dXNFcnJvcjogJHtBW2VdfWApO3RoaXMuc3RhdHVzPWU7dGhpcy5uYW1lPSJXb3JrZXJTdGF0dXNFcnJvciJ9fWZ1bmN0aW9uIEpyKGUsdCl7cmV0dXJue2tpbmQ6InJlcGx5IixpZDplLG9rOiEwLHJlc3VsdDp0fX1mdW5jdGlvbiBDcyhlLHQpe3JldHVybntraW5kOiJyZXBseSIsaWQ6ZSxvazohMSxzdGF0dXM6dH19dmFyIEplPWdsb2JhbFRoaXMsdnU9bmV3IE1zKChlLHQpPT57aWYodCYmdC5sZW5ndGg+MClKZS5wb3N0TWVzc2FnZShlLHQpO2Vsc2UgSmUucG9zdE1lc3NhZ2UoZSl9KTtKZS5vbm1lc3NhZ2U9KGUpPT57bGV0IHQ9ZS5kYXRhO2lmKCFUcyh0KSlyZXR1cm47TXUodCl9O2FzeW5jIGZ1bmN0aW9uIE11KGUpe3RyeXtsZXQgdD1hd2FpdCB2dS5oYW5kbGUoZSk7aWYoKGUub3A9PT0iZXhwb3J0Inx8ZS5vcD09PSJtc2djaGVjayJ8fGUub3A9PT0iZW50Y2hlY2siKSYmdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCByPXQuc2xpY2UoKTtKZS5wb3N0TWVzc2FnZShKcihlLmlkLHIpLFtyLmJ1ZmZlcl0pO3JldHVybn1pZihlLm9wPT09InJlY29uY2lsZSImJnQmJnR5cGVvZiB0PT09Im9iamVjdCImJiJtc2djaGVjayJpbiB0JiZ0Lm1zZ2NoZWNrIGluc3RhbmNlb2YgVWludDhBcnJheSl7bGV0IHI9dC5tc2djaGVjay5zbGljZSgpLG49ey4uLnQsbXNnY2hlY2s6cn07SmUucG9zdE1lc3NhZ2UoSnIoZS5pZCxuKSxbci5idWZmZXJdKTtyZXR1cm59SmUucG9zdE1lc3NhZ2UoSnIoZS5pZCx0KSl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIFBlKXtKZS5wb3N0TWVzc2FnZShDcyhlLmlkLHQuc3RhdHVzKSk7cmV0dXJufWNvbnNvbGUuZXJyb3IoIndvcmtlciBjb21tYW5kIGZhaWxlZCIsdCksSmUucG9zdE1lc3NhZ2UoQ3MoZS5pZCwxMikpfX0K";function ba(){if(typeof ys!=="string"||ys.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(ys)}function ha(){if(bs!==void 0)return bs;let t=new Blob([ba()],{type:"text/javascript"});return bs=URL.createObjectURL(t),bs}function il(){if(hs===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new hs(ha(),{type:"module"})}function Zs(t,e,n){if(wr===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)wr.call(t,e,{transfer:n});else wr.call(t,e)}var hs,wr,bs;var Mr=z(()=>{hs=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,wr=hs===void 0?void 0:hs.prototype.postMessage});async function ll(t){if(t?.credId!==void 0)return m(t.credId);return rl(t)}async function Ur(t,e,n){let s=le();if(s!==0)return s;let[r,o]=ie(n);if(o!==0)return o;if(r===void 0)return 9;await as();let i=new Uint8Array(e.byteLength);i.set(e);let c={largeBlob:{write:i.buffer}},a={publicKey:{challenge:Lt(oe),rpId:r,allowCredentials:[{type:Ht,id:wt(t)}],userVerification:"required",extensions:c,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(a)}catch(b){if(!cs(b))return Rt(b),30;Ae();try{d=await navigator.credentials.get(a)}catch(h){return Rt(h),30}}}catch(b){return Rt(b),30}finally{i.fill(0)}let[u,p]=ce(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}function cl(t,e){return Ur(t,new Uint8Array(gt),e)}var al=z(()=>{W();Ue();C();ae();ps()});async function Za(){return ms("extension:prf")}var Xs,Gn="diplomatic-prf";var Gs=z(()=>{ae();Xs=new TextEncoder().encode("diplomatic.prf.v1")});function Xa(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function Ga(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function dl(t){if(t===void 0)return;let e=ls(t);if(e.byteLength<Jr){e.fill(0);return}if(e.byteLength===Jr)return e;let n=e.slice(0,Jr);return e.fill(0),n}async function fa(t){let e=le();if(e!==0)return l(e);let[n,s]=ie(t);if(s!==0)return l(s);let r=t?.userName??Gn,o=t?.displayName??r,i=Lt(16),c=t?.authenticatorAttachment==="cross-platform",a={residentKey:c?"discouraged":"required",requireResidentKey:!c,userVerification:c?"preferred":"required"};if(t?.authenticatorAttachment!==void 0)a.authenticatorAttachment=t.authenticatorAttachment;let d={challenge:Lt(oe),rp:{id:n,name:t?.rpName??os},user:{id:i,name:r,displayName:o},pubKeyCredParams:is,authenticatorSelection:a,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((S)=>({type:Ht,id:wt(S)}))}:{}},u=t?.salt!==void 0?wt(t.salt):void 0,p=(S)=>ds({publicKey:{...d,extensions:S&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),y;try{y=await p(u!==void 0)}catch(S){if(u===void 0||!Ga(S))return Rt(S),l(30);try{y=await p(!1)}catch(K){return Rt(K),l(30)}}let[b,h]=ce(y);if(h!==0)return l(h);let Z=b.getClientExtensionResults(),X=dl(Z.prf?.results?.first),G=Z.prf?.enabled===!0||X!==void 0;if(c&&X!==void 0)X.fill(0);return m({credId:new Uint8Array(b.rawId),userId:new Uint8Array(i),prfEnabled:G,prf:c?void 0:X,attachment:kr(b.authenticatorAttachment),transports:Pr(b),aaguid:sl(b)})}async function ul(t){let e=le();if(e!==0)return l(e);let[n,s]=ie(t);if(s!==0)return l(s);let r=t?.salt??Xs,i={eval:{first:wt(r)}},c=t?.salts;if(c!==void 0&&c.length>0){let Z={};for(let X of c){if(X.credId.byteLength===0)continue;Z[Ts(X.credId)]={first:wt(X.salt)}}i.evalByCredential=Z}let a={challenge:Lt(oe),rpId:n,userVerification:"preferred",extensions:{prf:i}};if(t?.hints!==void 0)a.hints=t.hints;let d=Xa(t?.credId);if(d.length>0)a.allowCredentials=d.map((Z)=>({type:Ht,id:wt(Z)}));let u;try{u=await us({publicKey:a})}catch(Z){return Rt(Z),l(30)}let[p,y]=ce(u);if(y!==0)return l(y);let b=p.getClientExtensionResults().prf?.results;if(b?.first===void 0)return l(7);let h=dl(b.first);if(h===void 0)return l(27);return m({prf:h,credId:new Uint8Array(p.rawId),attachment:kr(p.authenticatorAttachment),transports:Pr(p)})}async function ml(t){let e=t?.salt??Xs,n=t?.credId,s=n,r=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),o,i;if(r){let[u,p]=await fa({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??Gn,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return l(p);if(!u.prfEnabled)return l(30);s=u.credId,o=u,i=u.prf}let c=(u,p,y,b)=>m({prf:u,salt:e.slice(),credId:p.slice(),userId:o?.userId===void 0?void 0:o.userId.slice(),attachment:y??o?.attachment,transports:b??o?.transports,aaguid:o?.aaguid===void 0?void 0:o.aaguid.slice()});if(i!==void 0&&o!==void 0)return c(i,o.credId,o.attachment,o.transports);let[a,d]=await ul({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return l(d);return c(a.prf,a.credId,a.attachment,a.transports)}async function pl(t,e){let n=[],s=[],r=!1;for(let d of t){if(d.credId.byteLength===0)continue;n.push(d.credId);let u=d.salt??e.salt;if(!E(u,e.salt))r=!0;s.push({credId:d.credId,salt:u})}let[o,i]=await ul({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt,salts:r?s:void 0});if(i!==0)return l(i);let c=t.find((d)=>E(d.credId,o.credId)),a=c===void 0?t:[c,...t.filter((d)=>d!==c)];return m({prf:o.prf,credId:o.credId.slice(),order:a})}var Jr=32;var yl=z(()=>{ot();W();C();ae();Gs()});var _i={};_l(_i,{Enclave:()=>ut,MUSEC_MIN_LEN:()=>Ss,asMasterSeed:()=>fs,fromSeedHosts:()=>hl});function hl(t){if(t.byteLength===0||t.every((c)=>c===0))return l(22);if(t.byteLength<gt+1)return l(14);let e=t.subarray(0,gt);if(e.every((c)=>c===0))return l(22);let n=new M(t.subarray(gt)),[s,r]=n.readStruct(xr);if(r!==0)return l(r);if(s===void 0)return l(14);if(!n.done())return l(14);let[o,i]=ut.fromBytes(e);if(i!==0)return l(i);return m({enclave:o,hosts:s.hosts.map((c)=>({...c}))})}function fs(t){if(t.byteLength!==gt)return l(10);return[t,0]}async function bl(t){if(t.byteLength<Ia)return l(10);let e=A.Bind;return lt({parent:t,purpose:e,kdm:B})}class de{#t;constructor(t){this.#t=t}static async mix(t){let e,n,s;try{if(t.byteLength<Ss)return l(10);e=await _s(),n=new Uint8Array(e.byteLength+t.byteLength),n.set(e,0),n.set(t,e.byteLength),s=await an(n);let[r,o]=fs(s);if(o!==0)return l(o);let i=new de(r);return s=void 0,m(i)}finally{e?.fill(0),n?.fill(0),t.fill(0),s?.fill(0)}}static importSeed(t){let[e,n]=fs(t);if(n!==0)return l(n);let[s,r]=fs(e.slice());if(r!==0)return l(r);return m(new de(s))}static async unseal(t,e){let[,n]=te(t);if(n!==0)return l(n);let[s,r]=await bl(e);if(r!==0)return l(r);let o;try{try{o=await ye(t,s)}catch{return l(20)}return de.importSeed(o)}finally{s.fill(0),o?.fill(0)}}async idnt(t){let e=A.Identity;return lt({parent:this.#t,purpose:e,kdm:t})}async realmKey(t){return Si(this.#t,t)}async realmID(t){return Ii(this.#t,t)}async exportFileKey(t){let e=A.Export;return lt({parent:this.#t,purpose:e,kdm:t})}async fingerprint(t){let e=A.Fingerprint;return await lt({parent:this.#t,purpose:e,kdm:t})}async bindTag(t){let e=A.BindTag;return await lt({parent:this.#t,purpose:e,kdm:t})}async seal(t){let[e,n]=await bl(t);if(n!==0)return l(n);try{let s=await Ce(this.#t,e);return te(s)}catch{return l(12)}finally{e.fill(0)}}async sealSeedHosts(t,e){let[n,s]=this.#e(e);if(s!==0)return l(s);try{return m(await Ce(n,t))}catch{return l(12)}finally{n.fill(0)}}#e(t){let e=new U,n=e.writeStruct(xr,{hosts:t.map((o)=>({handle:o.handle,label:o.label,idx:o.idx??0}))});if(n!==0)return l(n);let s=e.result(),r=new Uint8Array(gt+s.byteLength);return r.set(this.#t,0),r.set(s,gt),[r,0]}async persistToLargeBlob(t,e){let[n,s]=await ll(e);if(s!==0)return l(s);let[r,o]=this.#e(t);if(o!==0)return l(o);try{let i=await Ur(n,r,e);if(i!==0)return l(i);return m(n)}finally{r.fill(0)}}async dumpToTTY(){return 21}copyForWorker(){return this.#t.slice()}}class ut{#t;constructor(t){this.#t=t}static async fromRandom(t){try{let[e,n]=await de.mix(t);if(n!==0)return l(n);return m(new ut(e))}finally{t.fill(0)}}static fromBytes(t){let[e,n]=de.importSeed(t);if(n!==0)return l(n);return m(new ut(e))}async sealWithPasskey(t){let[e,n]=await ml(t);if(n!==0)return l(n);try{let[s,r]=await this.#t.seal(e.prf);if(r!==0)return l(r);return m({sealedMaster:s,salt:e.salt,credId:e.credId,userId:e.userId,attachment:e.attachment,transports:e.transports,aaguid:e.aaguid})}finally{e.prf.fill(0)}}async bind(t,e){if(e!==void 0)for(let i of e){if(i.tag.byteLength!==Sa)return l(10);let[c,a]=await this.#t.bindTag(i.credId);if(a!==0)return l(a);try{if(!xn(c,i.tag))return l(10)}finally{c.fill(0)}}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return l(s);let[r,o]=await this.#t.bindTag(n.credId);if(o!==0)return l(o);return m({...n,tag:r})}static async unsealWithPasskey(t,e){if(t.length===0)return l(22);let[n,s]=await pl(t,e);if(s!==0)return l(s);try{for(let r of n.order){let[o,i]=await de.unseal(r.sealedMaster,n.prf);if(i===0)return m({enclave:new ut(o),credId:n.credId})}return l(20)}finally{n.prf.fill(0)}}async sealWithIKM(t){try{return await this.#t.seal(t)}finally{t.fill(0)}}static async unsealWithIKM(t,e){try{let[n,s]=await de.unseal(t,e);if(s!==0)return l(s);return m(new ut(n))}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){return this.#t.persistToLargeBlob(t,e)}static async fromLargeBlob(t){let[e,n]=await ol(t?.credId,t);if(n!==0)return l(n);try{let[s,r]=hl(e.blob);if(r!==0)return l(r);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static clearLargeBlob(t,e){return cl(t,e)}async dumpToTTY(){return this.#t.dumpToTTY()}static pairRequest(){return De.create()}async pairAccept(t,e,n){if(n.userControlsBothSidesOfPair!==!0)return l(10);let[s,r]=await ji(t);if(r!==0)return l(r);try{let[o,i]=await this.#t.sealSeedHosts(s.key,e);if(i!==0)return l(i);return Rr(We(s.pub,o))}finally{s.key.fill(0)}}spawnSyncWorker(t){let e=il(),n=this.#t.copyForWorker();return Zs(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}async exportKey(t){if(t.byteLength!==j)return l(10);return this.#t.exportFileKey(t)}async bagman(t,e){let[n,s]=await this.#t.idnt(t);if(s!==0)return l(s);let[r,o]=await this.#t.realmKey(e);if(o!==0)return n.fill(0),l(o);let[i,c]=await this.#t.realmID(e);if(c!==0)return n.fill(0),r.fill(0),l(c);try{let[a,d]=await Dn(i,t);if(d!==0)return n.fill(0),r.fill(0),l(d);return $t.init(n,r,a,t,e)}finally{i.fill(0)}}async fingerprint(t=B){return this.#t.fingerprint(t)}}function Zl(t){for(let e of Object.getOwnPropertyNames(t)){if(ga.has(e))continue;let n=Object.getOwnPropertyDescriptor(t,e);if(n===void 0||typeof n.value!=="function")continue;Object.defineProperty(t,e,{value:n.value,writable:!1,configurable:!1})}}var Sa=32,Ia=16,Ss=32,ga;var Oe=z(()=>{ot();tt();Oi();W();Ue();C();ct();Te();Cr();ps();Mr();al();yl();ur();dr();ga=new Set(["constructor","prototype","length","name"]);Zl(ut);Zl(ut.prototype)});class Qt{listeners=new Map;addEventListener(t,e){let n=this.listeners.get(t);if(!n)n=new Set,this.listeners.set(t,n);return n.add(e),()=>{this.removeEventListener(t,e)}}removeEventListener(t,e){let n=this.listeners.get(t);if(n){if(n.delete(e),n.size===0)this.listeners.delete(t)}}emit(t,e){let n=this.listeners.get(t);if(n){let s=Array.from(n);for(let r of s)r(e)}}emitAll(t){let e=Array.from(this.listeners.keys());for(let n of e)this.emit(n,t)}}class Ct{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Qt}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(Ct.eventName,t))}listen(t){return this.emitter.addEventListener(Ct.eventName,t),()=>{this.emitter.removeEventListener(Ct.eventName,t)}}}tt();W();C();async function Cs(t,e){let n=new U,s=n.writeDate(e);if(s!==0)return l(s);let r=n.result(),[o,i]=await t.sign(r);if(i!==0)return l(i);return m({pubKey:t.publicKey,sig:o,timestamp:e})}async function Ot(t,e,n){let s=n.now().getTime(),r=t.timestamp.getTime();if(Math.abs(s-r)>Xo)return 4;let i=new U;i.writeDate(t.timestamp);let c=i.result(),a;try{a=await e.importVerifyKey(t.pubKey)}catch{return 29}if(!await e.checkSigEd25519(t.sig,c,a))return 3;return 0}tt();tt();W();tt();W();C();var rt={encode(t,e){let n=t.writeVarBytes(e.id);if(n!==0)return n;let s=t.writeDate(e.ts);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return l(n);let[s,r]=t.readDate();if(r!==0)return l(r);return m({id:e,ts:s})}};function At(t){let e=new U,n=e.writeStruct(rt,t);if(n!==0)return l(n);let s=e.result();return m(s)}async function ec(t){return At({id:t,ts:new Date(0)})}C();var It={encode(t,e){let n=t.writeVarString(e.typ??"");if(n!==0)return n;let s=t.writeVarBytes(e.eid);if(s!==0)return s;let r=t.writeVarInt(e.off);if(r!==0)return r;let o=t.writeVarInt(e.ctr);if(o!==0)return o;let i=t.writeVarInt(e.len);if(i!==0)return i;if(e.hsh)t.writeBytes(e.hsh);return 0},decode(t){let[e,n]=t.readVarString();if(n!==0)return l(n);let[s,r]=t.readVarBytes();if(r!==0)return l(r);let o=new M(s),[,i]=rt.decode(o);if(i!==0)return l(i);let[c,a]=t.readVarInt();if(a!==0)return l(a);let[d,u]=t.readVarInt();if(u!==0)return l(u);let[p,y]=t.readVarInt();if(y!==0)return l(y);let b;if(p>0){let[h,Z]=t.readBytes(Dt);if(Z!==0)return l(Z);b=h}return m({typ:e,eid:s,off:c,ctr:d,len:p,hsh:b})}};W();ot();C();function Hn(t,e){return We(t,e)}function fo(t,e,n){if(t.rlm.byteLength!==j)return Promise.resolve(!1);return n.checkSigEd25519(t.sig,Hn(t.rlm,t.headCph),e)}async function So(t,e,n){let s;if(t.bod&&t.len>0)s=await n.blake3(t.bod);let r=new U,o=It.encode(r,{...t,hsh:s});if(o!==0)return l(o);let i=r.result(),[c,a]=await e.bagKDM(i);if(a!==0)return l(a);let d=e.rlm,[u,p]=await e.encrypt(c,i);if(p!==0)return l(p);let y=new Uint8Array(0);if(t.bod){let[X,G]=await e.encrypt(c,t.bod);if(G!==0)return l(G);y=X}let b=Hn(d,u),[h,Z]=await e.sign(b);if(Z!==0)return l(Z);return m({rlm:d,sig:h,kdm:c,headCph:u,bodyCph:y})}async function ks(t,e,n,s,r){let o=new M(t),[i,c]=It.decode(o);if(c!==0)return l(14);let a;if(e&&e.length>0){let[y,b]=await n.decrypt(e);if(b!==0)return l(b);a=y}let d=i.hsh&&a===void 0,u=i.hsh===void 0&&a!==void 0;if(d||u)return l(19);if(i.hsh&&a){let y=await s.blake3(a);if(!E(y,i.hsh))return l(19)}let p=r??await s.blake3(t);return m({msgHead:i,bod:a,headHash:p})}class jt{now(){return new Date}}function Io(t,e,n,s){let r=e.getTime()-t.getTime(),o=n.getTime()-s.getTime();return(r+o)/2}tt();ue();W();C();W();C();var nn={encode(t,e){if(t.writeVarInt(e.quota),e.quota>0){if(e.usage===void 0)return 9;t.writeVarInt(e.usage)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);let s;if(e>0){let[r,o]=t.readVarInt();if(o!==0)return l(o);s=r}return m({quota:e,usage:s})}};var Ps={encode(t,e){t.writeBytes(new Uint8Array([e.status]));let n=t.writeDate(e.timeRcvd);if(n!==0)return n;let s=t.writeDate(e.timeSent);if(s!==0)return s;let r=t.writeVarInt(e.subscription.term);if(r!==0)return r;let o=t.writeVarInt(e.subscription.elapsed);if(o!==0)return o;let i=t.writeStruct(nn,e.subscription.stat);if(i!==0)return i;let c=t.writeStruct(nn,e.subscription.dyn);if(c!==0)return c;return 0},decode(t){let[e,n]=t.readBytes(1);if(n!==0)return l(n);let s=e[0],[r,o]=t.readDate();if(o!==0)return l(o);let[i,c]=t.readDate();if(c!==0)return l(c);let[a,d]=t.readVarInt();if(d!==0)return l(d);let[u,p]=t.readVarInt();if(p!==0)return l(p);let[y,b]=t.readStruct(nn);if(b!==0)return l(b);let[h,Z]=t.readStruct(nn);if(Z!==0)return l(Z);return m({status:s,timeRcvd:r,timeSent:i,subscription:{term:a,elapsed:u,stat:y,dyn:h}})}};W();ct();tt();W();W();W();C();var er={encode(t,e){let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarInt(e.seq);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return l(n);let[s,r]=t.readVarInt();if(r!==0)return l(r);return m({headCph:e,seq:s})}};W();C();var Gt={encode(t,e){t.writeBytes(e.pubKey),t.writeBytes(e.sig);let n=t.writeDate(e.timestamp);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Zo);if(n!==0)return l(n);let[s,r]=t.readBytes(Tt);if(r!==0)return l(r);let[o,i]=t.readDate();if(i!==0)return l(i);return m({pubKey:e,sig:s,timestamp:o})}};ct();C();var ci={encode(t,e){if(e.rlm.byteLength!==j)return 10;return t.writeBytes(e.rlm),t.writeVarInt(e.seq)},decode(t){let[e,n]=t.readBytes(j);if(n!==0)return l(n);let[s,r]=zt(e);if(r!==0)return l(r);let[o,i]=t.readVarInt();if(i!==0)return l(i);return m({rlm:s,seq:o})}},ai={async encodeReq(t,e,n,s,r){let o=r.writeStruct(Gt,n);if(o!==0)return o;return r.writeStruct(ci,s)},async handleReq(t,e,n){let{clock:s,crypto:r,storage:o}=t,[i,c]=e.readStruct(Gt);if(c!==0)return c;let a=await Ot(i,r,s);if(a!==0)return a;let{pubKey:d}=i,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let[y,b]=e.readStruct(ci);if(b!==0)return b;if(!e.done())return 8;let[h,Z]=await o.listHeads(d,y.rlm,y.seq);if(Z!==0)return Z;return n.writeStructs(er,h)},decodeResp(t){return t.readStructs(er)}};W();C();var nr={encode(t,e){t.writeVarInt(e.seq);let n=t.writeVarBytes(e.bodyCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);let[s,r]=t.readVarBytes();if(r!==0)return l(r);return m({seq:e,bodyCph:s})}};W();ct();C();var di={encode(t,e){if(e.rlm.byteLength!==j)return 10;t.writeBytes(e.rlm);for(let n of e.seqs){let s=t.writeVarInt(n);if(s!==0)return s}return 0},decode(t){let[e,n]=t.readBytes(j);if(n!==0)return l(n);let[s,r]=zt(e);if(r!==0)return l(r);let o=[];while(!t.done()){let[i,c]=t.readVarInt();if(c!==0)return l(c);o.push(i)}return m({rlm:s,seqs:o})}},ui={async encodeReq(t,e,n,s,r){let o=r.writeStruct(Gt,n);if(o!==0)return o;return r.writeStruct(di,s)},async handleReq(t,e,n){let{clock:s,crypto:r,storage:o}=t,[i,c]=e.readStruct(Gt);if(c!==0)return c;let a=await Ot(i,r,s);if(a!==0)return a;let{pubKey:d}=i,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let[y,b]=e.readStruct(di);if(b!==0)return b;console.info(`PULL: ${y.seqs.length} bags`);let[h,Z]=await o.getBodies(d,y.rlm,y.seqs);if(Z!==0)return Z;if(!h)return 17;for(let{seq:X,bodyCph:G}of h){let S={seq:X,bodyCph:G},K=n.writeStruct(nr,S);if(K!==0)return K}return 0},decodeResp(t){return t.readStructs(nr)}};tt();W();ct();C();var sr={encode(t,e){if(e.rlm.byteLength!==j)return 10;if(e.sig.byteLength!==Tt)return 10;t.writeBytes(e.sig),t.writeBytes(e.rlm),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;let s=t.writeVarBytes(e.bodyCph);if(s!==0)return s;return 0},decode(t){let[e,n]=t.readBytes(Tt);if(n!==0)return l(n);let[s,r]=t.readBytes(j);if(r!==0)return l(r);let[o,i]=zt(s);if(i!==0)return l(i);let[c,a]=t.readBytes(vt);if(a!==0)return l(a);let[d,u]=t.readVarBytes();if(u!==0)return l(u);let[p,y]=t.readVarBytes();if(y!==0)return l(y);return m({rlm:o,sig:e,kdm:c,headCph:d,bodyCph:p})}};W();ct();C();var Jn={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;if(e.rlm.byteLength!==j)return 10;t.writeBytes(e.rlm);let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let r=e.bodyCph?e.bodyCph.length:0,o=t.writeVarInt(r);if(o!==0)return o;if(r>0){if(!e.bodyCph)return 10;t.writeBytes(e.bodyCph)}return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);let[s,r]=t.readBytes(j);if(r!==0)return l(r);let[o,i]=zt(s);if(i!==0)return l(i);let[c,a]=t.readVarBytes();if(a!==0)return l(a);let[d,u]=t.readVarInt();if(u!==0)return l(u);let p;if(d>0){let[y,b]=t.readBytes(d);if(b!==0)return l(b);p=y}return m({seq:e,rlm:o,headCph:c,bodyCph:p})}};W();C();var Bn={encode(t,e){t.writeBytes(e.sig),t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;return 0},decode(t){let[e,n]=t.readBytes(Tt);if(n!==0)return l(n);let[s,r]=t.readBytes(vt);if(r!==0)return l(r);let[o,i]=t.readVarBytes();if(i!==0)return l(i);return m({sig:e,kdm:s,headCph:o})}};W();C();var dn={encode(t,e){if(t.writeVarInt(e.idx),t.writeBytes(new Uint8Array([e.status])),e.status===0)t.writeVarInt(e.seq);return 0},decode(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);let[s,r]=t.readBytes(1);if(r!==0)return l(r);let o=s[0];if(o!==0)return m({idx:e,status:o});let[i,c]=t.readVarInt();if(c!==0)return l(c);return m({idx:e,status:o,seq:i})}};W();var mi={encode(t,e){return t.writeStructs(sr,e)},decode(t){return t.readStructs(sr)}},pi={async encodeReq(t,e,n,s,r){let o=r.writeStruct(Gt,n);if(o!==0)return o;return r.writeStruct(mi,s)},async handleReq(t,e,n){let{clock:s,crypto:r,storage:o,notifier:i}=t,[c,a]=e.readStruct(Gt);if(a!==0)return a;let d=await Ot(c,r,s);if(d!==0)return d;let{pubKey:u}=c,[p,y]=await o.hasUser(u);if(y!==0)return y;if(!p)return 5;let[b,h]=e.readStruct(mi);if(h!==0)return h;console.info(`PUSH: ${b.length} bags`);let Z;try{Z=await r.importVerifyKey(u)}catch{return 29}let X=[],G=[];for(let I=0;I<b.length;I++){let x=b[I];if(!await fo(x,Z,r)){let Y={idx:I,status:3},w=n.writeStruct(dn,Y);if(w!==0)return w;continue}X.push(I),G.push(x)}let[S,K]=await o.setBags(u,G);if(K!==0)return K;if(!S||S.length!==G.length)return 17;let V=[];for(let I=0;I<G.length;I++){let x=G[I],R=X[I],Y=S[I];if(Y.status!==0){let v={idx:R,status:Y.status},D=n.writeStruct(dn,v);if(D!==0)return D;continue}let w=Y.seq,k=new U,J=k.writeStruct(Bn,x);if(J!==0)return J;let P=k.result(),f={seq:w,rlm:x.rlm,headCph:P};if(b.length===1&&x.bodyCph.length<=Go)f.bodyCph=x.bodyCph;V.push(f);let Q={idx:R,status:0,seq:w},N=n.writeStruct(dn,Q);if(N!==0)return N}if(V.length>0){let I=new U,x=I.writeStructs(Jn,V);if(x!==0)return x;let R=I.result();await Promise.resolve(i.push(u,R))}return 0},decodeResp(t){return t.readStructs(dn)}};W();C();var yi={async encodeReq(t,e,n,s,r){return r.writeStruct(Gt,n)},async handleReq(t,e,n){let{clock:s,crypto:r,storage:o}=t,[i,c]=e.readStruct(Gt);if(c!==0)return c;let a=await Ot(i,r,s);if(a!==0)return a;let{pubKey:d}=i;if(!e.done())return 8;let[u,p]=await o.addUser(d);if(p!==0)return p;return 0},decodeResp(t){return m(void 0)}};ot();tt();W();class rr{url;websocket;constructor(t){this.url=t}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(t,e,n=()=>{},s=()=>{}){let{url:r}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let o=new U;o.writeStruct(Gt,t);let i=o.result(),c=xt(i);return r.searchParams.set("t",c),this.websocket=new WebSocket(r),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),s()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,n()},this.websocket.onmessage=(a)=>{let d=new Uint8Array(a.data);e(d)},this.websocket.onerror=(a)=>{console.log(`ERROR: ${JSON.stringify(a)}`),this.websocket=void 0,n()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}C();var yt={user:{path:"/user",endpoint:yi,name:0},push:{path:"/push",endpoint:pi,name:2},peek:{path:"/peek",endpoint:ai,name:1},pull:{path:"/pull",endpoint:ui,name:3}},Yc={0:yt.user,2:yt.push,1:yt.peek,3:yt.pull},Mp={[yt.user.path]:yt.user,[yt.push.path]:yt.push,[yt.peek.path]:yt.peek,[yt.pull.path]:yt.pull};class or{url;listener;constructor(t){this.url=t;this.listener=new rr(t)}async call(t,e){let{path:n}=Yc[t],s=new URL(n,this.url);try{return await kc(s,e)}catch{return l(25)}}}var ir=(t)=>new or(t.handle);async function kc(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return l(24);let s=await M.fromResponse(n);return m(s)}C();class Fn{crypto;clock;transport;updateHostMeta;#t;constructor(t,e,n,s,r){this.crypto=e;this.clock=n;this.transport=s;this.updateHostMeta=r;this.#t=t}async call(t,e){let{clock:n,transport:s}=this,{endpoint:r,name:o}=t,[i,c]=await this.identity();if(c!==0)return l(c);let a=n.now(),[d,u]=await Cs(i,a);if(u!==0)return l(u);let p=new U,y=await r.encodeReq(this,i,d,e,p);if(y!==0)return l(y);let b=n.now(),[h,Z]=await s.call(o,p),X=n.now();if(Z!==0)return l(Z);let[G,S]=h.readStruct(Ps);if(S!==0)return l(S);if(G.status!==0)return l(G.status);let V={clockOffset:Io(b,G.timeRcvd,G.timeSent,X),subscription:G.subscription},I=await this.updateHostMeta(V);if(I!==0)return l(I);return r.decodeResp(h)}bagMgrFor(t=B){return this.#t.find((e)=>qt(t,e.realmKDM))}bagMgrs(){return this.#t}add(t){if(this.bagMgrFor(t.realmKDM)!==void 0)return;this.#t.push(t)}identity=()=>{let t=this.bagMgrFor(B)??this.#t[0];if(t===void 0)return Promise.resolve(l(13));return Promise.resolve(m(t))};hostRlm=(t=B)=>{let e=this.bagMgrFor(t);if(e===void 0)return Promise.resolve(l(13));return Promise.resolve(m(e.rlm))};seal=async(t,e=B)=>{let n=this.bagMgrFor(e);if(n===void 0)return l(13);return So(t,n,this.crypto)};register=()=>this.call(yt.user,void 0);peek=async(t,e=B)=>{let[n,s]=await this.hostRlm(e);if(s!==0)return l(s);return this.call(yt.peek,{rlm:n,seq:t})};push=(t)=>this.call(yt.push,t);pull=async(t,e=B)=>{let[n,s]=await this.hostRlm(e);if(s!==0)return l(s);return this.call(yt.pull,{rlm:n,seqs:t})};listen=async(t,e,n)=>{let{clock:s,transport:r}=this,{listener:o}=r,[i,c]=await this.identity();if(c!==0)return c;let a=s.now(),[d,u]=await Cs(i,a);if(u!==0)return u;return await o.connect(d,t,e,n)};isConnected(){let t=this.transport?.listener;if(t&&typeof t.connected==="function")return t.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}tt();tt();W();C();var Pc=new Uint8Array(0),Ye={encode(t,e){if(e.body!==void 0&&!(e.body instanceof Uint8Array))return 10;let n=t.writeVarBytes(e.pid??Pc);if(n!==0)return n;let s=t.writeVarStrings(e.tags??[]);if(s!==0)return s;if(e.body!==void 0&&e.body.length>0)t.writeBytes(e.body);return 0},decode(t){let[e,n]=t.readVarBytes();if(n!==0)return l(n);let s;if(e.length>0){let a=new M(e),[d,u]=a.readStruct(rt);if(u!==0)return l(u);if(!a.done())return l(14);let[p,y]=At(d);if(y!==0)return l(y);s=p}let[r,o]=t.readVarStrings();if(o!==0)return l(o);let i=t.readRest(),c={};if(s!==void 0)c.pid=s;if(r.length>0)c.tags=r;if(i.length>0)c.body=i;return m(c)}};function be(t){let e=new U,n=e.writeStruct(Ye,t);if(n!==0)return l(n);return m(e.result())}ue();W();ct();var ly=Symbol("DownloadKey");function Nn(t){if(t===void 0)return!0;return t.label===B.label&&t.index===B.index}function bi(t,e){return t.label===e.label&&t.index===e.index}function _t(t){return`${t.label}\x00${t.index}`}function un(t,e=B){if(Nn(e))return t.lastSeq;return t.seqs?.find((s)=>s.label===e.label&&s.index===e.index)?.lastSeq??0}function ke(t){let e=[B],n=new Set([_t(B)]),s=(r,o)=>{let i=r===""&&o===0?B:{label:r,index:o},c=_t(i);if(n.has(c))return;n.add(c),e.push(i)};for(let r of t){if(s(r.label,r.index),r.prior===void 0)continue;for(let o of r.prior)s(r.label,o)}return e}function En(t,e){if(t===void 0||t==="")return B;for(let n of e)if(n.label===t)return{label:n.label,index:n.index};return{label:t,index:0}}function zn(t){if(Nn(t))return;return t}function Pe(t,e,n){let s=n??B;return Nn(s)?`${t}:${e}`:`${t}:${s.label}:${s.index}:${e}`}function Qn(t,e){if(e.setLastSeq!==void 0)return e.setLastSeq;if(e.lastSeq!==void 0&&e.lastSeq>t)return e.lastSeq;return}function vn(t){let e=0,n=[];for(let s of t)if(Nn(s))e=s.lastSeq;else n.push(s);if(n.length===0)return{lastSeq:e};return{lastSeq:e,seqs:n}}W();C();function Xt(t){if(t===void 0)return m("");if(typeof t!=="string")return l(10);return m(t.trim())}function hi(t,e,n){let[s,r]=Xt(e);if(r!==0||s===void 0)return l(10);if(n&&t!==void 0&&t!==s)return l(10);return m(s)}ot();tt();W();C();tt();W();C();W();C();ue();var lr={encode(t,e){if(!Number.isInteger(e.num)||e.num<1)return 14;if(e.hsh.byteLength!==Dt)return 10;let n=en.encode(t,e.realm);if(n!==0)return n;let s=t.writeVarInt(e.num);if(s!==0)return s;return t.writeBytes(e.hsh),0},decode(t){let[e,n]=en.decode(t);if(n!==0)return l(n);let[s,r]=t.readVarInt();if(r!==0)return l(r);if(!Number.isInteger(s)||s<1)return l(14);let[o,i]=t.readBytes(Dt);if(i!==0)return l(i);return m({realm:e,num:s,hsh:o})}};function cr(t,e){if(t.byteLength!==j)return l(10);let n=new U;n.writeBytes(t);let s=Zi(n,e);if(s!==0)return l(s);return m(n.result())}var Le={encode(t,e){if(e.nonce.byteLength!==j)return 10;if(e.hsh.byteLength!==Dt)return 10;if(e.sig.byteLength!==Tt)return 10;t.writeBytes(e.nonce);let n=Zi(t,e.realms);if(n!==0)return n;return t.writeBytes(e.hsh),t.writeBytes(e.sig),0},decode(t){let[e,n]=t.readBytes(j);if(n!==0)return l(n);let[s,r]=Lc(t);if(r!==0)return l(r);let[o,i]=t.readBytes(Dt);if(i!==0)return l(i);let[c,a]=t.readBytes(Tt);if(a!==0)return l(a);return m({nonce:e,realms:s,hsh:o,sig:c})}};function Zi(t,e){let n=t.writeVarInt(e.length);if(n!==0)return n;for(let s of e){let r=lr.encode(t,s);if(r!==0)return r}return 0}function Lc(t){let[e,n]=t.readVarInt();if(n!==0)return l(n);if(!Number.isInteger(e)||e<0||e>t.remaining())return l(14);let s=[];for(let r=0;r<e;r++){let[o,i]=lr.decode(t);if(i!==0)return l(i);s.push(o)}return m(s)}var Xi={encode(t,e){let n=t.writeStruct(Le,e.head);if(n!==0)return n;return t.writeBytes(e.chunks),0},decode(t){let[e,n]=t.readStruct(Le);if(n!==0)return l(n);return m({head:e,chunks:t.readRest()})}};W();C();var ar={encode(t,e){t.writeBytes(e.kdm);let n=t.writeVarBytes(e.headCph);if(n!==0)return n;return t.writeVarInt(e.lenBody)},decode(t){let[e,n]=t.readBytes(vt);if(n!==0)return l(n);let[s,r]=t.readVarBytes();if(r!==0)return l(r);let[o,i]=t.readVarInt();if(i!==0)return l(i);return m({kdm:e,headCph:s,lenBody:o})}};ue();W();C();ct();W();C();dr();ct();ur();async function gi(t,e){let[n,s]=await lt({parent:t,purpose:A.Identity,kdm:B});if(s!==0)return l(s);let[r,o]=await lt({parent:t,purpose:A.RealmKey,kdm:e});if(o!==0)return n.fill(0),l(o);let[i,c]=await lt({parent:t,purpose:A.RealmID,kdm:e});if(c!==0)return n.fill(0),r.fill(0),l(c);try{let[a,d]=await Dn(i,B);if(d!==0)return n.fill(0),r.fill(0),l(d);return $t.init(n,r,a,B,e)}finally{i.fill(0)}}var we;((Vi)=>{Vi.defaultFileExtension="dpl";function e(c){let[a,d]=Le.decode(new M(c));if(d!==0)return l(d);return m(a.nonce)}Vi.exportNonce=e;async function n(c,a,d,u){return r(c,a,d,u)}Vi.sealExport=n;async function s(c,a,d){let u=await a.genRandomBytes(j),[p,y]=await c.exportKey(u);if(y!==0)return l(y);try{return await r(d,a,p,u)}finally{p.fill(0)}}Vi.exportFile=s;async function r(c,a,d,u){if(u.byteLength!==j)return l(10);let p=Ki(d),[y,b]=await p(B);if(b!==0)return l(b);let h=new U,Z=[];for(let R of c){if(R.msgs.length<1)return l(14);let[Y,w]=await p(R.realm);if(w!==0)return l(w);let[k,J]=await Jc(h,R,Y);if(J!==0)return l(J);let P=await a.blake3(k);Z.push({realm:R.realm,num:R.msgs.length,hsh:P})}let[X,G]=cr(u,Z);if(G!==0)return l(G);let S=await a.blake3(X),[K,V]=await y.sign(S);if(V!==0)return l(V);let I=new U,x=I.writeStruct(Le,{nonce:u,realms:Z,hsh:S,sig:K});if(x!==0)return l(x);return h.prependBytes(I.result()),m(h.result())}Vi.encodeFile=r;async function o(c,a,d){let[u,p]=Xi.decode(new M(c));if(p!==0)return l(p);let{head:y,chunks:b}=u,h=Ki(d),[Z,X]=await h(B);if(X!==0)return l(X);let G;try{G=await a.importVerifyKey(Z.publicKey)}catch{return l(29)}if(!await a.checkSigEd25519(y.sig,y.hsh,G))return l(3);let[K,V]=cr(y.nonce,y.realms);if(V!==0)return l(V);let I=await a.blake3(K);if(!E(I,y.hsh))return l(19);let x=new M(b),R=[];for(let Y of y.realms){let[w,k]=await h(Y.realm);if(k!==0)return l(k);let[J,P]=await Bc(x,b,Y,a,w);if(P!==0)return l(P);R.push({realm:Y.realm,msgs:J})}if(!x.done())return l(14);return m(R)}Vi.decodeFile=o;async function i(c,a,d,u,p,y){let[b,h]=await o(c,a,d);if(h!==0)return l(h);let Z=await y(b);return r(Z,a,u,p)}Vi.migrateFile=i})(we||={});function Ki(t){let e=[];return async(n)=>{for(let o of e)if(qt(o.realm,n))return m(o.bagMgr);let[s,r]=await gi(t,n);if(r!==0)return l(r);return e.push({realm:n,bagMgr:s}),m(s)}}var Mc=40;function Uc(t){let e=t.body;if(e===void 0||t.head.len<=0||t.head.hsh===void 0)return 0;return e.length+Mc}async function Jc(t,e,n){if(e.msgs.length<1)return l(14);let s=new U,r=[];for(let i of e.msgs){let c=new U,a=c.writeStruct(It,i.head);if(a!==0)return l(a);let d=c.result(),[u,p]=await n.bagKDM(d);if(p!==0)return l(p);let[y,b]=await n.encrypt(u,d);if(b!==0)return l(b);let h=s.writeStruct(ar,{kdm:u,headCph:y,lenBody:Uc(i)});if(h!==0)return l(h);r.push(u)}let o=s.result();t.writeBytes(o);for(let i=0;i<e.msgs.length;i++){let c=e.msgs[i],a=r[i];if(c===void 0||a===void 0)return l(12);let d=c.body;if(d===void 0||c.head.len<=0||c.head.hsh===void 0)continue;let[u,p]=await n.encrypt(a,d);if(p!==0)return l(p);t.writeBytes(u)}return m(o)}async function Bc(t,e,n,s,r){let o=t.consumed(),i=[];for(let d=0;d<n.num;d++){let[u,p]=t.readStruct(ar);if(p!==0)return l(p);i.push(u)}let c=await s.blake3(e.subarray(o,t.consumed()));if(!E(c,n.hsh))return l(19);let a=[];for(let d of i){let[u,p]=await r.decrypt(d.kdm,d.headCph);if(p!==0)return l(p);let[y,b]=It.decode(new M(u));if(b!==0)return l(b);if(d.lenBody<0)return l(14);if(d.lenBody===0){a.push({head:y});continue}if(y.hsh===void 0)return l(14);let[h,Z]=t.readBytes(d.lenBody);if(Z!==0)return l(Z);let[X,G]=await r.decrypt(d.kdm,h);if(G!==0)return l(G);let S=await s.blake3(X);if(!E(S,y.hsh))return l(19);a.push({head:y,body:X})}return m(a)}tt();W();C();async function Wi({now:t,bod:e,crypto:n,typ:s=""}){let r=await n.genRandomBytes(8),o=new U,i=o.writeStruct(rt,{id:r,ts:t});if(i!==0)return l(i);let c=o.result();return On({now:t,eid:c,ctr:0,typ:s,bod:e,crypto:n})}async function On({now:t,eid:e,ctr:n,typ:s="",bod:r,crypto:o}){let i=new M(e),[c,a]=rt.decode(i);if(a!==0)return l(a);let d=t.getTime()-c.ts.getTime(),u,p=r?.length??0;if(r&&p>0)u=await o.blake3(r);return m({eid:e,off:d,ctr:n,typ:s,len:p,hsh:u})}ot();tt();W();C();function xi(t,e){let n=t.length<e.length?t.length:e.length;for(let s=0;s<n;s++)if(t[s]!==e[s])return t[s]-e[s];return t.length-e.length}async function Me(t,e){let n=Array.from(t);n.sort(xi);let s=0;for(let i of n)s+=i.length;let r=new Uint8Array(s),o=0;for(let i of n)r.set(i,o),o+=i.length;return e.blake3(r)}function Hi(t){let e=new U,n=e.writeVarBytes(t.eid);if(n!==0)return l(n);let s=e.writeDate(t.updatedAt);if(s!==0)return l(s);let r=e.writeVarInt(t.ctr);if(r!==0)return l(r);return m(e.result())}async function mn(t,e){let n=[];for(let s of t){let[r,o]=Hi(s);if(o!==0||!r)return l(o);n.push(r)}return m(await Me(n,e))}tt();W();C();Ue();var Zb=Symbol("EntityID");function Ri(t){return"type"in t}var Xb=Symbol("DerivationSeed"),Gb=Symbol("PublicKey"),fb=Symbol("PrivateKey"),Sb=Symbol("HostSpecificKeyPair"),Ib=Symbol("Hash");tt();W();C();function Fc(t){if(!t.bod||t.bod.length===0){let o={off:t.off,ctr:t.ctr,eid:t.eid};return m(o)}let e=new M(t.bod),[n,s]=e.readStruct(Ye);if(s!==0)return l(s);let r={off:t.off,ctr:t.ctr,eid:t.eid,type:t.typ??"",body:n.body};if(n.pid!==void 0)r.pid=n.pid;if(n.tags!==void 0)r.tags=n.tags;return m(r)}class pn{applier;emitter=new Qt;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(t,e,n,s){this.applier=t;this.clearer=e,this.onDirtyEids=n,this.cacheDriven=s?.cacheDriven??!1,this.peerIngest=s?.peerIngest}apply=async(t)=>{let e=[],n=[];for(let c of t){let[a,d]=Fc(c);if(n.push(d),d!==0)continue;e.push(a)}let{stats:s,types:r,eids:o}=await this.applier(e),i=[];for(let c=0;c<t.length;c++){let a=n[c],d=s[c];if(a!==0){i.push(a);continue}if(d!==0){i.push(d);continue}i.push(0)}if(!this.cacheDriven)for(let c of r)this.emitter.emit(c,null);if(o.length>0)this.onDirtyEids?.(o);return i};clear=async()=>{let t=await this.clearer();if(t!==0)return t;return this.emitter.emitAll(null),t};notify=(t)=>{for(let e of t)this.emitter.emit(e,null)};refresh=async(t)=>{if(this.peerIngest){await this.peerIngest(t);return}};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}var pr={apply:async function(t){return t.map(()=>0)},clear:async function(){return 0},notify:function(t){},refresh:async function(t){},on:function(t,e){},off:function(t,e){}};function Nc(t){return"subscribe"in t}function An(t){if(Nc(t)){let e=new pn((n)=>t.apply(n),()=>t.clear(),void 0,{cacheDriven:!0,peerIngest:async(n)=>{await t.ingestFromDurable(n)}});return t.subscribe((n)=>e.notify(n)),e}return new pn((e)=>t.apply(e),()=>t.clear())}function q(t){return"type"in t}function Ec(t){return!q(t)}function zc(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function yn(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return l(10);return m(!0)}function yr(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return zc(t,e.range)}function Qc(t,e){let n=e.excludeStart?t>e.start:t>=e.start,s=e.excludeEnd?t<e.end:t<=e.end;return n&&s}function bn(t){if(typeof t==="string")return m(t.length>0);if("range"in t){if(t.range.start>t.range.end)return l(10);return m(!0)}return m(t.prefix.length>0)}function br(t,e){if(typeof e==="string")return t===e;if("range"in e)return Qc(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function Ci(t){if(!Array.isArray(t)||t.length===0)return;let e=new Set,n=[];for(let s of t){if(typeof s!=="string"||s.length===0)continue;if(e.has(s))continue;e.add(s),n.push(s)}return n.length>0?n:void 0}function hn(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function hr(t){let e=new M(t.eid),[n,s]=e.readStruct(rt);if(s!==0)return l(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function Je(t,e){let n=new M(e.eid),[s,r]=n.readStruct(rt);if(r!==0)return l(r);let o=new Date(s.ts.getTime()+e.off);if(t!==void 0&&o<=t.updatedAt)return l(15);if(Ri(e)){let i=Ci(e.tags);return m({eid:e.eid,pid:e.pid,...i!==void 0?{tags:i}:{},type:e.type,createdAt:s.ts,updatedAt:o,ctr:e.ctr,body:e.body})}return m({eid:e.eid,updatedAt:o,ctr:e.ctr})}function Be(t,e){let n=new Set;if(t!==void 0&&q(t))n.add(t.type);if(q(e))n.add(e.type);return[...n]}var vc={getEnt:async()=>l(21),getRow:async()=>l(21),getEntities:async(t)=>l(21),countEntities:async()=>l(21),checksum:async()=>l(21),apply:async(t)=>({stats:t.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};C();class jn{inflight=null;again=!1;run(t){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(t),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(t){try{this.again=!1;let e=await t();while(this.again)this.again=!1,e=await t();return e}finally{this.inflight=null}}}var qn=100;class Zn{timer=null;delayMs;work;tail=new jn;constructor(t,e){this.delayMs=t<0?0:t,this.work=e}schedule(){if(this.delayMs<=0){this.fire();return}if(this.timer!==null)clearTimeout(this.timer);this.timer=setTimeout(()=>{this.timer=null,this.fire()},this.delayMs)}async flush(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null,this.fire();await this.tail.flush()}cancel(){if(this.timer!==null)clearTimeout(this.timer),this.timer=null}fire(){return this.tail.run(this.work)}}var Ti=!1;function _n(t){Ti=t===!0}function F(t,e){if(!Ti)return;let n=Math.round(performance.now());if(e!==void 0)console.warn(`[dip ${n}ms] ${t}`,e);else console.warn(`[dip ${n}ms] ${t}`)}tt();W();function Yi(t){let e=new M(t.eid),[n,s]=rt.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function Dc(t,e){let n=Yi(t),s=Yi(e);if(n===void 0&&s===void 0)return 0;if(n===void 0)return 1;if(s===void 0)return-1;if(s!==n)return s-n;return e.ctr-t.ctr}function Fe(t,e){return t.slice().sort((n,s)=>Dc(e(n),e(s)))}var he={phase:"idle"},Ne=50;function $n(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}tt();W();C();var Zr="blob:";function ki(t){return Zr+t}function Pi(t){return t!==void 0&&t.startsWith(Zr)}function Oc(t){if(!Pi(t))return;let e=t.slice(Zr.length);if(e.length===0)return;return e}function Li(t){return new M(t).readStruct(Ye)}function Ac(t,e){let n={};if(t!==void 0&&t.pid!==void 0)n.pid=t.pid;if(t!==void 0&&t.tags!==void 0&&t.tags.length>0)n.tags=t.tags;if(e.length>0)n.body=e;return n}function jc(t,e,n){let s={},r=n!==void 0&&Object.hasOwn(n,"pid")?n.pid:t.pid,o=n!==void 0&&Object.hasOwn(n,"tags")?n.tags:t.tags;if(r!==void 0)s.pid=r;if(o!==void 0&&o.length>0)s.tags=o;if(e.length>0)s.body=e;return s}function qc(t){let e=new M(t.eid),[n,s]=e.readStruct(rt);if(s!==0)return l(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function wi(t,e,n){if(t.length===0)return l(10);let[s,r]=be(Ac(n,e));if(r!==0)return l(r);return m({typ:ki(t),bod:s})}function Mi(t,e,n){if(t===void 0||t.bod===void 0||t.bod.length===0)return l(13);let s=Oc(t.typ);if(s===void 0)return l(10);let[r,o]=qc(t);if(o!==0)return l(o);let[i,c]=Li(t.bod);if(c!==0)return l(c);let a=n?.mime??s;if(a.length===0)return l(10);let[d,u]=be(jc(i,e,n));if(u!==0)return l(u);return m({typ:ki(a),bod:d,prior:r})}function Ui(t){if(t===void 0||t.bod===void 0||t.bod.length===0)return l(13);if(!Pi(t.typ))return l(13);let[e,n]=Li(t.bod);if(n!==0)return l(n);if(e.body===void 0)return m(new Uint8Array);return m(e.body.slice())}function ts(t,e){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(t,e);return}let n=URL.createObjectURL(t),s=document.createElement("a");s.href=n,s.download=e,document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(n)}function Ji(t,e,n){let s=[],r=[],o=0;for(let i of t){let c=e(i);if(r.length>0&&o+c>n)s.push(r),r=[],o=0;if(r.push(i),o+=c,o>=n)s.push(r),r=[],o=0}if(r.length>0)s.push(r);return s}async function Xr(t,e,n){let s=t.length;if(s<1)return[];let r=Array(s),o=0,i=Math.min(Math.max(1,e),s),c=async()=>{while(!0){let d=o;if(o+=1,d>=s)return;r[d]=await n(t[d],d)}},a=[];for(let d=0;d<i;d++)a.push(c());return await Promise.all(a),r}tt();ue();W();ct();tt();W();C();async function es(t,e,n,s){let r=n.rlm;if(r.byteLength!==j)return l(10);let o=new M(t.headCph),[i,c]=o.readStruct(Bn);if(c!==0)return l(c);let{sig:a,kdm:d,headCph:u}=i;if(!await s.checkSigEd25519(a,Hn(r,u),e))return l(3);let[y,b]=await n.decrypt(d,u);if(b!==0)return l(b);return m({kdm:d,headEnc:y})}W();C();var Sh=Symbol("EntRlm");function Ze(t){if(typeof t!=="string"||t==="")return;return t}function Ee(t){if(t.rlm!==void 0&&t.rlm!=="")return t;if(t.rlm===void 0)return t;let e={...t};return delete e.rlm,e}function Gr(t){return typeof t==="number"&&Number.isInteger(t)&&t>=0}function _c(t){return t!==null&&typeof t==="object"}function Xe(t){if(!_c(t)||typeof t.label!=="string")return;if(!Gr(t.index))return;let e={label:t.label,index:t.index};if(t.prior===void 0)return e;if(!Array.isArray(t.prior))return;let n=[];for(let s of t.prior){if(!Gr(s))return;n.push(s)}if(n.length>0)e.prior=n;return e}function ns(t,e,n){if(typeof t!=="string"||!Gr(n))return l(10);if(e!==void 0&&n<e.index)return l(10);let s=e?.prior!==void 0?e.prior.slice():void 0;if(e!==void 0&&n>e.index){let r=s!==void 0?s:[];return r.push(e.index),m({label:t,index:n,prior:r})}return m({label:t,index:n,...s!==void 0?{prior:s}:{}})}C();ot();W();var ne="f",ee="t",Pt="e";function $c(t){return t===ne||t===ee||t===Pt}function ze(t){if(t===!0||t===ee)return ee;if(t===Pt)return Pt;return ne}function ta(t){return ze(t.apld)===ne}function fr(t){return t!==0&&t!==15&&t!==18&&t!==17}function Ge(t,e,n){if(t.apld=e,e===Pt&&n!==void 0)t.err=n;else delete t.err}async function se(t,e,n,s){let r=s?.body!==!1,o=ze(e.apld),i=e.body,c=i?.length??0,a;if(r&&i&&c>0)a=await n.blake3(i);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,typ:e.typ??"",len:c,hsh:a},u={hash:t,head:d,apld:o};if(r&&i!==void 0)u.body=i;if(o===Pt&&e.err!==void 0)u.err=e.err;let p=Ze(e.rlm);if(p!==void 0)u.rlm=p;return u}var Sr=1048576,Ir=1048576,Fi=64;function ea(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}function Xn(t,e,n,s){let r=`${e}\x00${_t(s??B)}`,o=t.get(r);if(o){o.seqs.push(n);return}t.set(r,{host:e,realm:s,seqs:[n]})}async function Ni(t,e){for(let n of e.values())await t.downloads.deq(n.host,n.seqs,n.realm)}async function na(t,e,n,s,r,o=B){if(s.length<1)return 0;let[i,c]=await t.push(s);if(c!==0)return c;if(!i)return 27;for(let d of i){if(d.status!==0){console.error("push err",d);continue}let u=r[d.idx];if(!u){console.error("no hash",d);continue}await e.uploads.deq(n,[u])}let a=await e.hosts.get(n);if(a){let d=un(a,o),u=d,p=[];for(let y of i)if(y.status===0)p.push(y.seq);p.sort((y,b)=>y-b);for(let y of p)if(y===d+1)d=y;if(d>u)await e.hosts.touch(n,d,o)}return 0}async function Bi(t,e){if(e.length<1)return m([]);let n=new Map;for(let r of e){let o=r.realm??B,i=_t(o),c=n.get(i);if(!c)c={realm:o,dls:new Map,seqs:[]},n.set(i,c);c.dls.set(r.seq,r),c.seqs.push(r.seq)}let s=[];for(let r of n.values()){let[o,i]=await t.pull(r.seqs,r.realm);if(i!==0)return l(i);if(!o)return l(27);for(let{seq:c,bodyCph:a}of o){let d=r.dls.get(c);if(!d)continue;s.push({dl:d,bodyCph:a})}}return m(s)}async function sa(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let r=[],o=[],i=[],c=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:y,seq:b,host:h}=d,Z=d.realm??B,[X,G]=await Ei(d,n);if(G!==0){Xn(c,h,b,d.realm);continue}let{headEnc:S,headEncHash:K}=X,V=e.find((w)=>qt(Z,w.realmKDM));if(V===void 0){Xn(c,h,b,d.realm);continue}let[I,x]=await ks(S,u,{decrypt:(w)=>V.decrypt(y,w)},n,K);if(x!==0){Xn(c,h,b,d.realm);continue}let R={head:p,body:I.bod},Y=I.headHash;i.push({key:Y,data:ss(R,Z)}),r.push(R),o.push(Y),Xn(c,h,b,d.realm)}let a=await t.messages.add(i);await Ni(t,c);for(let d=0;d<a.length;d++){let u=a[d];if(u!==0&&u!==15)console.error("ERR storing",g[u],"for message",d)}return m({parts:r,hashes:o})}async function Ei(t,e){let n=t.headEnc;if(!n){let r=new U,o=r.writeStruct(It,t.head);if(o!==0)return l(o);n=r.result()}if(t.headEncHash)return m({headEnc:n,headEncHash:t.headEncHash});let s=await e.blake3(n);return m({headEnc:n,headEncHash:s})}async function zi(t,e,n){let s=new Set;for(let i of e)s.add(L(i));if(s.size<1)return;let r=Array.from(await t.downloads.list());if(r.length<1)return;let o=new Map;for(let i of r){let c;if(i.headEncHash)c=L(i.headEncHash);else{let[a,d]=await Ei(i,n);if(d!==0)continue;c=L(a.headEncHash)}if(!s.has(c))continue;Xn(o,i.host,i.seq,i.realm)}await Ni(t,o)}async function gr({conn:t,store:e,host:n,crypto:s,onProgress:r,peekProgressEvery:o,peekConcurrency:i,realm:c}){let a=c??B,d=t.bagMgrFor(a);if(d===void 0)return 13;let[u,p]=await t.identity();if(p!==0)return p;let y;try{y=await s.importVerifyKey(u.publicKey)}catch{return 29}let b=[],[h,Z]=await t.peek(un(n,a),a);if(Z!==0)return Z;let X=h.length,G=o??Ne,S=i??Fi;if(r&&X>0)r({phase:"peek",host:n.label,done:0,total:X});let K=0,V=await Xr(h,S,async(x)=>{let[R,Y]=await es(x,y,d,s),w;if(Y!==0)w={ok:!1,seq:x.seq,stat:Y};else{let k=await s.blake3(R.headEnc);w={ok:!0,seq:x.seq,kdm:R.kdm,headEnc:R.headEnc,headEncHash:k}}if(K+=1,r&&$n(K,X,G))r({phase:"peek",host:n.label,done:K,total:X});return w}),I=new Set;for(let x of V){if(!x.ok){console.error("peek: decrypting item head",x.stat);continue}let R=L(x.headEncHash);if(await e.messages.has(x.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(n.label,[x.headEncHash]),await e.downloads.deq(n.label,[x.seq],a);continue}if(I.has(R)){await e.downloads.deq(n.label,[x.seq],a);continue}let w=new M(x.headEnc),[k,J]=w.readStruct(It);if(J!==0){console.error("peek: reading item head",J);continue}I.add(R);let P={kdm:x.kdm,head:k,seq:x.seq,host:n.label,headEnc:x.headEnc,headEncHash:x.headEncHash},f=zn(a);if(f!==void 0)P.realm=f;b.push(P)}if(await e.downloads.enq(b),h.length>0){let x=Math.max(...h.map((R)=>R.seq));await e.hosts.recordSeqs(n.label,{lastSeq:x},a)}if(r)r({phase:"peek",host:n.label,done:X,total:X});return 0}async function Qi({conn:t,store:e,host:n,maxPushBytes:s,onProgress:r}){let o=s??Sr,i=await e.uploads.list(n.label),c=i.length,a=0;if(r&&c>0)r({phase:"push",host:n.label,done:0,total:c});let d=[],u=[],p=0,y=B,b=async()=>{if(d.length<1)return 0;let X=d.length,G=await na(t,e,n.label,d,u,y);if(d=[],u=[],p=0,G===0){if(a+=X,r)r({phase:"push",host:n.label,done:a,total:c})}return G},h=[],Z=await e.realms.list();for(let X of i){let G=await e.messages.get(X);if(!G){a+=1;continue}h.push({hash:X,realm:En(G.rlm,Z),msg:{...G.head,bod:G.body}})}h.sort((X,G)=>{if(X.realm.label<G.realm.label)return-1;if(X.realm.label>G.realm.label)return 1;return X.realm.index-G.realm.index});for(let X of h){if(d.length>0&&!bi(y,X.realm)){let V=await b();if(V!==0)return V}let[G,S]=await t.seal(X.msg,X.realm);if(S!==0)return S;let K=ea(G);if(d.length>0&&p+K>o){let V=await b();if(V!==0)return V}if(d.length<1)y=X.realm;if(d.push(G),u.push(X.hash),p+=K,p>=o){let V=await b();if(V!==0)return V}}return b()}async function Vr({conn:t,store:e,host:n,crypto:s,maxPullBytes:r,onProgress:o},i){let c=r??Ir,a=await e.downloads.list(),d=Array.from(a).filter((Z)=>Z.host===n.label);if(d.length<1)return 15;let u=Fe(d,(Z)=>Z.head),p=Ji(u,(Z)=>Z.head.len,c),y=u.length,b=0;if(o)o({phase:"pull",host:n.label,done:0,total:y});let h=Bi(t,p[0]);for(let Z=0;Z<p.length;Z++){let[X,G]=await h;if(G!==0)return G;if(b+=p[Z].length,o)o({phase:"pull",host:n.label,done:b,total:y});let S=p[Z+1];if(S)h=Bi(t,S);if(o)o({phase:"open",host:n.label,done:b,total:y});let K=Fe(X,(I)=>I.dl.head),[,V]=await sa(e,t.bagMgrs(),s,K);if(V!==0)return V;if(i){if(o)o({phase:"exec",host:n.label,done:b,total:y});await i()}}return 0}function ss({head:t,body:e},n){let s={eid:t.eid,body:e,apld:ne};if(t.off!==0)s.off=t.off;if(t.ctr!==0)s.ctr=t.ctr;if(t.typ)s.typ=t.typ;let r=Ze(n?.label);if(r!==void 0)s.rlm=r;return s}async function vi(t,{conn:e,store:n,host:s,crypto:r,onProgress:o},i){let c=s.label,[a,d]=await e.identity();if(d!==0)return;let u;try{u=await r.importVerifyKey(a.publicKey)}catch(I){console.error("Failed importing host verify key",I);return}let p=new M(t),[y,b]=p.readStructs(Jn);if(b!==0){console.error("Failed decoding notif",g[b]);return}let h=!1,Z=await n.hosts.get(c),X=new Map,G=[],S=!1;for(let I of y){let x=e.bagMgrs().find((v)=>E(v.rlm,I.rlm));if(x===void 0){console.error("notif: realm",g[13]);continue}let R=x.realmKDM,[Y,w]=await es({seq:I.seq,headCph:I.headCph},u,x,r);if(w!==0){console.error("Failed decrypting notif",g[w]);continue}let k=await r.blake3(Y.headEnc);if(await n.messages.has(k))continue;let J=new M(Y.headEnc),[P,f]=J.readStruct(It);if(f!==0){console.error("Failed to parse head",g[f]);continue}if(!I.bodyCph&&P.len>0){S=!0;let v={seq:I.seq,host:c,kdm:Y.kdm,head:P,headEnc:Y.headEnc,headEncHash:k},D=zn(R);if(D!==void 0)v.realm=D;await n.downloads.enq([v])}else G.push({...Y,head:P,bodyCph:I.bodyCph,headEncHash:k,realm:R,bagMgr:x});if(!Z){console.log("out of seq",I.seq,void 0),h=!0;continue}let Q=_t(R),N=X.get(Q);if(!N)N={realm:R,seq:un(Z,R)},X.set(Q,N);if(I.seq!==N.seq+1)console.log("out of seq",I.seq,N.seq),h=!0;else N.seq=I.seq}if(Z){for(let I of X.values())if(I.seq>un(Z,I.realm))await n.hosts.touch(s.label,I.seq,I.realm)}let K=[];for(let I of G){let[x,R]=await ks(I.headEnc,I.bodyCph,{decrypt:(Y)=>I.bagMgr.decrypt(I.kdm,Y)},r);if(R!==0){console.error("Failed to open body",g[R]);continue}K.push({key:I.headEncHash,data:ss({head:I.head,body:x.bod},I.realm)})}let V=await n.messages.add(K);for(let I=0;I<V.length;I++){let x=V[I];if(x!==0&&x!==15)console.error("ERR storing",g[x],"for message",I)}if(o&&K.length>0)o({phase:"open",host:s.label,done:K.length,total:K.length});if(h||S||K.length>0)i()}async function Kr(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:r,store:o,host:i,crypto:c,onProgress:a,peekProgressEvery:d,peekConcurrency:u}=t,[p,y]=await r.identity();if(y!==0)return l(y);let b;try{b=await c.importVerifyKey(p.publicKey)}catch{return l(29)}let h=new Map,Z=0,X=d??Ne,G=u??Fi,S=ke(await o.realms.list());for(let k of S){let J=r.bagMgrFor(k);if(J===void 0)return l(13);let[P,f]=await r.peek(0,k);if(f!==0)return l(f);Z+=P.length;let Q=P.length;if(a&&Q>0)a({phase:"peek",host:i.label,done:0,total:Q});let N=0,v=await Xr(P,G,async(T)=>{let[nt,st]=await es(T,b,J,c),at;if(st!==0)at={ok:!1,seq:T.seq,stat:st};else{let _=await c.blake3(nt.headEnc);at={ok:!0,seq:T.seq,kdm:nt.kdm,headEnc:nt.headEnc,headEncHash:_}}if(N+=1,a&&$n(N,Q,X))a({phase:"peek",host:i.label,done:N,total:Q});return at});for(let T of v){if(!T.ok)continue;let nt=L(T.headEncHash),st=h.get(nt);if(st)st.count+=1;else h.set(nt,{hash:T.headEncHash,count:1,sample:T,realm:k})}let D=P.length>0?Math.max(...P.map((T)=>T.seq)):0;if(await o.hosts.recordSeqs(i.label,{setLastSeq:D},k),a)a({phase:"peek",host:i.label,done:Q,total:Q})}let K=0,V=[];for(let k of h.values()){if(k.count>1)K+=k.count-1;V.push(k.hash)}let I=h.size,x=await Me(V,c),R=[],Y=0;for(let k of h.values()){if(await o.messages.has(k.hash)){await o.uploads.deq(i.label,[k.hash]);continue}if(Y+=1,!n)continue;let P=k.sample,f=new M(P.headEnc),[Q,N]=f.readStruct(It);if(N!==0){console.error("reconcile: reading msg header",N);continue}let v={kdm:P.kdm,head:Q,seq:P.seq,host:i.label,headEnc:P.headEnc,headEncHash:P.headEncHash},D=zn(k.realm);if(D!==void 0)v.realm=D;R.push(v)}if(R.length>0)await o.downloads.enq(R);let w=0;if(s){let k=await o.messages.listKeys(),J=new Set(h.keys()),P=[];for(let f of k)if(!J.has(L(f)))w+=1,P.push(f);if(P.length>0)await o.uploads.enq(i.label,P)}else{let k=await o.messages.listKeys(),J=new Set(h.keys());for(let P of k)if(!J.has(L(P)))w+=1}return m({msgcheck:x,numBags:Z,uniqueMsgs:I,numDupes:K,missingLocal:Y,missingHost:w})}function ra(t){return t.map(({head:e,body:n})=>({...e,bod:n}))}function oa(t,e){let n=[];for(let s of t){let r=En(s.rlm,e),o=n.find((i)=>qt(i.realm,r));if(o===void 0)o={realm:r,msgs:[]},n.push(o);o.msgs.push({head:s.head,body:s.body})}return n}class Qe{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;#t;applyChain=Promise.resolve();syncRuns=new jn;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=Ne;lastProgress=he;scheduledSync;constructor(t,e,n,s,r,o=!0,i=Sr,c=Ir,a){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=r;this.forceSkewHandlingByDefault=o;this.onScheduleSync=a;this.maxPushBytes=i,this.maxPullBytes=c,this.clientState=new Ct(()=>this.getClientState()),this.xferState=new Ct(()=>this.getXferState()),this.scheduledSync=new Zn(qn,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(d){console.error("Debounced sync failed:",d)}})}emitProgress=(t)=>{this.lastProgress=t,this.xferState.emit()};selected(){return this.#t}async setSeed(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return 10;let[,r]=await this.store.account.save(t,e);if(r!==0)return r;let o=await this.#o(n,t);if(o!==0)return o;return this.clientState.emit(),0}async adopt(t,e=""){let n=await this.#o(e,t);if(n!==0)return n;return this.clientState.emit(),0}#e(){return this.#t?.enclave}async#s(){return Array.from(await this.store.hosts.list())}async#r(){if(this.#t===void 0)return;this.#t.hosts=await this.#s()}async#n(){if(this.#t===void 0)return;this.#t.realms=await this.store.realms.list()}async#o(t,e){let n=await this.store.bind(t);if(n!==0)return n;return this.#t={label:t,enclave:e,hosts:await this.#s(),realms:await this.store.realms.list()},0}async getClientState(){let{store:t,connections:e}=this,n=this.#e(),s=await t.hosts.list(),r=!1;for(let o of e.values())if(o.isConnected()){r=!0;break}return{hasSeed:n!==void 0,hasHost:Array.from(s).length>0,connected:r}}async getXferState(){let{uploads:t,downloads:e}=this.store,n=await t.count();return{numDownloads:await e.count(),numUploads:n,progress:this.lastProgress}}apply=(t,e)=>{F("apply kick",{n:t.length});let n=this.state.apply(ra(t));return this.enqueueApplyJob(()=>this.doApply(t,e,n))};async doApply(t,e={enqueueUpload:!0,triggerUpload:!0},n){let s=[],r=[];for(let i of t){let c=new U;c.writeStruct(It,i.head);let a=c.result(),d=await this.crypto.blake3(a),u=ss(i,e.realm);s.push(d),r.push({key:d,data:u})}F("doApply archive start"),await this.store.messages.add(r),F("doApply archive done"),await zi(this.store,s,this.crypto),F("doApply await persist");let o=await n;if(F("doApply persist done"),await this.markApplyStats(s,o),e.enqueueUpload){let i=[];for(let c=0;c<s.length;c++){let a=o[c];if(a===0||a===15)i.push(s[c])}if(i.length>0){let c=await this.store.hosts.list();for(let a of c)await this.store.uploads.enq(a.label,i);this.xferState.emit()}}if(e.triggerUpload)this.scheduleSync();return o}enqueueApplyJob(t){let e=this.applyChain.then(t,t);return this.applyChain=e.then(()=>{return},()=>{return}),e}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let t=await this.store.messages.list({apld:ne});if(t.length<1)return[];let e=Fe(t,(n)=>n.head);return this.applyStored(e)}applyHashes=(t)=>this.enqueueApplyJob(()=>this.doApplyHashes(t));async doApplyHashes(t){let e=[];for(let r of t){let o=await this.store.messages.get(r);if(o)e.push(o)}let n=await this.applyStored(e),s=new Map;for(let r=0;r<e.length;r++)s.set(L(e[r].hash),n[r]??12);return t.map((r)=>s.get(L(r))??13)}async applyStored(t){if(t.length<1)return[];let e=t.map((s)=>({...s.head,bod:s.body})),n=await this.state.apply(e);return await this.markApplyStats(t.map((s)=>s.hash),n),n}async markApplyStats(t,e){let n=[],s=[];for(let r=0;r<t.length;r++){let o=e[r];if(o===0||o===15)n.push(t[r]);else if(o!==void 0&&fr(o))s.push({key:t[r],err:o})}if(n.length>0)await this.store.messages.markApplied(n);if(s.length>0)await this.store.messages.markFailed(s)}async insertRaw(t,e=""){F("insertRaw");let{clock:n,crypto:s}=this,r=n.now(),[o,i]=await Wi({now:r,bod:t,typ:e,crypto:s});if(i!==0)return l(i);let a=(await this.apply([{head:o,body:t}]))[0];if(a!==0&&a!==15)return l(a??12);return m(o)}async makeUpdate(t,e,n=""){let{clock:s,crypto:r}=this,o=s.now();if(t.updatedAt.getTime()>o.getTime())return l(4);let i=t.ctr+1,[c,a]=await On({now:o,eid:t.eid,ctr:i,typ:n,bod:e,crypto:r});if(a!==0)return l(a);return m({head:c,body:e})}async updateWithSkew(t,e,n,s=""){if(n===!1)return l(4);let{clock:r,crypto:o}=this,i=r.now(),c=new M(t.eid),[a,d]=c.readStruct(rt);if(d!==0)return l(d);let u=t.updatedAt.getTime()-a.ts.getTime(),p={eid:t.eid,off:u+1,ctr:t.ctr+1,typ:"",len:0},b=(await this.apply([{head:p,body:void 0}]))[0];if(b!==0&&b!==15)return l(b??12);if(e===void 0)return m(p);let[h,Z]=At({id:a.id,ts:i});if(Z!==0)return l(Z);let[X,G]=await On({now:i,eid:h,ctr:0,typ:s,bod:e,crypto:o});if(G!==0)return l(G);let K=(await this.apply([{head:X,body:e}]))[0];if(K!==0&&K!==15)return l(K??12);return m(X)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault,s=""){if(F("updateRaw"),t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n,s);let[r,o]=await this.makeUpdate(t,e,s);if(o!==0)return l(o);let c=(await this.apply([r]))[0];if(c!==0&&c!==15)return l(c??12);return m(r.head)}async insert(t){let[e,n]=be(t);if(n!==0)return l(n);return this.insertRaw(e,t.type)}async update(t){let[e,n]=be(t);if(n!==0)return l(n);return this.updateRaw(t.prior,e,t.force??this.forceSkewHandlingByDefault,t.type)}async delete(t){let e=t.force??!0;if("prior"in t)return this.updateRaw(t.prior,void 0,e);let[n,s]=await this.revFromArchive(t.eid);if(s!==0)return l(s);return this.updateRaw(n,void 0,e)}async insertBlob(t,e,n){let[s,r]=wi(t,e,n);if(r!==0)return l(r);return this.insertRaw(s.bod,s.typ)}async updateBlob(t,e,n){let[s,r]=Mi(await this.lastMsg(t),e,n);if(r!==0)return l(r);return this.updateRaw(s.prior,s.bod,void 0,s.typ)}deleteBlob(t){return this.delete({eid:t})}async readBlob(t){return Ui(await this.lastMsg(t))}async lastMsg(t){let e=await this.store.messages.last(t);if(e===void 0)return;let n={...e.head};if(e.body!==void 0)n.bod=e.body;return n}async revFromArchive(t){let e=await this.store.messages.last(t);if(e)return hr(e.head);let n=new M(t),[s,r]=n.readStruct(rt);if(r!==0)return l(r);return m({eid:t,ctr:-1,updatedAt:s.ts})}async genEID(t){let{clock:e,crypto:n}=this,s=e.now();if(t!==void 0)return At({id:t,ts:s});let r=await n.genRandomBytes(8);return At({id:r,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this;if(!this.#e())return 22;await this.drainApplyQueue(),await this.#n();let r=ke(this.#t?.realms??[]);for(let[o,i]of t){let c=await n.hosts.get(o);if(!c)continue;let a=await this.#i(i,c);if(a!==0)return this.emitProgress({phase:"idle"}),a;let d={conn:i,store:n,host:c,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};for(let y of r){let b=await gr({...d,realm:y});if(b!==0)return console.error(`Failed to peek: ${b}`),this.emitProgress({phase:"idle"}),b;this.xferState.emit()}let u=await Qi(d);if(u!==0)return console.error(`Failed to push: ${u}`),this.emitProgress({phase:"idle"}),u;this.xferState.emit();let p=await Vr(d,async()=>{await this.drainApplyQueue()});if(p!==0&&p!==15)return console.error(`Failed to pull: ${p}`),this.emitProgress({phase:"idle"}),p;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(t){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),t?.checkHost??!0){let n=await this.repull();if(n!==0)return n}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let t=await this.store.messages.listKeys();return Me(t,this.crypto)}listMsgs(t){return this.store.messages.list(t)}countMsgs(t){return this.store.messages.count(t)}async reconcile(t,e){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:n,crypto:s,store:r}=this;if(!this.#e())return l(22);let i=await r.hosts.get(t);if(!i)return l(13);let c=n.get(t);if(!c||!c.isConnected()){if(await this.connectToHost(i,!1,!1),i=await r.hosts.get(t),!i)return l(13);c=n.get(t)}if(!c)return l(12);let a=await this.#i(c,i);if(a!==0)return l(a);let d={conn:c,store:r,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[u,p]=await Kr({...d,host:i},e);if(this.xferState.emit(),p!==0)return this.emitProgress({phase:"idle"}),l(p);if(!u)return this.emitProgress({phase:"idle"}),l(12);if(e?.sync===!1)return this.emitProgress({phase:"idle"}),m(u);let y=await this.sync();if(y!==0)return l(y);let b=await r.hosts.get(t);if(!b)return l(13);let[h,Z]=await Kr({...d,host:b},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),Z!==0)return l(Z);if(!h)return l(12);return m(h)}async repull(){let{connections:t,crypto:e,store:n}=this;if(!this.#e())return 22;let r=Array.from(await n.hosts.list());if(r.length<1)return 0;await this.#n();let o=ke(this.#t?.realms??[]);for(let i of r){let c=t.get(i.label);if(!c||!c.isConnected())await this.connectToHost(i,!1,!1)}for(let[i,c]of t){let a=await n.hosts.get(i);if(!a)continue;let d=await this.#i(c,a);if(d!==0)return this.emitProgress({phase:"idle"}),d;let u={conn:c,store:n,host:{...a,lastSeq:0,seqs:void 0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};for(let y of o){let b=await gr({...u,realm:y});if(b!==0)return console.error(`rebuild: failed to peek: ${b}`),this.emitProgress({phase:"idle"}),b;this.xferState.emit()}let p=await Vr(u);if(p!==0&&p!==15)return console.error(`rebuild: failed to pull: ${p}`),this.emitProgress({phase:"idle"}),p;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let t=await this.state.clear();if(t!==0)return t;let e=await this.store.messages.list(),n=Fe(e,(o)=>o.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let r=0;while(r<n.length){let o=0,i=0,c=r;for(let d=r;d<n.length&&i<100&&o<102400;d++)o+=n[d].head.len,i++,c=d+1;let a=n.slice(r,c);await this.applyStored(a),this.emitProgress({phase:"exec",done:c,total:s}),r=c}return this.emitProgress({phase:"idle"}),0}async wipe(t){let e=t?.msgs!==!1,n=t?.ents!==!1,s=t?.meta!==!1,r=t?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:o}=this;if(s)await o.hosts.wipe(),await o.uploads.wipe(),await o.downloads.wipe();if(e)await o.messages.wipe();if(n)await this.state.clear();if(r)await o.account.wipe(),await o.realms.wipe(),this.#t=void 0;else if(s)await this.#r(),await this.#n();this.lastProgress=he,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n}=this,s=e?.onProgress,r=this.#e();if(!r)return 22;console.time("import: decoding file...");let o=await t.bytes(),[i,c]=we.exportNonce(o);if(c!==0)return console.timeEnd("import: decoding file..."),c;let[a,d]=await r.exportKey(i);if(d!==0)return console.timeEnd("import: decoding file..."),d;let u;try{u=await we.decodeFile(o,n,a)}finally{a.fill(0),console.timeEnd("import: decoding file...")}let[p,y]=u;if(y!==0)return y;let b=0,h=new Map;for(let X of p){if(b+=X.msgs.length,X.realm.label==="")continue;let G=h.get(X.realm.label);if(G===void 0||X.realm.index>G)h.set(X.realm.label,X.realm.index)}for(let[X,G]of h){let S=await this.store.realms.put(X,G);if(S===10)continue;if(S!==0)return S}if(h.size>0)await this.#n();let Z=0;for(let X of p){let G=0;while(G<X.msgs.length){let S=0,K=0,V=G;for(let R=G;R<X.msgs.length&&K<100&&S<102400;R++)S+=X.msgs[R].head.len,K++,V=R+1;let I=X.msgs.slice(G,V);console.time(`import: applying [${Z}, ${Z+I.length}]`);let x=await this.apply(I,{enqueueUpload:!0,triggerUpload:!1,realm:X.realm});console.timeEnd(`import: applying [${Z}, ${Z+I.length}]`);for(let R=0;R<I.length;R++){let Y=x[R];if(Y!==0&&Y!==15)console.warn(`failed to import msg ${Z+R}: ${g[Y]}`)}if(Z+=I.length,s)queueMicrotask(()=>s(Z,b,0));this.emitProgress({phase:"import",done:Z,total:b}),G=V}}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:t,store:e}=this,n=this.#e();if(!n)return l(22);let s=await e.realms.list(),r=await e.messages.list();return we.exportFile(n,t,oa(r,s))}async export(t){let[e,n]=await this.exportBytes();if(n!==0)return n;if(!e)return 12;let s=new Blob([e.slice()]);return ts(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),await this.#r(),await this.#n(),this.clientState.emit(),e){let n=await this.store.hosts.get(t.label);if(n)await this.connectToHost(n)}}async unlink(t){await this.store.hosts.del(t),await this.#r(),await this.#n(),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(t,e=!0,n=!0)=>{let{clock:s,connections:r,crypto:o,store:i,transport:c}=this,a=r.get(t.label);if(a){if(a.isConnected())return;try{a.closeListener()}catch{}r.delete(t.label)}if(!this.#e())return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new Fn([],o,s,c(t),async(y)=>{let b=await i.hosts.set(t.label,y);return await this.#r(),await this.#n(),b});if(await this.#i(u,t)!==0)return;if(await u.register(),e)await u.listen(async(y)=>{if(await this.#i(u,t)!==0)return;let h={conn:u,store:i,host:t,crypto:o,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return vi(y,h,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(r.set(t.label,u),this.clientState.emit(),n)this.scheduleSync()};async#i(t,e){let n=this.#e();if(!n)return 22;let s={label:e.label,index:e.idx??0},r=ke(await this.store.realms.list());for(let o of r){if(t.bagMgrFor(o)!==void 0)continue;let[i,c]=await n.bagman(s,o);if(c!==0)return c;t.add(i)}return 0}async connect(t=!0,e=!0){let{connectToHost:n,scheduleSync:s,store:r}=this;if(!this.#e())return;await this.drainApplyQueue();let i=await r.hosts.list();for(let c of i)await n(c,t,!1);if(e)s()}disconnect=async()=>{for(let t of this.connections.values())try{t.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}Te();var re=oi;ot();W();function Di(t,e){if(t===null||e===null||typeof t!=="object"||typeof e!=="object")return!1;try{return JSON.stringify(t)===JSON.stringify(e)}catch{return!1}}C();ot();W();Oe();C();Oe();ct();W();ot();Ue();C();Gs();ae();var Gl=8;class In{#t;#e;#s;#r;#n;#o;#i;constructor(t){this.#n=t.persistKeyring,this.#s={rpId:t.rpId,rpName:t.rpName},this.#r=t.userName??t.rpId??t.rpName??Gn,this.#o=t.unlockAccount}static open(t){let e=new In(t);if(t.keyring===void 0)return m(e);let[n,s]=fn(t.keyring);if(s!==0)return l(s);return e.#e=n,m(e)}get keyring(){if(this.#e===void 0)return;let[t,e]=fn(this.#e);if(e!==0)return;return t}list(){if(this.#e===void 0)return[];return this.#e.entries.map(xa)}async save(t,e){let n=this.#t!==void 0||this.#e!==void 0&&this.#e.entries.length>0,[s,r]=hi(this.#i,e?.label,n);if(r!==0||s===void 0)return l(10);if(e?.persist===!0)return l(10);return this.#i=s,this.#t=t,m(this.#t)}async bindAndSave(t,e){let n=this.#e,s=e?.credId,r=s instanceof Uint8Array?s.byteLength>0:s!==void 0&&s.length>0;if(!r&&n!==void 0&&n.entries.length>=Gl)return l(26);let o=Xl(e?.nick),i=e?.excludeCredentials??(r?void 0:Il(n)),c=e?.salt??n?.salt,a=n===void 0?void 0:n.entries.map((G)=>({credId:G.credId,tag:G.tag})),[d,u]=await t.bind({...this.#s,salt:c,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!r,excludeCredentials:i,userName:this.#r,displayName:o??this.#s.rpName??this.#r,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},a);if(u!==0)return l(u);let p=Date.now(),y={type:"prf",sealedMaster:d.sealedMaster,credId:d.credId,tag:d.tag,userId:d.userId,nick:o,enrolledAt:p,lastUsedAt:p,attachment:d.attachment,transports:d.transports,aaguid:d.aaguid,enrolledOs:Va()},b=n===void 0?{salt:d.salt.slice(),entries:[]}:n,[h,Z]=Ha(b,y);if(Z!==0)return l(Z);let X=await this.#n(h);if(X!==0)return l(X);return this.#e=h,this.#t=t,m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#o;if(t!==void 0){let[i,c]=await t();if(c!==0)return l(c);if(i===void 0)return l(13);if(i.keyring===void 0)this.#e=void 0;else{let[a,d]=fn(i.keyring);if(d!==0)return l(d);this.#e=a}return this.#t=i.enclave,m(i.enclave)}let e=this.#e;if(e===void 0||e.entries.length===0)return l(22);let[n,s]=await ut.unsealWithPasskey(e.entries.map((i)=>({sealedMaster:i.sealedMaster,credId:i.credId})),{...this.#s,salt:e.salt});if(s!==0)return l(s);this.#t=n.enclave;let[r,o]=Br(e,n.credId);if(o!==0)return l(o);if(r!==void 0){let i=await this.#n(r);if(i!==0)return l(i);this.#e=r}return m(n.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return l(22);let s=n.entries.findIndex((u)=>E(u.credId,t));if(s<0)return l(13);let[r,o]=Sn(n.entries);if(o!==0)return l(o);let i=r[s];if(i===void 0)return l(13);let c=Xl(e);r[s]={...i,nick:c};let a={salt:n.salt.slice(),entries:r},d=await this.#n(a);if(d!==0)return l(d);return this.#e=a,m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return l(22);let n=e.entries.filter((c)=>!E(c.credId,t));if(n.length===e.entries.length)return l(13);if(n.length===0){let c=await this.#n(void 0);if(c!==0)return l(c);return this.#e=void 0,m(void 0)}let[s,r]=Sn(n);if(r!==0)return l(r);let o={salt:e.salt.slice(),entries:s},i=await this.#n(o);if(i!==0)return l(i);return this.#e=o,m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,this.#i=void 0,await this.#n(void 0)}}function Xl(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function Va(){if(typeof navigator>"u")return;return nl(navigator.userAgent)}function Ka(t){let[e,n]=te(t.sealedMaster.slice());if(n!==0)return l(n);let[s,r]=Et(t.tag.slice(),A.BindTag);if(r!==0)return l(r);return m({type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:s,userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs})}function Sn(t){let e=[];for(let n of t){let[s,r]=Ka(n);if(r!==0)return l(r);e.push(s)}return m(e)}function fn(t){let[e,n]=Sn(t.entries);if(n!==0)return l(n);return m({salt:t.salt.slice(),entries:e})}function fl(t){return t!==null&&typeof t==="object"}function Wa(t){if(!fl(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=te(t.sealedMaster);if(n!==0)return;let[s,r]=Et(t.tag.slice(),A.BindTag);if(r!==0)return;let o=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,i=t.enrolledOs,c=i==="ios"||i==="macos"||i==="android"||i==="windows"||i==="linux"||i==="other"?i:void 0,a=Array.isArray(t.transports)?t.transports.filter((d)=>typeof d==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:s,userId:t.userId instanceof Uint8Array?t.userId.slice():void 0,nick:typeof t.nick==="string"?t.nick:void 0,enrolledAt:t.enrolledAt,lastUsedAt:typeof t.lastUsedAt==="number"&&Number.isFinite(t.lastUsedAt)?t.lastUsedAt:void 0,attachment:o,transports:a===void 0||a.length===0?void 0:a,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:c}}function Sl(t){if(!fl(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=Wa(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function xa(t){return{type:"prf",credId:t.credId.slice(),userId:t.userId===void 0?void 0:t.userId.slice(),nick:t.nick,enrolledAt:t.enrolledAt,lastUsedAt:t.lastUsedAt,attachment:t.attachment,transports:t.transports===void 0?void 0:[...t.transports],aaguid:t.aaguid===void 0?void 0:t.aaguid.slice(),enrolledOs:t.enrolledOs}}function Il(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function Ha(t,e){let[n,s]=Sn(t.entries);if(s!==0)return l(s);let r=n.findIndex((o)=>E(o.credId,e.credId));if(r>=0){let o=n[r];n[r]={...e,enrolledAt:o?.enrolledAt??e.enrolledAt,nick:e.nick??o?.nick}}else n.push(e);return m({salt:t.salt.slice(),entries:n})}function Br(t,e){if(e.byteLength===0)return m(void 0);let n=t.entries.findIndex((i)=>E(i.credId,e));if(n<0)return m(void 0);let[s,r]=Sn(t.entries);if(r!==0)return l(r);let o=s[n];if(o===void 0)return l(13);return s[n]={...o,lastUsedAt:Date.now()},m({salt:t.salt.slice(),entries:s})}var Ra=Is("fbfc3007154e4ecc8c0b6e020557d7bd"),Ca=Is("ea9b8d664d011d213ce4b6b48cb575d4"),Ta=Is("08987058cadc4b81b6e130de50dcbe96"),Ya=Is("2fc0579f811347eab116bb5a8db9202a");function Is(t){let e=new Uint8Array(16);for(let n=0;n<16;n++)e[n]=Number.parseInt(t.slice(n*2,n*2+2),16);return e}function ka(t){if(t===void 0||t.byteLength!==16)return;if(E(t,Ra))return"Apple Passkey";if(E(t,Ca))return"GPM";if(E(t,Ta))return"Windows Hello";if(E(t,Ya))return"YubiKey";return}function Pa(t){if(t.attachment==="cross-platform")return!0;if(t.transports===void 0)return!1;return t.transports.some((e)=>e==="usb"||e==="nfc"||e==="ble")}function gl(t){let e=ka(t.aaguid);if(e!==void 0)return e;if(Pa(t))return"Security key";if(t.attachment==="platform"){if(t.enrolledOs==="ios"||t.enrolledOs==="macos")return"Apple Passkey";if(t.enrolledOs==="android")return"GPM";if(t.enrolledOs==="windows")return"Windows Hello";return"Passkey"}return"Passkey"}function La(t){if(t.byteLength===0)return"";let e=Math.min(4,t.byteLength),n="";for(let s=t.byteLength-e;s<t.byteLength;s++){let r=t[s];if(r===void 0)continue;n+=r.toString(16).padStart(2,"0")}return n}function wa(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=gl(t),n=La(t.credId);return n===""?e:`${e} ${n}`}W();ct();C();async function Vl(t,e){let[n,s]=await t.fingerprint(e);if(s!==0)return l(s);return Et(n.slice(),A.Fingerprint)}async function gs(t,e){let n=await t.gen256BitSecureRandomSeed(),[s,r]=await Vl(e,n);if(r!==0)return l(r);return m({n,h:s})}async function gn(t,e){let[n,s]=await Vl(t,e.n);if(s!==0)return!1;return Ma(n,e.h)}function Kl(t){if(t===void 0||t===null||typeof t!=="object")return;let e=t;if(!(e.n instanceof Uint8Array)||!(e.h instanceof Uint8Array))return;if(e.n.byteLength<1)return;let[n,s]=Et(e.h.slice(),A.Fingerprint);if(s!==0)return;return{n:e.n.slice(),h:n}}function Vs(t){let e=t.n.slice(),[n,s]=Et(t.h.slice(),A.Fingerprint);if(s!==0)return{n:e,h:t.h};return{n:e,h:n}}function Ma(t,e){if(t.byteLength!==e.byteLength)return!1;let n=0;for(let s=0;s<t.byteLength;s++)n|=t[s]^e[s];return n===0}function Fr(t){if(t===""||typeof indexedDB>"u")return Promise.resolve();return new Promise((e,n)=>{let s=indexedDB.deleteDatabase(t);s.onsuccess=()=>e(),s.onerror=()=>n(s.error??Error(`[DIPLOMATIC] deleteDatabase failed (${t})`)),s.onblocked=()=>{console.warn(`[DIPLOMATIC] deleteDatabase blocked (${t})`)}})}function Nr(t,e,n){return new Promise((s,r)=>{let o=indexedDB.open(t,e);o.onupgradeneeded=()=>{let{result:i,transaction:c}=o;if(c===null){r(Error(`[DIPLOMATIC] missing upgrade transaction (${t})`));return}try{n(i,c)}catch(a){r(a instanceof Error?a:Error(String(a)))}},o.onblocked=()=>{console.warn(`[DIPLOMATIC] IDB upgrade blocked (${t} → v${e})`)},o.onsuccess=()=>{let i=o.result;i.onversionchange=()=>{i.close()},s(i)},o.onerror=()=>{r(o.error??Error(`[DIPLOMATIC] IDB open failed (${t})`))}})}ot();var Wl="meta",xl=1,Hl=9;function Ua(){let t=new Uint8Array(16);return globalThis.crypto.getRandomValues(t),xt(t)}function Ja(t){return`data-${t}`}function Ba(t){return`ents-${t}`}function Er(t,e){let n=t!==void 0&&t!==""?t:Ua();if(e!==void 0&&e!=="")return{acct:n,data:e};return{acct:n,data:Ja(n)}}function Rl(t,e){if(e!==void 0&&e!=="")return e;return Ba(t)}W();C();class zr{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(ft,"readwrite"),s=n.objectStore(ft);return new Promise((r,o)=>{n.oncomplete=()=>r(),n.onerror=()=>o(n.error);for(let i of e)s.put(i,Pe(i.host,i.seq,i.realm))})}async deq(t,e,n){let s=[...e];if(s.length===0)return;let r=this.db.transaction(ft,"readwrite"),o=r.objectStore(ft);return new Promise((i,c)=>{r.oncomplete=()=>i(),r.onerror=()=>c(r.error);for(let a of s)o.delete(Pe(t,a,n))})}async list(){let e=this.db.transaction(ft,"readonly").objectStore(ft);return new Promise((n,s)=>{let r=e.getAll();r.onsuccess=()=>n(r.result),r.onerror=()=>s(r.error)})}async count(){let e=this.db.transaction(ft,"readonly").objectStore(ft);return new Promise((n,s)=>{let r=e.count();r.onsuccess=()=>n(r.result),r.onerror=()=>s(r.error)})}async wipe(){let t=this.db.transaction(ft,"readwrite"),e=t.objectStore(ft);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}W();ct();function Qr(t){return t!==null&&typeof t==="object"}function vr(t){if(!Qr(t))return!1;return typeof t.host==="string"&&typeof t.label==="string"&&typeof t.index==="number"&&Number.isInteger(t.index)&&typeof t.lastSeq==="number"&&Number.isInteger(t.lastSeq)&&t.lastSeq>=0}function Fa(t){let e=[];if(!Array.isArray(t))return e;for(let n of t){if(!vr(n))continue;e.push({label:n.label,index:n.index,lastSeq:n.lastSeq})}return e}function Na(t){let e=new Map;if(!Array.isArray(t))return e;for(let n of t){if(!vr(n))continue;let s=e.get(n.host)??[];s.push({label:n.label,index:n.index,lastSeq:n.lastSeq}),e.set(n.host,s)}return e}function Cl(t,e){let n=vn(e),s={label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:n.lastSeq,clockOffset:t.clockOffset,subscription:t.subscription};if(n.seqs!==void 0)s.seqs=n.seqs;return s}function Tl(t){let e={label:t.label,handle:t.handle.toString()};if(t.idx!==void 0)e.idx=t.idx;if(t.clockOffset!==void 0)e.clockOffset=t.clockOffset;if(t.subscription!==void 0)e.subscription=t.subscription;return e}class Dr{db;constructor(t){this.db=t}async add(t){let e=await this.get(t.label),n=e!==void 0&&e.handle.href===t.handle.href&&(e.idx??0)===(t.idx??0),s=Tl(n&&e!==void 0?{...t,clockOffset:e.clockOffset,subscription:e.subscription}:t),r=this.db.transaction([mt,ht],"readwrite"),o=r.objectStore(mt),i=r.objectStore(ht);return new Promise((c,a)=>{if(r.oncomplete=()=>c(),r.onerror=()=>a(r.error),n){o.put(s);return}let d=i.index("host").getAllKeys(t.label);d.onsuccess=()=>{for(let u of d.result)i.delete(u);o.put(s)}})}async touch(t,e,n){return this.recordSeqs(t,{lastSeq:e},n)}async recordSeqs(t,e,n){let s=n??B,r=this.db.transaction([mt,ht],"readwrite"),o=r.objectStore(mt),i=r.objectStore(ht),c=[t,s.label,s.index];return new Promise((a,d)=>{r.oncomplete=()=>a(),r.onerror=()=>d(r.error);let u=o.get(t);u.onsuccess=()=>{if(!u.result)return;let p=i.get(c);p.onsuccess=()=>{let y=p.result,b=vr(y)?y.lastSeq:0,h=Qn(b,e);if(h===void 0)return;i.put({host:t,label:s.label,index:s.index,lastSeq:h})}}})}async get(t){let e=this.db.transaction([mt,ht],"readonly"),n=e.objectStore(mt),s=e.objectStore(ht);return new Promise((r,o)=>{e.onerror=()=>o(e.error);let i,c,a=2,d=()=>{if(a-=1,a>0)return;if(!Qr(i)){r(void 0);return}r(Cl(i,Fa(c)))},u=n.get(t);u.onsuccess=()=>{i=u.result,d()};let p=s.index("host").getAll(t);p.onsuccess=()=>{c=p.result,d()}})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put(Tl({...n,...e})),0}catch{return 18}}async del(t){let e=this.db.transaction([mt,ht],"readwrite"),n=e.objectStore(mt),s=e.objectStore(ht);return new Promise((r,o)=>{e.oncomplete=()=>r(),e.onerror=()=>o(e.error),n.delete(t);let i=s.index("host").getAllKeys(t);i.onsuccess=()=>{for(let c of i.result)s.delete(c)}})}async list(){let t=this.db.transaction([mt,ht],"readonly"),e=t.objectStore(mt),n=t.objectStore(ht);return new Promise((s,r)=>{t.onerror=()=>r(t.error);let o,i,c=2,a=()=>{if(c-=1,c>0)return;let p=Na(i),y=[];if(Array.isArray(o))for(let b of o){if(!Qr(b)||typeof b.label!=="string")continue;y.push(Cl(b,p.get(b.label)??[]))}s(y)},d=e.getAll();d.onsuccess=()=>{o=d.result,a()};let u=n.getAll();u.onsuccess=()=>{i=u.result,a()}})}async wipe(){let t=this.db.transaction([mt,ht],"readwrite"),e=t.objectStore(mt),n=t.objectStore(ht);return new Promise((s,r)=>{t.oncomplete=()=>s(),t.onerror=()=>r(t.error),e.clear(),n.clear()})}put(t){let e=this.db.transaction(mt,"readwrite"),n=e.objectStore(mt);return new Promise((s,r)=>{e.oncomplete=()=>s(),e.onerror=()=>r(e.error),n.put(t)})}}function Ks(){return Nr(Wl,xl,(t)=>{if(!t.objectStoreNames.contains(Vt))t.createObjectStore(Vt,{keyPath:"label"})})}function Yl(t){return Nr(t,Hl,Ea)}function Ea(t,e){if(!t.objectStoreNames.contains(mt))t.createObjectStore(mt,{keyPath:"label"});if(!t.objectStoreNames.contains(St))t.createObjectStore(St,{keyPath:["host","hash"]});if(!t.objectStoreNames.contains(ft))t.createObjectStore(ft);let n;if(!t.objectStoreNames.contains(et))n=t.createObjectStore(et);else n=e.objectStore(et);if(!n.indexNames.contains(je))n.createIndex(je,"apld",{unique:!1});if(!n.indexNames.contains(Or))n.createIndex(Or,"rlm",{unique:!1});if(!t.objectStoreNames.contains(Kt))t.createObjectStore(Kt,{keyPath:"label"});if(!t.objectStoreNames.contains(ht))t.createObjectStore(ht,{keyPath:["host","label","index"]}).createIndex("host","host",{unique:!1})}ot();W();class Ar{db;crypto;constructor(t,e){this.db=t;this.crypto=e}async add(t){let e=this.db.transaction(et,"readwrite"),n=e.objectStore(et);return new Promise((s)=>{if(t.length===0){s([]);return}let r=Array(t.length).fill(0);e.oncomplete=()=>s(r),e.onerror=()=>{for(let o=0;o<r.length;o++)r[o]=18;s(r)};for(let o=0;o<t.length;o++){let{key:i,data:c}=t[o],a=L(i),d=n.put(Ee(c),a);d.onerror=(u)=>{u.preventDefault(),r[o]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(et,"readwrite"),s=n.objectStore(et);return new Promise((r,o)=>{n.oncomplete=()=>r(),n.onerror=()=>o(n.error);for(let i of e){let c=L(i);s.delete(c)}})}async get(t){let n=this.db.transaction(et,"readonly").objectStore(et);return new Promise((s,r)=>{let o=L(t),i=n.get(o);i.onsuccess=async()=>{let c=i.result;if(c)s(await se(t,c,this.crypto));else s(void 0)},i.onerror=()=>r(i.error)})}async has(t){return await this.get(t)!==void 0}async list(t){let e=t?.apld,n=t?.body!==!1,r=this.db.transaction(et,"readonly").objectStore(et);return new Promise((o,i)=>{let c=[],a=e===void 0?r.openCursor():r.index(je).openCursor(IDBKeyRange.only(e));a.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,y=u.value;c.push({hash:bt(p),data:y}),u.continue()}else Promise.all(c.map(({hash:p,data:y})=>se(p,y,this.crypto,{body:n}))).then(o).catch(i)},a.onerror=()=>i(a.error)})}async count(t){let n=this.db.transaction(et,"readonly").objectStore(et);return new Promise((s,r)=>{let o=t===void 0?n.count():n.index(je).count(IDBKeyRange.only(t));o.onsuccess=()=>s(o.result),o.onerror=()=>r(o.error)})}async listKeys(){let e=this.db.transaction(et,"readonly").objectStore(et);return new Promise((n,s)=>{let r=[],o=e.openKeyCursor();o.onsuccess=(i)=>{let c=i.target.result;if(c)r.push(bt(c.key)),c.continue();else n(r)},o.onerror=()=>s(o.error)})}async last(t){let n=this.db.transaction(et,"readonly").objectStore(et);return new Promise((s,r)=>{let o,i=n.openCursor();i.onsuccess=async(c)=>{let a=c.target.result;if(a){let{key:d,value:u}=a;if(E(t,u.eid)){if(!o||(u.ctr??0)>(o.data.ctr??0)||(u.ctr??0)===(o.data.ctr??0)&&(u.off??0)>(o.data.off??0))o={key:d,data:u}}a.continue()}else if(o){let d=bt(o.key);s(await se(d,o.data,this.crypto))}else s(void 0)},i.onerror=()=>r(i.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(et,"readwrite"),s=n.objectStore(et);return new Promise((r,o)=>{n.oncomplete=()=>r(),n.onerror=()=>o(n.error);for(let i of e){let c=L(i),a=s.get(c);a.onsuccess=()=>{let d=a.result;if(!d)return;Ge(d,ee),s.put(d,c)},a.onerror=(d)=>{d.preventDefault()}}})}async markFailed(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(et,"readwrite"),s=n.objectStore(et);return new Promise((r,o)=>{n.oncomplete=()=>r(),n.onerror=()=>o(n.error);for(let{key:i,err:c}of e){let a=L(i),d=s.get(a);d.onsuccess=()=>{let u=d.result;if(!u)return;Ge(u,Pt,c),s.put(u,a)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(et,"readwrite"),e=t.objectStore(et);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}W();class jr{db;constructor(t){this.db=t}async list(){let e=this.db.transaction(Kt,"readonly").objectStore(Kt);return new Promise((n,s)=>{let r=e.getAll();r.onsuccess=()=>{let o=r.result,i=[];if(Array.isArray(o))for(let c of o){let a=Xe(c);if(a!==void 0)i.push(a)}n(i)},r.onerror=()=>s(r.error)})}async get(t){let n=this.db.transaction(Kt,"readonly").objectStore(Kt);return new Promise((s,r)=>{let o=n.get(t);o.onsuccess=()=>s(Xe(o.result)),o.onerror=()=>r(o.error)})}async put(t,e){let n=this.db.transaction(Kt,"readwrite"),s=n.objectStore(Kt);return new Promise((r,o)=>{let i=0;n.oncomplete=()=>r(i),n.onerror=()=>o(n.error);let c=s.get(t);c.onsuccess=()=>{let[a,d]=ns(t,Xe(c.result),e);if(d!==0){i=d;return}s.put(a)}})}async wipe(){let t=this.db.transaction(Kt,"readwrite"),e=t.objectStore(Kt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}ot();class qr{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(St,"readwrite"),r=s.objectStore(St);return new Promise((o,i)=>{s.oncomplete=()=>o(),s.onerror=()=>i(s.error);for(let c of n){let a=xt(c);r.put({host:t,hash:a})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(St,"readwrite"),r=s.objectStore(St);return new Promise((o,i)=>{s.oncomplete=()=>o(),s.onerror=()=>i(s.error);for(let c of n){let a=xt(c);r.delete([t,a])}})}async list(t){let n=this.db.transaction(St,"readonly").objectStore(St);return new Promise((s,r)=>{let o=n.getAll();o.onsuccess=()=>{let c=o.result.filter((a)=>a.host===t).map((a)=>a.hash);s(c.map((a)=>tn(a)))},o.onerror=()=>r(o.error)})}async count(){let e=this.db.transaction(St,"readonly").objectStore(St);return new Promise((n,s)=>{let r=e.count();r.onsuccess=()=>n(r.result),r.onerror=()=>s(r.error)})}async wipe(){let t=this.db.transaction(St,"readwrite"),e=t.objectStore(St);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var Vt="accounts",mt="hosts",ht="host_seqs",St="uploadQueue",ft="downloadQueue",et="messages",je="apld",Or="rlm",Kt="realms";function za(t,e){return{realms:new jr(t),hosts:new Dr(t),uploads:new qr(t),downloads:new zr(t),messages:new Ar(t,e)}}function kl(){return{realms:{async list(){return[]},async get(){return},async put(){return 13},async wipe(){}},hosts:{async add(){},async get(){return},async del(){},async set(){return 13},async list(){return[]},async wipe(){},async touch(){},async recordSeqs(){}},uploads:{async enq(){},async deq(){},async list(){return[]},async count(){return 0},async wipe(){}},downloads:{async enq(){},async deq(){},async list(){return[]},async count(){return 0},async wipe(){}},messages:{async add(t){return t.map(()=>18)},async get(){return},async has(){return!1},async del(){},async list(){return[]},async count(){return 0},async listKeys(){return[]},async last(){return},async markApplied(){},async markFailed(){},async wipe(){}}}}class Vn{account;realms;hosts;uploads;downloads;messages;#t;#e;#s;constructor(t,e,n,s){this.account=t,this.#e=e,this.#s=n;let r=kl();if(this.realms=r.realms,this.hosts=r.hosts,this.uploads=r.uploads,this.downloads=r.downloads,this.messages=r.messages,s!==void 0)this.#r(s)}#r(t){let e=this.#t;if(this.#t=t,t.onversionchange=()=>{if(this.#t!==t)return;this.#n()},this.#o(za(t,this.#e)),e!==void 0&&e!==t)e.close()}#n(){let t=this.#t;if(this.#t=void 0,this.#o(kl()),t!==void 0)t.close()}#o(t){this.realms=t.realms,this.hosts=t.hosts,this.uploads=t.uploads,this.downloads=t.downloads,this.messages=t.messages}async bind(t){if(this.#s===void 0)return this.#t===void 0?13:0;let e=await this.#s(t);if(e===void 0)return 13;if(this.#t!==void 0&&this.#t.name===e)return 0;let n=await Yl(e);return this.#r(n),0}async prepareWorker(t){let e=await this.#s?.(t);if(e===void 0)return l(13);if(!(this.account instanceof fe))return l(10);let n=await this.account.ensureEnts(t);return m({data:e,ents:n})}close(){this.#n()}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function _r(t){await Qa();let e=await Ks(),n=new fe(e,t),s=new Vn(n,t,(o)=>n.dataName(o));if(n.setCloser(()=>s.close()),await n.dataName("")!==void 0)await s.bind("");return s}async function Qa(){if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((t)=>{setTimeout(()=>t(!1),2000)})])}catch{}}function Pl(t){return t!==null&&typeof t==="object"}function $r(t,e){let n=t[e];if(typeof n!=="string"||n==="")return;return n}function va(t,e){if(t===void 0)return e;if(e.acct===void 0)e.acct=t.acct;if(e.data===void 0)e.data=t.data;if(e.ents===void 0)e.ents=t.ents;return e}function to(t){if(!Pl(t)||typeof t.label!=="string")return;let e={label:t.label},n=$r(t,"acct"),s=$r(t,"data"),r=$r(t,"ents");if(n!==void 0)e.acct=n;if(s!==void 0)e.data=s;if(r!==void 0)e.ents=r;let o=Kl(t.keyTag),i=Sl(t.keyring);if(o!==void 0)e.keyTag=o;if(i!==void 0)e.keyring=i;return e}function Da(t){let e=[];for(let n of t){let s=n.keyring;if(s===void 0)continue;for(let r of s.entries){if(r.credId.byteLength===0)continue;let o=!1;for(let i of e){if(!E(i.credId,r.credId))continue;if(i.label!==n.label)return l(10);o=!0;break}if(o)continue;e.push({label:n.label,salt:s.salt,sealedMaster:r.sealedMaster,credId:r.credId})}}return m(e)}function Oa(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){let s=to(n);if(s!==void 0)e.push(s)}return e}function Aa(t,e,n,s){let r={label:e.label};if(e.acct!==void 0)r.acct=e.acct;if(e.data!==void 0)r.data=e.data;if(e.ents!==void 0)r.ents=e.ents;if(n!==void 0)r.keyTag=n;if(s!==void 0)r.keyring=s;t.put(r)}class fe{db;#t;#e;constructor(t,e){this.db=t,this.#t=e}setCloser(t){this.#e=t}async create(t,e){let[n,s]=Xt(t);if(s!==0||n===void 0)return e.fill(0),l(10);if((await this.#n(n))?.keyTag!==void 0)return e.fill(0),l(19);if(e.byteLength<Ss)return e.fill(0),l(10);let[o,i]=await ut.fromRandom(e);if(i!==0)return l(i);return this.save(o,{label:n})}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return l(10);let r=await this.#s(t,n);if(r!==0)return l(r);return m(t)}async dataName(t){let e=await this.#n(t);if(e===void 0)return;if(e.data!==void 0&&e.data!=="")return e.data;return await this.#i(t,(s)=>{if(s===void 0)return;return{...s}}),(await this.#n(t))?.data}async ensureEnts(t){let[e,n]=Xt(t);if(n!==0||e===void 0)throw Error("[DIPLOMATIC] invalid account label");let s=await this.#n(e),r=Er(s?.acct,s?.data),o=Rl(r.acct,s?.ents);return await this.#i(e,(i)=>({...i===void 0?{label:e}:{...i},acct:r.acct,data:r.data,ents:o})),o}async wipe(){let t=await this.#o();this.#e?.();for(let s of t){if(s.data!==void 0)await Fr(s.data);if(s.ents!==void 0)await Fr(s.ents)}let e=this.db.transaction(Vt,"readwrite"),n=e.objectStore(Vt);return new Promise((s,r)=>{e.oncomplete=()=>s(),e.onerror=()=>r(e.error),n.clear()})}async loadKeyring(t){let[e,n]=await this.#r(t);if(n!==0||e===void 0)return;return(await this.#n(e))?.keyring}async persistKeyring(t,e){let n;if(t!==void 0){let[o,i]=fn(t);if(i!==0)return i;n=o}let[s,r]=await this.#r(e);if(r!==0)return r;if(s===void 0)return 13;return await this.#i(s,(o)=>{if(n===void 0){if(o?.keyTag===void 0)return;return{label:s,keyTag:o.keyTag}}let i={label:s,keyring:n};if(o?.keyTag!==void 0)i.keyTag=o.keyTag;return i}),0}async hasKeyring(t){let e=await this.loadKeyring(t);return e!==void 0&&e.entries.length>0}async unlock(t){let[e,n]=Da(await this.#o());if(n!==0)return l(n);if(e===void 0||e.length===0)return l(22);let s=e[0];if(s===void 0)return l(22);let[r,o]=await ut.unsealWithPasskey(e.map((y)=>({sealedMaster:y.sealedMaster,credId:y.credId,salt:y.salt})),{rpId:t.rpId,rpName:t.rpName,salt:s.salt});if(o!==0)return l(o);if(r===void 0)return l(20);let i=e.find((y)=>E(y.credId,r.credId));if(i===void 0)return l(13);let c=await this.#n(i.label),a=c?.keyTag;if(a!==void 0){if(!await gn(r.enclave,a))return l(19)}let d=c?.keyring;if(d===void 0)return l(13);let[u,p]=Br(d,r.credId);if(p!==0)return l(p);if(u!==void 0)await this.#i(i.label,(y)=>{let b={label:i.label,keyring:u};if(y?.keyTag!==void 0)b.keyTag=y.keyTag;return b});return m({enclave:r.enclave,label:i.label})}async openPrfStore(t,e){let[n,s]=await this.#r(e),r=s===0?await this.loadKeyring(n):void 0,o=s===0?n:void 0;return In.open({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:r,persistKeyring:(i)=>this.persistKeyring(i,o),unlockAccount:async()=>{let[i,c]=await this.unlock(t);if(c!==0)return l(c);if(i===void 0)return l(13);return o=i.label,m({enclave:i.enclave,keyring:await this.loadKeyring(i.label)})}})}async#s(t,e){let n=await this.#n(e);if(n?.keyTag!==void 0){if(!await gn(t,n.keyTag))return 19;return 0}let[s,r]=await gs(this.#t,t);if(r!==0)return r;let o=Vs(s),i=!1;if(await this.#i(e,(c)=>{if(c?.keyTag!==void 0)return i=!0,c;let a={label:e,keyTag:o};if(c?.keyring!==void 0)a.keyring=c.keyring;return a}),!i)return 0;return this.#s(t,e)}async#r(t){if(t!==void 0){let[s,r]=Xt(t);if(r!==0||s===void 0)return l(10);return m(s)}let e=await this.#o(),n=e.length===1?e[0]:void 0;if(n!==void 0)return m(n.label);if(e.length===0)return l(13);return l(10)}#n(t){let n=this.db.transaction(Vt,"readonly").objectStore(Vt);return new Promise((s,r)=>{let o=n.get(t);o.onsuccess=()=>s(to(o.result)),o.onerror=()=>r(o.error)})}#o(){let e=this.db.transaction(Vt,"readonly").objectStore(Vt);return new Promise((n,s)=>{let r=e.getAll();r.onsuccess=()=>n(Oa(r.result)),r.onerror=()=>s(r.error)})}async#i(t,e){let n=this.db.transaction(Vt,"readwrite"),s=n.objectStore(Vt);return new Promise((r,o)=>{n.oncomplete=()=>r(),n.onerror=()=>o(n.error);let i=s.get(t);i.onsuccess=()=>{let c=Pl(i.result)?i.result:void 0,a=to(i.result),d=e(a);if(d===void 0){if(a!==void 0)s.delete(t);return}let u=va(a,d===a?{...d}:d),p=Er(u.acct,u.data);if(u.acct=p.acct,u.data=p.data,d===a&&a?.acct===u.acct&&a?.data===u.data&&a?.ents===u.ents)return;let y=void 0;if(u.keyTag!==void 0)y=u.keyTag===a?.keyTag&&c?.keyTag!==void 0?c.keyTag:u.keyTag;let b=void 0;if(u.keyring!==void 0)b=u.keyring===a?.keyring&&c?.keyring!==void 0?c.keyring:u.keyring;Aa(s,u,y,b)}})}}async function Ll(t){let e=await Ks();try{return await new fe(e,re).ensureEnts(t)}finally{e.close()}}W();C();ot();var it="entities",Ws="entity_type_created_at",no="entity_type_updated_at",so="entity_type_parent_id",ro="entity_tags",wl="entity_rlm",Ml=15;function ja(t){return"typ"in t}function qa(t){let e=Ze(t.rlm),n={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:L(t.eid),pid:t.pid?L(t.pid):void 0,...e!==void 0?{rlm:e}:{},tgs:t.tags,typ:t.type,upd:t.updatedAt};if(n.pid===void 0)delete n.pid;if(n.tgs===void 0)delete n.tgs;if(n.ctr===void 0)delete n.ctr;return n}function _a(t){if(!q(t))return{eid:L(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return qa(t)}function qe(t){let e=Ze(t.rlm);return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:bt(t.eid),pid:t.pid?bt(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{},...e!==void 0?{rlm:e}:{}}}function eo(t){if(ja(t))return qe(t);return{eid:bt(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function $a(t,e){if(e instanceof Date)return IDBKeyRange.only([t,e]);let n=e.range;return IDBKeyRange.bound([t,n.start],[t,n.end],n.excludeStart===!0,n.excludeEnd===!0)}function td(t){if(typeof t==="string")return IDBKeyRange.only(t);if("range"in t){let e=t.range;return IDBKeyRange.bound(e.start,e.end,e.excludeStart===!0,e.excludeEnd===!0)}return IDBKeyRange.bound(t.prefix,t.prefix+"￿")}function ed(t,e,n){let s=[];if(typeof n==="string"){for(let i of t)if(i.typ===e)s.push(qe(i));return s}let r=new Set,o="prefix"in n?n.prefix:void 0;for(let i of t){if(i.typ!==e)continue;if(r.has(i.eid))continue;if(o!==void 0){let c=i.tgs;if(!c||!c.some((a)=>a.startsWith(o)))continue}r.add(i.eid),s.push(qe(i))}return s}class oo{name;db;opening;constructor(t){this.name=t}async init(){await this.ensureDb()}close(){let t=this.db;if(this.db=void 0,this.opening=void 0,t!==void 0)t.close()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=sd(this.name).then((t)=>(t.onversionchange=()=>{if(t.close(),this.db===t)this.db=void 0},this.db=t,this.opening=void 0,t),(t)=>{throw this.opening=void 0,t}),this.opening}apply=async(t)=>{let e=new Set,n=[],s=performance.now();F("idb apply start",{ops:t.length});let r;try{r=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let o=r.transaction(it,"readwrite"),i=o.objectStore(it);return new Promise((c)=>{let a=Array(t.length).fill(0);if(t.length<1){c({stats:[],types:e,eids:n});return}o.oncomplete=()=>{F("idb apply complete",{ops:t.length,ms:Math.round(performance.now()-s)}),c({stats:a,types:e,eids:n})},o.onerror=()=>{for(let u=0;u<a.length;u++)if(a[u]===void 0)a[u]=18;c({stats:a,types:e,eids:n})};let d=new Map;for(let u=0;u<t.length;u++){let p=t[u],y=L(p.eid),b={op:p,index:u},h=d.get(y);if(h)h.push(b);else d.set(y,[b])}for(let[u,p]of d){if(p.length<1)continue;let y=i.get(u);y.onsuccess=()=>{let b=y.result,h=b?eo(b):void 0,Z=!1;for(let{op:X,index:G}of p){let[S,K]=Je(h,X);if(K!==0){a[G]=K;continue}if(S===void 0){a[G]=12;continue}Z=!0;for(let V of Be(h,S))e.add(V);h=S}if(Z)n.push(p[0].op.eid);if(h){let X=i.put(_a(h));X.onerror=(G)=>{G.preventDefault();for(let{index:S}of p)a[S]=18}}},y.onerror=()=>{for(let{index:b}of p)a[b]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(it,"readwrite"),n=e.objectStore(it);return new Promise((s)=>{e.oncomplete=()=>s(0),e.onerror=()=>s(18),n.clear()})}async getRow(t){let e;try{e=await this.ensureDb()}catch{return l(16)}let n=L(t),r=e.transaction(it,"readonly").objectStore(it);return new Promise((o)=>{let i=r.get(n);i.onsuccess=()=>{let c=i.result;if(!c)o(m(void 0));else o(m(eo(c)))},i.onerror=()=>o(l(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return l(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=yn(e);if(s!==0)return l(s);if(!n)return m([]);let r;try{r=await this.ensureDb()}catch{return l(16)}let i=r.transaction(it,"readonly").objectStore(it).index(no),c=$a(t,e);return new Promise((a)=>{let d=i.getAll(c);d.onsuccess=()=>{let u=d.result;a(m(u.map(qe)))},d.onerror=()=>a(l(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return l(16)}let s=e.transaction(it,"readonly").objectStore(it).index(Ws);return new Promise((r)=>{let o=s.getAll(IDBKeyRange.bound([t],[t,[]]));o.onsuccess=()=>{let i=o.result;r(m(i.map(qe)))},o.onerror=()=>r(l(18))})}async getByTag(t,e){let[n,s]=bn(e);if(s!==0)return l(s);if(!n)return m([]);let r;try{r=await this.ensureDb()}catch{return l(16)}let o=td(e),c=r.transaction(it,"readonly").objectStore(it).index(ro);return new Promise((a)=>{let d=c.getAll(o);d.onsuccess=()=>{let u=d.result;a(m(ed(u,t,e)))},d.onerror=()=>a(l(18))})}async getAllEntities(t){if("pid"in t){let e;try{e=await this.ensureDb()}catch{return l(16)}let n=L(t.pid),r=e.transaction(it,"readonly").objectStore(it).index(so);return new Promise((o)=>{let i=r.getAll(IDBKeyRange.only([t.type,n]));i.onsuccess=()=>{let a=i.result.map(qe);o(m(a))},i.onerror=()=>o(l(18))})}else if("tag"in t)return await this.getByTag(t.type,t.tag);else if("updatedAt"in t)return await this.getByUpdatedAt(t.type,t.updatedAt);return await this.getAllOfType(t.type)}async getEntities(t){let e=performance.now(),[n,s]=await this.getAllEntities(t);if(F("idb getEntities",{type:t.type,n:n?.length??0,ms:Math.round(performance.now()-e)}),s!==0)return l(s);return m(n)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return l(16)}let s=e.transaction(it,"readonly").objectStore(it).index(Ws);return new Promise((r)=>{let o=IDBKeyRange.bound([t],[t,[]]),i=s.count(o);i.onsuccess=()=>r(m(i.result)),i.onerror=()=>r(l(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return l(16)}let s=e.transaction(it,"readonly").objectStore(it),r=[];return new Promise((o)=>{let i=s.openCursor();i.onsuccess=()=>{let c=i.result;if(c){let a=c.value;r.push(hn(eo(a))),c.continue()}else mn(r,t).then(o)},i.onerror=()=>o(l(18))})}}function nd(t,e){if(!t.objectStoreNames.contains(it))t.createObjectStore(it,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(it);if(!n.indexNames.contains(Ws))n.createIndex(Ws,["typ","crd"],{unique:!1});if(!n.indexNames.contains(no))n.createIndex(no,["typ","upd"],{unique:!1});if(!n.indexNames.contains(so))n.createIndex(so,["typ","pid"],{unique:!1});if(!n.indexNames.contains(ro))n.createIndex(ro,"tgs",{unique:!1,multiEntry:!0});if(!n.indexNames.contains(wl))n.createIndex(wl,"rlm",{unique:!1})}function sd(t){return new Promise((e,n)=>{let s=indexedDB.open(t,Ml);s.onupgradeneeded=()=>{let{result:r,transaction:o}=s;if(!o){n(Error("Transaction is null during EntDB upgrade"));return}try{nd(r,o)}catch(i){n(i instanceof Error?i:Error(String(i)))}},s.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${t} → v${Ml}); waiting for other connections to close`)},s.onsuccess=()=>e(s.result),s.onerror=()=>n(s.error??Error("EntDB IndexedDB open failed"))})}async function Ul(t){let e=new oo(t);return await e.init(),e}ot();W();C();class xs{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeTag=new Map;constructor(t=[],e){this.useIndex=e?.indexes!==!1;for(let n of t)this.put(n)}put(t){let e=q(t)?Ee(t):t,n=L(e.eid),s=this.ents.get(n);if(s!==void 0&&q(s))this.unindex(n,s);if(this.ents.set(n,e),q(e))this.index(n,e)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(q(e))this.unindex(t,e);this.ents.delete(t)}index(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(!n)n=new Map,this.byType.set(e.type,n);if(n.set(t,e),e.pid){let s=L(e.pid),r=this.byTypePid.get(e.type);if(!r)r=new Map,this.byTypePid.set(e.type,r);let o=r.get(s);if(!o)o=new Map,r.set(s,o);o.set(t,e)}if(e.tags){let s=this.byTypeTag.get(e.type);if(!s)s=new Map,this.byTypeTag.set(e.type,s);for(let r of e.tags){let o=s.get(r);if(!o)o=new Map,s.set(r,o);o.set(t,e)}}}unindex(t,e){if(!this.useIndex)return;let n=this.byType.get(e.type);if(n){if(n.delete(t),n.size===0)this.byType.delete(e.type)}if(e.pid){let s=L(e.pid),r=this.byTypePid.get(e.type),o=r?.get(s);if(o){if(o.delete(t),o.size===0)r?.delete(s)}if(r&&r.size===0)this.byTypePid.delete(e.type)}if(e.tags){let s=this.byTypeTag.get(e.type);if(s){for(let r of e.tags){let o=s.get(r);if(o){if(o.delete(t),o.size===0)s.delete(r)}}if(s.size===0)this.byTypeTag.delete(e.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeTag.clear()}bucketList(t){if(!t||t.size===0)return[];let e=[];for(let n of t.values())e.push(n);return e}byTagSpec(t,e){let[n,s]=bn(e);if(s!==0)return l(s);if(!n)return m([]);if(typeof e==="string")return m(this.bucketList(this.byTypeTag.get(t)?.get(e)));let r=this.byTypeTag.get(t);if(!r)return m([]);let o=new Set,i=[];for(let[c,a]of r){if(!br(c,e))continue;for(let[d,u]of a){if(o.has(d))continue;o.add(d),i.push(u)}}return m(i)}byDateSpec(t,e){let[n,s]=yn(e);if(s!==0)return l(s);if(!n)return m([]);let r=[],o=this.byType.get(t);if(o){for(let i of o.values())if(yr(i.updatedAt,e))r.push(i)}return m(r)}async apply(t){let e=new Set,n=[],s=[];for(let r of t){let o=L(r.eid),i=this.ents.get(o),[c,a]=Je(i,r);if(a!==0){s.push(a);continue}if(c===void 0){s.push(12);continue}for(let d of Be(i,c))e.add(d);this.put(c),n.push(r.eid),s.push(0)}return{stats:s,types:e,eids:n}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(t){let e=L(t),n=this.ents.get(e);return m(n)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return l(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=L(t.pid);return m(this.bucketList(this.byTypePid.get(e)?.get(s)))}if("tag"in t)return this.byTagSpec(e,t.tag);if("updatedAt"in t)return this.byDateSpec(e,t.updatedAt);return m(this.bucketList(this.byType.get(e)))}let n=[];if("pid"in t){for(let s of this.ents.values())if(q(s)&&s.type===e&&s.pid&&E(s.pid,t.pid))n.push(s)}else if("tag"in t){let s=t.tag,[r,o]=bn(s);if(o!==0)return l(o);if(!r)return m(n);for(let i of this.ents.values())if(q(i)&&i.type===e&&i.tags&&i.tags.some((c)=>br(c,s)))n.push(i)}else if("updatedAt"in t){let s=t.updatedAt,[r,o]=yn(s);if(o!==0)return l(o);if(!r)return m(n);for(let i of this.ents.values())if(q(i)&&i.type===e&&yr(i.updatedAt,s))n.push(i)}else for(let s of this.ents.values())if(q(s)&&s.type===e)n.push(s);return m(n)}async getEntities(t){let[e,n]=await this.getAllEntities(t);if(n!==0)return l(n);return m(e)}async countEntities({type:t}){if(this.useIndex)return m(this.byType.get(t)?.size??0);let e=0;for(let n of this.ents.values())if(q(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(hn(n));return mn(e,t)}}function rd(t){let e=globalThis.requestAnimationFrame;if(typeof e!=="function"){queueMicrotask(t);return}e(()=>{e(t)})}async function lo(t){if(t?.verbose!==void 0)_n(t.verbose);let e=t?.name??await Ll(t?.label??""),n=await Ul(e);if(t?.cache===!1)return n;return new co(n,void 0,{indexes:t?.indexes,optimistic:t?.optimistic})}class co{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();optimistic;inflight=0;warmP=new Map;constructor(t,e,n){if(this.durable=t,this.optimistic=n?.optimistic!==!1,F("CachedEntDB open",{optimistic:this.optimistic}),this.mem=new xs(e??[],{indexes:n?.indexes}),e)for(let s of e)this.warmed.add(s.type)}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}emit(t){if(t.size<1)return;let e=performance.now();F("emit start",{types:[...t],listeners:this.listeners.size});for(let n of this.listeners)n(t);F("emit done",{ms:Math.round(performance.now()-e)})}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){let e,n;if(this.optimistic){n=dd(this.mem,t).types,e=new Map;for(let r of t){let o=L(r.eid);e.set(o,Jl(this.mem.ents.get(o)))}this.inflight+=1,F("apply mem patched",{ops:t.length,types:n?[...n]:[],inflight:this.inflight})}let s=this.run(async()=>{F("persist start",{ops:t.length});try{let r=performance.now(),o=await this.durable.apply(t);if(F("persist durable.apply done",{ms:Math.round(performance.now()-r)}),!this.optimistic){let{changed:c,status:a}=await this.pullEids(t.map((d)=>d.eid));if(this.emit(c),a!==0)return{stats:t.map(()=>a),types:o.types,eids:o.eids};return o}let i=[];for(let c=0;c<t.length;c++)if(o.stats[c]!==0)i.push(t[c].eid);if(i.length>0){F("persist pull rejected eids",{n:i.length});let{changed:c,status:a}=await this.pullEids(i,e);if(this.emit(c),a!==0)return{stats:t.map(()=>a),types:o.types,eids:o.eids}}return F("persist done"),o}finally{if(this.optimistic)this.inflight-=1}});if(n)rd(()=>{F("emit after paint"),this.emit(n)});return s}clear(){return this.run(async()=>{let t=await this.durable.clear();if(t!==0)return t;let e=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(t){let e=[...t].length;return F("ingest queued",{eids:e}),this.run(async()=>{let n=performance.now();F("ingest start",{eids:e});let{changed:s,status:r}=await this.pullEids(t);return F("ingest done",{ms:Math.round(performance.now()-n),changed:[...s]}),this.emit(s),r})}async pullEids(t,e){let n=new Set,s=new Set;for(let r of t){let o=L(r);if(s.has(o))continue;s.add(o);let[i,c]=await this.durable.getRow(r);if(c!==0)return{changed:n,status:c};let a=this.mem.ents.get(o);if(a!==void 0&&i!==void 0&&io(a,i))continue;if(e){if(!ad(Jl(a),e.get(o)))continue}if(i){if(this.mem.put(i),!a||!od(a,i)){if(q(i))n.add(i.type);if(a!==void 0&&q(a))n.add(a.type)}}else if(a!==void 0){if(this.mem.del(o),q(a))n.add(a.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let e=performance.now();F("warmType start",{type:t});let[n,s]=await this.durable.getEntities({type:t});if(s!==0)return s;if(n)for(let r of n){let o=L(r.eid),i=this.mem.ents.get(o);if(!i||io(r,i))this.mem.put(r)}return this.warmed.add(t),F("warmType done",{type:t,n:n?.length??0,ms:Math.round(performance.now()-e)}),0}beginWarm(t){if(this.warmed.has(t))return Promise.resolve(0);let e=this.warmP.get(t);if(e)return e;let n=this.warmType(t).finally(()=>{this.warmP.delete(t)});return this.warmP.set(t,n),n}ensureWarm(t){if(this.warmed.has(t))return;this.beginWarm(t).then((e)=>{if(e===0)this.emit(new Set([t]))})}async getRow(t){let e=L(t);if(this.mem.ents.has(e))return this.mem.getRow(t);let[n,s]=await this.durable.getRow(t);if(s!==0)return l(s);if(n){let r=this.mem.ents.get(e);if(!r||io(n,r))this.mem.put(n)}return this.mem.getRow(t)}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return l(n);if(e===void 0||!q(e))return m(void 0);return m(e)}async getEntities(t){if(this.warmed.has(t.type))return F("getEntities mem",{type:t.type}),this.mem.getEntities(t);if(this.inflight>0)return F("getEntities inflight-mem",{type:t.type}),this.ensureWarm(t.type),this.mem.getEntities(t);F("getEntities beginWarm",{type:t.type});let e=await this.beginWarm(t.type);if(e!==0)return l(e);return F("getEntities afterWarm",{type:t.type}),this.mem.getEntities(t)}async countEntities({type:t}){if(this.warmed.has(t))return this.mem.countEntities({type:t});if(this.inflight>0)return this.ensureWarm(t),this.mem.countEntities({type:t});let e=await this.beginWarm(t);if(e!==0)return l(e);return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function od(t,e){if(q(t)!==q(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!E(t.eid,e.eid))return!1;if(!q(t)||!q(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(!ld(t.pid,e.pid))return!1;if(!id(t.tags,e.tags))return!1;return cd(t.body,e.body)}function id(t,e){if(t===e)return!0;if(t===void 0||e===void 0)return!1;if(t.length!==e.length)return!1;for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function ld(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return E(t,e)}function cd(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return E(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();return Di(t,e)}function io(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Jl(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function ad(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function dd(t,e){let n=new Set,s=[];for(let r of e){let o=L(r.eid),i=t.ents.get(o),[c,a]=Je(i,r);if(a!==0){s.push(a);continue}if(c===void 0){s.push(12);continue}for(let d of Be(i,c))n.add(d);t.put(c),s.push(0)}return{stats:s,types:n}}import{useEffect as Rs,useState as ao}from"react";W();C();Mr();function Bl(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function Fl(t){if(typeof t!=="number")return;return t}function ud(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=md(t.phase);if(e===void 0)return;let n={phase:e};if("host"in t&&typeof t.host==="string")n.host=t.host;if("done"in t&&typeof t.done==="number")n.done=t.done;if("total"in t&&typeof t.total==="number")n.total=t.total;if("bytesDone"in t&&typeof t.bytesDone==="number")n.bytesDone=t.bytesDone;if("bytesTotal"in t&&typeof t.bytesTotal==="number")n.bytesTotal=t.bytesTotal;return n}function md(t){if(t==="peek"||t==="pull"||t==="open"||t==="exec"||t==="push"||t==="import"||t==="idle")return t;return}function Nl(t){if(!t||typeof t!=="object")return;if(!("numUploads"in t)||!("numDownloads"in t))return;if(typeof t.numUploads!=="number"||typeof t.numDownloads!=="number")return;let e={phase:"idle"};if("progress"in t){let n=ud(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var Wt="[DIPLOMATIC]";class Wn{worker;state;store;local;insertBlob;updateBlob;deleteBlob;readBlob;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:he};clientState;xferState;constructor(t,e,n,s,r){this.state=t,this.store=e,this.readyTimeoutMs=r,this.clientState=new Ct(async()=>this.cachedClientState),this.xferState=new Ct(async()=>this.cachedXferState),this.scheduledSync=new Zn(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(o){console.error(`${Wt} worker sync after local write failed`,o)}}),this.local=new Qe(n,t,e,()=>{throw Error(`${Wt} local writer has no transport (use worker for network)`)},re,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.insertBlob=this.local.insertBlob.bind(this.local),this.updateBlob=this.local.updateBlob.bind(this.local),this.deleteBlob=this.local.deleteBlob.bind(this.local),this.readBlob=this.local.readBlob.bind(this.local),this.local.xferState.listen((o)=>{this.cachedXferState={numUploads:o.numUploads,numDownloads:o.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(t){let e=this.worker;if(e){e.onmessage=null,e.onerror=null,e.onmessageerror=null;try{e.terminate()}catch{}}this.worker=t,t.onmessage=(n)=>{this.onMessage(n.data)},t.onerror=(n)=>{console.error(`${Wt} worker error`,n),this.failPending(Error(`${Wt} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${Wt} worker message error`))}}failPending(t){for(let[,e]of this.pending)e.reject(t);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(t,e,n={}){let s=n.clock??new jt,r=n.syncDebounceMs??qn,o=n.readyTimeoutMs??15000,i=new Wn(t,e,s,r,o);return await i.hydrateStateFromStore(e),i}async hydrateStateFromStore(t){await this.loadSession(!1);let e=await t.uploads.count(),n=await t.downloads.count();this.cachedXferState={numUploads:e,numDownloads:n,progress:he}}async loadSession(t){let e=this.local.selected()?.enclave,n=await this.store.hosts.list();this.cachedClientState={hasSeed:e!==void 0,hasHost:Array.from(n).length>0,connected:t}}async pullRemoteXfer(){let t=await this.request({id:this.allocId(),op:"getXferState"}),e=Nl(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${Wt} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${Wt} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${Wt} worker terminated`))}onMessage(t){if(!Bl(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${Wt} worker init failed: ${e.message}`));return}case"clientState":{if(this.cachedClientState.connected===e.connected)return;this.cachedClientState={...this.cachedClientState,connected:e.connected},this.clientState.emit();return}case"xferState":{this.cachedXferState=e.state,this.xferState.emit();return}case"dirty":{F("worker dirty",{eids:e.eids.length}),this.state.refresh(e.eids.map(yd));return}case"wiped":{this.state.clear();return}case"reply":{let n=this.pending.get(e.id);if(!n)return;if(this.pending.delete(e.id),e.ok)n.resolve(e.result);else n.reject(new Kn(e.status));return}default:return}}allocId(){let t=this.nextId;return this.nextId+=1,t}request(t,e){let n=this.requireWorker();return new Promise((s,r)=>{if(this.pending.set(t.id,{resolve:s,reject:r}),e&&e.length>0)n.postMessage(t,e);else n.postMessage(t)})}async requestStatus(t,e){try{let n=await this.request(t,e),s=Fl(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof Kn)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){let n=await this.local.setSeed(t,e);if(n!==0)return n;await this.loadSession(!1),this.clientState.emit();let s=this.local.selected()?.label??"",r;if(this.store instanceof Vn){let[c,a]=await this.store.prepareWorker(s);if(a!==0)return a;r=c}let o=this.allocId(),i=this.readyTimeoutMs;await new Promise((c,a)=>{let d=void 0,u=(p)=>{if(d!==void 0)clearTimeout(d);p()};this.pending.set(o,{resolve:(p)=>u(()=>c(p)),reject:(p)=>u(()=>a(p))}),d=setTimeout(()=>{this.pending.delete(o),a(Error(`${Wt} setSeed worker timeout after ${i}ms`))},i);try{let p=t.spawnSyncWorker({id:o,persist:e?.persist});if(this.bindWorker(p),r!==void 0)Zs(p,{id:0,op:"bind",label:s,data:r.data,ents:r.ents})}catch(p){if(this.pending.delete(o),d!==void 0)clearTimeout(d);a(p instanceof Error?p:Error(String(p)))}});try{await this.pullRemoteXfer()}catch{}return 0}async link(t,e=!0){await this.local.link(t,!1),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(t),connect:e})}async unlink(t){if(await this.local.unlink(t),await this.loadSession(this.cachedClientState.connected),this.clientState.emit(),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:t})}async hosts(){return this.local.hosts()}async connect(t=!0,e=!0){if(!this.worker)return;await this.request({id:this.allocId(),op:"connect",listen:t,sync:e})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(t,e){return this.local.insertRaw(t,e)}async updateRaw(t,e,n,s){return this.local.updateRaw(t,e,n,s)}async insert(t){return this.local.insert(t)}async update(t){return this.local.update(t)}async delete(t){return this.local.delete(t)}async genEID(t){return this.local.genEID(t)}async sync(){if(!this.worker)return 0;return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(t){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:t?.checkHost})}async listMsgs(t){return this.local.listMsgs(t)}async countMsgs(t){return this.local.countMsgs(t)}async reconcile(t,e){try{let n=await this.request({id:this.allocId(),op:"reconcile",hostLabel:t,pull:e?.pull,push:e?.push,sync:e?.sync});if(!pd(n))return l(12);return m(n)}catch(n){if(n instanceof Kn&&n.status!==0)return l(n.status);return l(12)}}async msgcheck(){let t=await this.request({id:this.allocId(),op:"msgcheck"});if(!(t instanceof Uint8Array))throw Error(`${Wt} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${Wt} entcheck: expected Uint8Array`);return t}async wipe(t){let e=()=>this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});if(t?.seed===!0&&this.worker)await e();if(await this.local.wipe(t),t?.seed!==!0&&this.worker)await e();await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(t){let e=new Uint8Array(await t.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:e},[e.buffer])}async export(t,e){try{let n=await this.request({id:this.allocId(),op:"export"});if(!(n instanceof Uint8Array))return 12;let s=new Blob([n.slice()]);return ts(s,t),0}catch(n){if(n instanceof Kn)return n.status;return 12}}}class Kn extends Error{status;constructor(t){super(`WorkerReplyError: ${g[t]}`);this.status=t;this.name="WorkerReplyError"}}function pd(t){if(!t||typeof t!=="object")return!1;let e=t;return e.msgcheck instanceof Uint8Array&&e.msgcheck.length===32&&typeof e.numBags==="number"&&typeof e.numDupes==="number"}function yd(t){return t}var _e="[DIPLOMATIC]";async function Hs(t){if(t.verbose!==void 0)_n(t.verbose);let e=t.clock??new jt;if(t.worker===!0&&bd(t)!==void 0)throw Error(`${_e} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${_e} sync on main thread `+"(no worker — app did not request a worker)");let r=await El(t.store);return hd(e,t.state,r)}if(typeof Worker>"u")throw Error(`${_e} worker: true but Worker API is unavailable`);let n=await El(void 0),s=await Wn.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${_e} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${_e} terminating sync worker`),s.terminate()}}}function bd(t){if("store"in t)return t.store;return}async function hd(t,e,n){let s=new Qe(t,e,n,ir,re);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function El(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${_e} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return _r(re)}W();function Zd(t){let[e,n]=ao();return Rs(()=>{async function s(){let o=await t.clientState.get();n(o)}let r=t.clientState.listen(s);return s(),()=>{r()}},[t]),e}function Xd(t){let[e,n]=ao();return Rs(()=>{async function s(){let o=await t.xferState.get();n(o)}let r=t.xferState.listen(s);return s(),()=>{r()}},[t]),e}function Gd(t){Rs(()=>{async function e(){try{if(!(await t.clientState.get()).hasSeed)return;await t.connect(),await t.sync()}catch(o){console.error("reconnectAndSync failed",o)}}function n(){e()}function s(){if(typeof document<"u"&&document.visibilityState==="visible")e()}function r(){e()}if(globalThis.addEventListener("online",n),typeof document<"u")document.addEventListener("visibilitychange",s);return globalThis.addEventListener("focus",r),globalThis.addEventListener("pageshow",r),()=>{if(globalThis.removeEventListener("online",n),typeof document<"u")document.removeEventListener("visibilitychange",s);globalThis.removeEventListener("focus",r),globalThis.removeEventListener("pageshow",r)}},[t])}function fd(t={}){let e=t.clock??new jt,{seed:n,host:s,readyTimeoutMs:r,optimistic:o,verbose:i}=t,c=t.worker===!0,a="store"in t?t.store:void 0,[d,u]=ao({stateMgr:pr});return Rs(()=>{let p=!1,y;return(async()=>{let b=await lo({optimistic:o,verbose:i});if(p)return;let h=An(b),Z=c?await Hs({state:h,clock:e,worker:!0,readyTimeoutMs:r,verbose:i}):await Hs({state:h,clock:e,store:a,readyTimeoutMs:r,verbose:i});if(p){Z.dispose();return}y=Z.dispose;let{client:X,mode:G}=Z;if(n){let S=await X.setSeed(n);if(S!==0){y(),u({stateMgr:h,error:Error(`setSeed ${g[S]}`)});return}}if(s)await X.link(s);if(p){y();return}u({client:X,entDB:b,stateMgr:h,mode:G,error:void 0})})().catch((b)=>{let h=b instanceof Error?b:Error(String(b));if(console.error("[DIPLOMATIC] useClient init failed",h),!p)u((Z)=>({...Z,client:void 0,error:h}))}),()=>{p=!0,y?.()}},[e,n,s,c,a,r,o,i]),d}import{use as Sd,useEffect as zl,useRef as Id,useState as gd}from"react";function Ql(t,e,n){let[s,r]=gd();return zl(()=>{async function o(){let i=performance.now();F(`watcher ${e} start`);let c=await n();F(`watcher ${e} setVal`,{ms:Math.round(performance.now()-i)}),r(c)}return o(),t.on(e,o),()=>{t.off(e,o)}},[t,e,n]),s}function Vd(t,e,n){let s=Id(n());return zl(()=>{async function r(){s.current=n()}return t.on(e,r),()=>{t.off(e,r)}},[t,e,n]),Sd(s.current)}ot();tt();W();Ue();Oe();ct();W();class uo{queue=new Map;async enq(t){for(let e of t){let n=Pe(e.host,e.seq,e.realm);this.queue.set(n,e)}}async deq(t,e,n){for(let s of e)this.queue.delete(Pe(t,s,n))}async list(){let t=[];for(let e of this.queue.values())t.push(e);return t}async count(){return this.queue.size}async wipe(){this.queue.clear()}}W();ct();class mo{hosts=new Map;#t=new Map;async add(t){let e=this.hosts.get(t.label);if(e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0)){this.hosts.set(t.label,{...t,lastSeq:0,clockOffset:e.clockOffset,subscription:e.subscription});return}this.#t.delete(t.label),this.hosts.set(t.label,{...t,lastSeq:0})}async touch(t,e,n){await this.recordSeqs(t,{lastSeq:e},n)}async recordSeqs(t,e,n){if(!this.hosts.has(t))return;let s=n??B,r=_t(s),o=this.#t.get(t),i=o?.get(r)?.lastSeq??0,c=Qn(i,e);if(c===void 0)return;let a=o??new Map;if(o===void 0)this.#t.set(t,a);a.set(r,{label:s.label,index:s.index,lastSeq:c})}async get(t){let e=this.hosts.get(t);if(e===void 0)return;return this.#e(e),e}async set(t,e){let n=this.hosts.get(t);if(!n)return 13;return this.hosts.set(t,{...n,...e}),0}async del(t){this.hosts.delete(t),this.#t.delete(t)}async list(){let t=[];for(let e of this.hosts.values())this.#e(e),t.push(e);return t}async wipe(){this.hosts.clear(),this.#t.clear()}#e(t){let e=this.#t.get(t.label),n=[];if(e!==void 0)for(let r of e.values())n.push(r);let s=vn(n);if(t.lastSeq=s.lastSeq,s.seqs!==void 0)t.seqs=s.seqs;else delete t.seqs}}ot();W();class po{crypto;messages=new Map;constructor(t){this.crypto=t}async add(t){let e=[];for(let{key:n,data:s}of t)this.messages.set(L(n),Ee(s)),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(L(e))}async get(t){let e=this.messages.get(L(t));if(e)return await se(t,e,this.crypto);return}async has(t){return this.messages.has(L(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[r,o]of this.messages){if(e!==void 0&&ze(o.apld)!==e)continue;let i=bt(r);s.push(await se(i,o,this.crypto,{body:n}))}return s}async count(t){if(t===void 0)return this.messages.size;let e=0;for(let n of this.messages.values())if(ze(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(bt(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(E(t,s.eid)===!1)continue;let r=bt(n);if(e===void 0)e={hash:r,data:s};else if((s.ctr??0)>(e.data.ctr??0)||(s.ctr??0)===(e.data.ctr??0)&&(s.off??0)>(e.data.off??0))e={hash:r,data:s}}if(e)return await se(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(L(e));if(!n)continue;Ge(n,ee)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(L(e));if(!s)continue;Ge(s,Pt,n)}}async wipe(){this.messages.clear()}}W();C();class yo{#t;#e=new Map;constructor(t){this.#t=t}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return l(10);let r=this.#e.get(n)??{};if(r.tag!==void 0){if(!await gn(t,r.tag))return l(19)}else{let[o,i]=await gs(this.#t,t);if(i!==0)return l(i);r.tag=o}return this.#e.set(n,r),m(t)}async wipe(){this.#e.clear()}peekKeyTag(t=""){let e=this.#e.get(t)?.tag;return e===void 0?void 0:Vs(e)}}W();class bo{#t=new Map;async list(){let t=[];for(let e of this.#t.values()){let n=Xe(e);if(n!==void 0)t.push(n)}return t}async get(t){return Xe(this.#t.get(t))}async put(t,e){let[n,s]=ns(t,await this.get(t),e);if(s!==0)return s;return this.#t.set(t,n),0}async wipe(){this.#t.clear()}}ot();class ho{queue=new Map;async enq(t,e){let n=this.queue.get(t)||new Set;this.queue.set(t,n);for(let s of e)n.add(xt(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(xt(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(tn(s));return n}async count(){let t=0;for(let e of this.queue.values())t+=e.size;return t}async wipe(){this.queue.clear()}}class vl{account;realms=new bo;hosts=new mo;uploads=new ho;downloads=new uo;messages;constructor(t){this.account=new yo(t),this.messages=new po(t)}async bind(){return 0}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}tt();W();C();class Dl{singletonType;latest;latestOff=-1;emitter=new Qt;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new M(e.eid),[s,r]=n.readStruct(rt);if(r!==0)continue;let o=new U;o.writeVarString(this.singletonType);let i=o.result();if(s.id.length===i.length&&s.id.every((c,a)=>c===i[a])){if(this.latest===void 0||e.off>this.latestOff)this.latestOff=e.off,this.latest=e.bod,this.emitter.emit(this.singletonType,null)}}return t.map(()=>0)}clear=async()=>(this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0);notify=(t)=>{for(let e of t)if(e===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(t)=>{this.notify([this.singletonType])};on=(t,e)=>{this.emitter.addEventListener(t,e)};off=(t,e)=>{this.emitter.removeEventListener(t,e)}}Oe();W();C();class Ol{#t=new Map;#e;#s;#r;constructor(t){if(this.#s=t.rpId,this.#r=t.rpName,t.credId===void 0)return;let[e,n]=Xt(t.label);if(n!==0||e===void 0)return;this.#t.set(e,{credId:t.credId.slice()}),this.#e=e}get credId(){let t=this.#n(this.#e)?.credId;return t===void 0?void 0:t.slice()}setCredId(t,e){let[n,s]=Xt(e??this.#e);if(s!==0||n===void 0)return;let r=this.#t.get(n)??{};r.credId=t===void 0?void 0:t.slice(),this.#o(n,r),this.#e=n}async save(t,e){let[n,s]=Xt(e?.label);if(s!==0||n===void 0)return l(10);let r=this.#t.get(n)??{};if(e?.persist!==!0)return r.enclave=t,this.#o(n,r),this.#e=n,m(t);let[o,i]=await t.persistToLargeBlob([],{rpId:this.#s,rpName:this.#r,credId:r.credId});if(i!==0)return l(i);if(o===void 0)return l(30);return r.credId=o,r.enclave=t,this.#o(n,r),this.#e=n,m(t)}async load(){return this.#n(this.#e)?.enclave}async unlock(t){let e;if(t?.label===void 0&&this.#e!==void 0)e=this.#e;else{let[i,c]=Xt(t?.label);if(c!==0||i===void 0)return l(10);e=i}let n=this.#t.get(e)??{},s=n.credId;if(s===void 0)return l(22);let[r,o]=await ut.fromLargeBlob({rpId:this.#s,rpName:this.#r,credId:s});if(o!==0)return l(o);if(r===void 0)return l(22);return n.credId=r.credId,n.enclave=r.enclave,this.#o(e,n),this.#e=e,m(r.enclave)}async wipe(){for(let t of this.#t.values()){let e=t.credId;if(e===void 0)continue;let n=await ut.clearLargeBlob(e,{rpId:this.#s});if(n!==0)return Promise.reject(Error(`clearLargeBlob status ${n}`))}this.#t.clear(),this.#e=void 0}#n(t){if(t===void 0)return;return this.#t.get(t)}#o(t,e){if(e.enclave===void 0&&e.credId===void 0){this.#t.delete(t);return}this.#t.set(t,e)}}ae();Gs();Cr();ps();ae();export{ee as APLD_APPLIED,Pt as APLD_ERROR,ne as APLD_PENDING,co as CachedEntDB,jt as Clock,Xs as DEFAULT_PRF_SALT,M as Decoder,ut as Enclave,U as Encoder,xs as EntDBMemory,oo as EntIDB,we as Exim,or as HTTPTransport,fe as IDBAccountStore,Vn as IDBStore,Gl as KEYRING_MAX,gt as MASTER_SEED_LEN,vl as MemoryStore,Ol as PasskeySeedStore,In as PrfSeedStore,A as Purpose,mr as SEALED_MASTER_KEY_LEN,Dl as SingletonStateManager,pn as StateManager,g as Status,Qe as SyncClient,Qt as TypedEventEmitter,Wn as WorkerClient,ze as apldFromStored,Et as asChildKey,Hr as asDHKEReq,Rr as asDHKEResp,zt as asHostRlm,te as asSealedMasterKey,bt as b64tob,Ys as b64urltob,L as btob64,Ts as btob64url,xt as btoh,mn as checksumEntRevs,Me as checksumSet,xi as cmpBytes,re as crypto,Ne as defaultPeekProgressEvery,el as defaultWebAuthnRpId,rt as eidCodec,be as encodeEnt,Hi as encodeEntRev,Ye as entCodec,An as entStateManager,ec as genSingletonEID,ir as hostHTTPTransport,tn as htob,he as idleProgress,$c as isApldState,q as isLiveEnt,ta as isPendingApply,fr as isTerminalApplyFailure,Ec as isTombstone,Il as keyringCredIds,gl as keyringKind,wa as keyringLabel,ya as largeBlobCapable,Ci as normalizeTags,vc as nullEntDB,B as nullKDM,pr as nullStateManager,Hs as openDiplomaticClient,lo as openEntDB,_r as openIDBStore,Za as prfCapable,hn as revFromEntity,hr as revFromHead,Ge as setApld,$n as shouldEmitItemProgress,fd as useClient,Zd as useClientState,Xd as useClientXferState,Ql as useStateWatcher,Vd as useStateWatcherSuspense,Gd as useSyncOnResume,ua as webAuthnLastError};