@interncom/diplomatic 0.18.3 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/shared/types.d.ts +0 -2
- package/dist/web/client.d.ts +10 -4
- package/dist/web/entdb/cached.d.ts +17 -6
- package/dist/web/entdb/entdb.d.ts +1 -4
- package/dist/web/entdb/idb.d.ts +3 -5
- package/dist/web/entdb/manager.d.ts +3 -1
- package/dist/web/entdb/memory.d.ts +1 -3
- package/dist/web/index.d.ts +2 -2
- package/dist/web/index.mjs +1 -1
- package/dist/web/react/useClient.d.ts +5 -0
- package/dist/web/shared/types.d.ts +0 -2
- package/dist/web/state.d.ts +3 -2
- package/dist/web/worker/client.d.ts +1 -1
- package/dist/web/worker.mjs +1 -1
- package/package.json +1 -1
package/dist/web/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function ui(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 o=t.charCodeAt(s);if((o&64512)===56320)++s,i=((i&1023)<<10)+(o&1023)+65536}}if((i&4294901760)===0)n+=3;else n+=4}}return n}function rr(t,e,n){let s=t.length,i=n,o=0;while(o<s){let r=t.charCodeAt(o++);if((r&4294967168)===0){e[i++]=r;continue}else if((r&4294965248)===0)e[i++]=r>>6&31|192;else{if(r>=55296&&r<=56319){if(o<s){let l=t.charCodeAt(o);if((l&64512)===56320)++o,r=((r&1023)<<10)+(l&1023)+65536}}if((r&4294901760)===0)e[i++]=r>>12&15|224,e[i++]=r>>6&63|128;else e[i++]=r>>18&7|240,e[i++]=r>>12&63|128,e[i++]=r>>6&63|128}e[i++]=r&63|128}}var lr=new TextEncoder,cr=50;function ar(t,e,n){lr.encodeInto(t,e.subarray(n))}function pi(t,e,n){if(t.length>cr)ar(t,e,n);else rr(t,e,n)}var dr=4096;function zn(t,e,n){let s=e,i=s+n,o=[],r="";while(s<i){let l=t[s++];if((l&128)===0)o.push(l);else if((l&224)===192){let a=t[s++]&63;o.push((l&31)<<6|a)}else if((l&240)===224){let a=t[s++]&63,d=t[s++]&63;o.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,o.push(p>>>10&1023|55296),p=56320|p&1023;o.push(p)}else o.push(l);if(o.length>=dr)r+=String.fromCharCode(...o),o.length=0}if(o.length>0)r+=String.fromCharCode(...o);return r}var ur=new TextDecoder,pr=200;function mr(t,e,n){let s=t.subarray(e,e+n);return ur.decode(s)}function mi(t,e,n){if(n>pr)return mr(t,e,n);else return zn(t,e,n)}class se{type;data;constructor(t,e){this.type=t,this.data=e}}class st extends Error{constructor(t){super(t);let e=Object.create(st.prototype);Object.setPrototypeOf(this,e),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:st.name})}}var ie=4294967295;function hi(t,e,n){let s=n/4294967296,i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Fe(t,e,n){let s=Math.floor(n/4294967296),i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function ve(t,e){let n=t.getInt32(e),s=t.getUint32(e+4);return n*4294967296+s}function yi(t,e){let n=t.getUint32(e),s=t.getUint32(e+4);return n*4294967296+s}var hr=-1,yr=4294967295,br=17179869183;function Zr({sec:t,nsec:e}){if(t>=0&&e>=0&&t<=br)if(e===0&&t<=yr){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),o=new DataView(i.buffer);return o.setUint32(0,e<<2|n&3),o.setUint32(4,s),i}else{let n=new Uint8Array(12),s=new DataView(n.buffer);return s.setUint32(0,e),Fe(s,4,t),n}}function Gr(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 Xr(t){if(t instanceof Date){let e=Gr(t);return Zr(e)}else return null}function fr(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,o=n>>>2;return{sec:i,nsec:o}}case 12:{let n=ve(e,4),s=e.getUint32(0);return{sec:n,nsec:s}}default:throw new st(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${t.length}`)}}function Ir(t){let e=fr(t);return new Date(e.sec*1000+e.nsec/1e6)}var bi={type:hr,encode:Xr,decode:Ir};class oe{static defaultCodec=new oe;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(bi)}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 o=-1-n;return new se(o,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 Sr(t){return t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer}function Ie(t){if(t instanceof Uint8Array)return t;else if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);else if(Sr(t))return new Uint8Array(t);else return Uint8Array.from(t)}var Wr=100,Vr=2048;class Qe{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??oe.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.maxDepth=t?.maxDepth??Wr,this.initialBufferSize=t?.initialBufferSize??Vr,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 Qe({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=ui(t);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),pi(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=Ie(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 o=t[i];if(!(this.ignoreUndefined&&o===void 0))this.encodeString(i),this.doEncode(o,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),hi(this.view,this.pos,t),this.pos+=8}writeI64(t){this.ensureBufferSizeToWrite(8),Fe(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 Nt(t,e){return new Qe(e).encodeSharedRef(t)}function De(t){return`${t<0?"-":""}0x${Math.abs(t).toString(16).padStart(2,"0")}`}var gr=16,Kr=16;class En{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(t=gr,e=Kr){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 o=i.bytes;for(let r=0;r<n;r++)if(o[r]!==t[e+r])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=zn(t,e,n),o=Uint8Array.prototype.slice.call(t,e,e+n);return this.store(o,i),i}}var Fn="array",We="map_key",Gi="map_value",xr=(t)=>{if(typeof t==="string"||typeof t==="number")return t;throw new st("The type of key must be string or number but "+typeof t)};class Xi{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(t){let e=this.getUninitializedStateFromPool();e.type=Fn,e.position=0,e.size=t,e.array=Array(t)}pushMapState(t){let e=this.getUninitializedStateFromPool();e.type=We,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===Fn){let n=t;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(t.type===We||t.type===Gi){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 Se=-1,vn=new DataView(new ArrayBuffer(0)),Rr=new Uint8Array(vn.buffer);try{vn.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 Zi=RangeError("Insufficient data"),Cr=new En;class Oe{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=vn;bytes=Rr;headByte=Se;stack=new Xi;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??oe.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:Cr,this.mapKeyConverter=t?.mapKeyConverter??xr}clone(){return new Oe({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=Se,this.stack.reset()}setBuffer(t){let e=Ie(t);this.bytes=e,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.pos=0}appendBuffer(t){if(this.headByte===Se&&!this.hasRemaining(1))this.setBuffer(t);else{let e=this.bytes.subarray(this.pos),n=Ie(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 r of t){if(e)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);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:o}=this;throw RangeError(`Insufficient data in parsing ${De(s)} at ${o} (${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(o){if(!(o instanceof RangeError))throw o}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 st(`Unrecognized type byte: ${De(t)}`);this.complete();let n=this.stack;while(n.length>0){let s=n.top();if(s.type===Fn)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===We){if(e==="__proto__")throw new st("The key __proto__ is not allowed");s.key=this.mapKeyConverter(e),s.type=Gi;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=We;continue t}}return e}}readHeadByte(){if(this.headByte===Se)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=Se}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 st(`Unrecognized array type byte: ${De(t)}`)}}pushMapState(t){if(t>this.maxMapLength)throw new st(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(t)}pushArrayState(t){if(t>this.maxArrayLength)throw new st(`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 st(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+e+t)throw Zi;let n=this.pos+e,s;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(t))s=this.keyDecoder.decode(this.bytes,n,t);else s=mi(this.bytes,n,t);return this.pos+=e+t,s}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===We;return!1}decodeBinary(t,e){if(t>this.maxBinLength)throw new st(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(t+e))throw Zi;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 st(`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=yi(this.view,this.pos);return this.pos+=8,t}readI64(){let t=ve(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 Qn(t,e){return new Oe(e).decode(t)}class Ht{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 bt{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Ht}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(bt.eventName,t))}listen(t){return this.emitter.addEventListener(bt.eventName,t),()=>{this.emitter.removeEventListener(bt.eventName,t)}}}var Yt=64;var fi=32,kt=8;var je=32;var Ii=30000,Si=512,g;((I)=>{I[I.Success=0]="Success";I[I.InvalidSignature=3]="InvalidSignature";I[I.ClockOutOfSync=4]="ClockOutOfSync";I[I.UserNotRegistered=5]="UserNotRegistered";I[I.ServerMisconfigured=6]="ServerMisconfigured";I[I.MissingBody=7]="MissingBody";I[I.ExtraBodyContent=8]="ExtraBodyContent";I[I.MissingParam=9]="MissingParam";I[I.InvalidParam=10]="InvalidParam";I[I.InvalidRequest=11]="InvalidRequest";I[I.InternalError=12]="InternalError";I[I.NotFound=13]="NotFound";I[I.InvalidMessage=14]="InvalidMessage";I[I.NoChange=15]="NoChange";I[I.DatabaseClosed=16]="DatabaseClosed";I[I.StorageError=17]="StorageError";I[I.DatabaseError=18]="DatabaseError";I[I.HashMismatch=19]="HashMismatch";I[I.DecryptionError=20]="DecryptionError";I[I.NotImplemented=21]="NotImplemented";I[I.MissingSeed=22]="MissingSeed";I[I.OutOfBounds=23]="OutOfBounds";I[I.HostError=24]="HostError";I[I.CommunicationError=25]="CommunicationError";I[I.VarLimitExceeded=26]="VarLimitExceeded";I[I.InvalidResponse=27]="InvalidResponse";I[I.ConnectionClosed=28]="ConnectionClosed";I[I.CryptoError=29]="CryptoError";I[I.WebAuthnError=30]="WebAuthnError"})(g||={});function m(t){return[t,0]}function c(t){return[void 0,t]}function Tr(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 Hr(t,e=0){let n=0n,s=0,i=e;while(!0){if(i>=t.length)return c(14);let o=t[i++];if(o===void 0)return c(14);if(n|=BigInt(o&127)<<BigInt(s),(o&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 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 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]=Hr(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 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]=Tr(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}}async function Dn(t,e){let n=new U,s=n.writeDate(e);if(s!==0)return c(s);let i=n.result(),o=await t.sign(i);return m({pubKey:t.publicKey,sig:o,timestamp:e})}async function Lt(t,e,n){let s=n.now().getTime(),i=t.timestamp.getTime();if(Math.abs(s-i)>Ii)return 4;let r=new U;r.writeDate(t.timestamp);let l=r.result();if(!await e.checkSigEd25519(t.sig,l,t.pubKey))return 3;return 0}var A={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 re(t){let e=new U,n=e.writeStruct(A,t);if(n!==0)return c(n);let s=e.result();return m(s)}async function Yr(t){return re({id:t,ts:new Date(0)})}var ut={encode(t,e){let n=t.writeVarBytes(e.eid);if(n!==0)return n;let s=t.writeVarInt(e.off);if(s!==0)return s;let i=t.writeVarInt(e.ctr);if(i!==0)return i;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.readVarBytes();if(n!==0)return c(n);let s=new M(e),[,i]=A.decode(s);if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let[l,a]=t.readVarInt();if(a!==0)return c(a);let[d,u]=t.readVarInt();if(u!==0)return c(u);let p;if(d>0){let[h,y]=t.readBytes(je);if(y!==0)return c(y);p=h}return m({eid:e,off:o,ctr:l,len:d,hsh:p})}};function at(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function Ve(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 B(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;return t.every((n,s)=>n===e[s])}var R;if(typeof Uint8Array.prototype.toBase64==="function")R=(t)=>t.toBase64();else R=(t)=>btoa(String.fromCharCode(...t));var et;if(typeof Uint8Array.fromBase64==="function")et=(t)=>Uint8Array.fromBase64(t);else et=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0));function kr(t){return R(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function On(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return et(n)}function Zt(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}function Wi(t,e,n){return n.checkSigEd25519(t.sig,t.headCph,e)}async function Vi(t,e,n,s){let i;if(t.bod&&t.len>0)i=await n.blake3(t.bod);let o=new U,r=ut.encode(o,{...t,hsh:i});if(r!==0)return c(r);let l=o.result(),a=await e.kdmFor(l),d=s.deriveCipher(a,"encrypt"),u=await d.encrypt(l),p=t.bod?await d.encrypt(t.bod):new Uint8Array(0),h=await e.sign(u);return m({sig:h,kdm:a,headCph:u,bodyCph:p})}async function jn(t,e,n,s,i){let o=new M(t),[r,l]=ut.decode(o);if(l!==0)return c(14);let a;try{a=e&&e.length>0?await n.decrypt(e):void 0}catch{return c(20)}let d=r.hsh&&a===void 0,u=r.hsh===void 0&&a!==void 0;if(d||u)return c(19);if(r.hsh&&a){let h=await s.blake3(a);if(!B(h,r.hsh))return c(19)}let p=i??await s.blake3(t);return m({msgHead:r,bod:a,headHash:p})}class Mt{now(){return new Date}}function gi(t,e,n,s){let i=e.getTime()-t.getTime(),o=n.getTime()-s.getTime();return(i+o)/2}var ge={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,o]=t.readVarInt();if(o!==0)return c(o);s=i}return m({quota:e,usage:s})}};var An={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 o=t.writeVarInt(e.subscription.elapsed);if(o!==0)return o;let r=t.writeStruct(ge,e.subscription.stat);if(r!==0)return r;let l=t.writeStruct(ge,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,o]=t.readDate();if(o!==0)return c(o);let[r,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[h,y]=t.readStruct(ge);if(y!==0)return c(y);let[Z,b]=t.readStruct(ge);if(b!==0)return c(b);return m({status:s,timeRcvd:i,timeSent:r,subscription:{term:a,elapsed:u,stat:h,dyn:Z}})}};var qn={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})}};var dt={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(fi);if(n!==0)return c(n);let[s,i]=t.readBytes(Yt);if(i!==0)return c(i);let[o,r]=t.readDate();if(r!==0)return c(r);return m({pubKey:e,sig:s,timestamp:o})}};var Ki={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;for(let r of s)i.writeVarInt(r);return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let[h,y]=e.readVarInt();if(y!==0)return y;if(!e.done())return 8;let[Z,b]=await o.listHeads(d,h);if(b!==0)return b;return n.writeStructs(qn,Z)},decodeResp(t){return t.readStructs(qn)}};var _n={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})}};var xi={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;for(let r of s){let l=i.writeVarInt(r);if(l!==0)return l}return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let h=[];while(!e.done()){let[b,G]=e.readVarInt();if(G!==0)return G;h.push(b)}console.info(`PULL: ${h.length} bags`);let[y,Z]=await o.getBodies(d,h);if(Z!==0)return Z;if(!y)return 17;for(let{seq:b,bodyCph:G}of y){let S={seq:b,bodyCph:G},X=n.writeStruct(_n,S);if(X!==0)return X}return 0},decodeResp(t){return t.readStructs(_n)}};var $n={encode(t,e){t.writeBytes(e.sig),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(Yt);if(n!==0)return c(n);let[s,i]=t.readBytes(kt);if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);let[l,a]=t.readVarBytes();if(a!==0)return c(a);return m({sig:e,kdm:s,headCph:o,bodyCph:l})}};var Ae={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let i=e.bodyCph?e.bodyCph.length:0,o=t.writeVarInt(i);if(o!==0)return o;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.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let l;if(o>0){let[a,d]=t.readBytes(o);if(d!==0)return c(d);l=a}return m({seq:e,headCph:s,bodyCph:l})}};var qe={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(Yt);if(n!==0)return c(n);let[s,i]=t.readBytes(kt);if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);return m({sig:e,kdm:s,headCph:o})}};var _e={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 o=s[0];if(o!==0)return m({idx:e,status:o});let[r,l]=t.readVarInt();if(l!==0)return c(l);return m({idx:e,status:o,seq:r})}};var Ri={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;let r=i.writeStructs($n,s);if(r!==0)return r;return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o,notifier:r}=t,[l,a]=e.readStruct(dt);if(a!==0)return a;let d=await Lt(l,i,s);if(d!==0)return d;let{pubKey:u}=l,[p,h]=await o.hasUser(u);if(h!==0)return h;if(!p)return 5;let[y,Z]=e.readStructs($n);if(Z!==0)return Z;console.info(`PUSH: ${y.length} bags`);let b=[],G=[];for(let f=0;f<y.length;f++){let V=y[f];if(!await Wi(V,u,i)){let H={idx:f,status:3},k=n.writeStruct(_e,H);if(k!==0)return k;continue}b.push(f),G.push(V)}let[S,X]=await o.setBags(u,G);if(X!==0)return X;if(!S||S.length!==G.length)return 17;let W=[];for(let f=0;f<G.length;f++){let V=G[f],C=b[f],H=S[f],k=new U,Y=k.writeStruct(qe,V);if(Y!==0)return Y;let w=k.result(),z={seq:H,headCph:w};if(y.length===1&&V.bodyCph.length<=Si)z.bodyCph=V.bodyCph;W.push(z);let N={idx:C,status:0,seq:H},I=n.writeStruct(_e,N);if(I!==0)return I}if(W.length>0){let f=new U,V=f.writeStructs(Ae,W);if(V!==0)return V;let C=f.result();await Promise.resolve(r.push(u,C))}return 0},decodeResp(t){return t.readStructs(_e)}};var Ci={async encodeReq(t,e,n,s,i){return i.writeStruct(dt,n)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r;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)}};class ts{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 o=new U;o.writeStruct(dt,t);let r=o.result(),l=at(r);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}}var q={user:{path:"/user",endpoint:Ci,name:0},push:{path:"/push",endpoint:Ri,name:2},peek:{path:"/peek",endpoint:Ki,name:1},pull:{path:"/pull",endpoint:xi,name:3}},Lr={0:q.user,2:q.push,1:q.peek,3:q.pull},Pu={[q.user.path]:q.user,[q.push.path]:q.push,[q.peek.path]:q.peek,[q.pull.path]:q.pull};class es{url;listener;constructor(t){this.url=t;this.listener=new ts(t)}async call(t,e){let{path:n}=Lr[t],s=new URL(n,this.url);try{return await Mr(s,e)}catch{return c(25)}}}var ns=(t)=>new es(t.handle);async function Mr(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return c(24);let s=await M.fromResponse(n);return m(s)}class $e{enclave;crypto;host;clock;transport;updateHostMeta;constructor(t,e,n,s,i,o){this.enclave=t;this.crypto=e;this.host=n;this.clock=s;this.transport=i;this.updateHostMeta=o}async call(t,e){let{clock:n,transport:s}=this,{endpoint:i,name:o}=t,r=await this.identity(),l=n.now(),[a,d]=await Dn(r,l);if(d!==0)return c(d);let u=new U,p=await i.encodeReq(this,r,a,e,u);if(p!==0)return c(p);let h=n.now(),[y,Z]=await s.call(o,u),b=n.now();if(Z!==0)return c(Z);let[G,S]=y.readStruct(An);if(S!==0)return c(S);if(G.status!==0)return c(G.status);let W={clockOffset:gi(h,G.timeRcvd,G.timeSent,b),subscription:G.subscription},f=await this.updateHostMeta(W);if(f!==0)return c(f);return i.decodeResp(y)}identity=()=>{let{host:t,enclave:e}=this;return e.deriveIdentity(t.label,t.idx??0)};seal=async(t)=>{let{crypto:e,enclave:n}=this,s=await this.identity();return Vi(t,s,e,n)};register=()=>this.call(q.user,[]);peek=(t)=>this.call(q.peek,[t]);push=(t)=>this.call(q.push,t);pull=(t)=>this.call(q.pull,t);listen=async(t,e,n)=>{let{clock:s,transport:i}=this,{listener:o}=i,r=await this.identity(),l=s.now(),[a,d]=await Dn(r,l);if(d!==0)return d;return await o.connect(a,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()}}var ss={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[o,r]=t.readVarInt();if(r!==0)return c(r);let[l,a]=t.readBytes(je);if(a!==0)return c(a);let[d,u]=t.readBytes(Yt);if(u!==0)return c(u);return m({lbl:e,idx:s,num:o,hsh:l,sig:d})}};var tn={encode(t,e){let n=t.writeStruct(ss,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(ss);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);return m({head:e,indexEnc:s,bodyEnc:o})}};var is={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(kt);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let l;if(o>0){let[a,d]=t.readVarInt();if(d!==0)return c(d);l=a}return m({kdm:e,headCph:s,lenBody:o,offBody:l})}};var en;((Ti)=>{Ti.defaultFileExtension="dpl";async function e(i,o,r,l,a){let d=await a.deriveIdentity(i,o),u=new U,p=new U,h=0,y=0;for(let V of r){let C=new U,H=C.writeStruct(ut,V.head);if(H!==0)return c(H);let k=C.result(),Y=await d.kdmFor(k),w=a.deriveCipher(Y,"encrypt"),z=await w.encrypt(k),N=V.body?await w.encrypt(V.body):new Uint8Array(0),I=V.head.len>0&&V.head.hsh!==void 0?N.length:0,T={kdm:Y,headCph:z,lenBody:I,offBody:I>0?y:void 0},P=u.writeStruct(is,T);if(P!==0)return c(P);if(V.body)p.writeBytes(N),y+=N.length;h++}let Z=p.result(),b=u.result(),G=await l.blake3(b),S=await d.sign(G),X={lbl:i,idx:o,num:h,hsh:G,sig:S},W=new U;W.writeStruct(tn,{head:X,indexEnc:b,bodyEnc:Z});let f=W.result();return m(f)}Ti.encodeFile=e;async function n(i,o,r){let[l,a]=tn.decode(new M(i));if(a!==0)return c(a);let{head:d,indexEnc:u,bodyEnc:p}=l,h=await r.deriveIdentity(d.lbl,d.idx);if(!await o.checkSigEd25519(d.sig,d.hsh,h.publicKey))return c(3);let Z=await o.blake3(u);if(!B(Z,d.hsh))return c(19);let b=new M(u),G=[];for(let X=0;X<d.num;X++){let[W,f]=b.readStruct(is);if(f!==0)return c(f);G.push(W)}if(G.length!==d.num)return c(14);let S=[];for(let X of G){let W=r.deriveCipher(X.kdm,"decrypt"),f;try{f=await W.decrypt(X.headCph)}catch{return c(20)}let[V,C]=ut.decode(new M(f));if(C!==0)return c(C);let H;if(X.lenBody>0&&X.offBody!==void 0){if(V.hsh===void 0)return c(14);let k=p.slice(X.offBody,X.offBody+X.lenBody);try{H=await W.decrypt(k)}catch{return c(20)}let Y=await o.blake3(H);if(!B(Y,V.hsh))return c(19)}S.push({head:V,body:H})}return m(S)}Ti.decodeFile=n;async function s(i,o,r,l,a){let[d,u]=await n(i,o,r);if(u!==0)return c(u);let[p,h]=tn.decode(new M(i));if(h!==0)return c(h);return e(p.head.lbl,p.head.idx,a(d),o,l)}Ti.migrateFile=s})(en||={});async function Hi({now:t,bod:e,crypto:n}){let s=await n.genRandomBytes(8),i=new U,o=i.writeStruct(A,{id:s,ts:t});if(o!==0)return c(o);let r=i.result();return nn({now:t,eid:r,ctr:0,bod:e,crypto:n})}async function nn({now:t,eid:e,ctr:n,bod:s,crypto:i}){let o=new M(e),[r,l]=A.decode(o);if(l!==0)return c(l);let a=t.getTime()-r.ts.getTime(),d,u=s?.length??0;if(s&&u>0)d=await i.blake3(s);return m({eid:e,off:a,ctr:n,len:u,hsh:d})}function Yi(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 le(t,e){let n=Array.from(t);n.sort(Yi);let s=0;for(let r of n)s+=r.length;let i=new Uint8Array(s),o=0;for(let r of n)i.set(r,o),o+=r.length;return e.blake3(i)}function ki(t){let e=new U,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 Ke(t,e){let n=[];for(let s of t){let[i,o]=ki(s);if(o!==0||!i)return c(o);n.push(i)}return m(await le(n,e))}var Cp=Symbol("MasterSeed"),Tp=Symbol("SealedMasterKey"),yt=32,os=24+yt+16;function Pt(t){if(t.byteLength!==os)return c(10);return m(t)}var Yp=Symbol("EntityID");function Li(t){return"type"in t}var kp=Symbol("DerivationSeed"),Lp=Symbol("PublicKey"),Mp=Symbol("PrivateKey"),Pp=Symbol("HostSpecificKeyPair"),Up=Symbol("Hash");function Pr(t){if(!t)return!1;if(typeof t!=="object")return!1;if("body"in t===!1)return!1;if("type"in t===!1)return!1;return!0}function Ur(t){if(!t.bod||t.bod.length===0){let s={off:t.off,ctr:t.ctr,eid:t.eid};return m(s)}let e=Qn(t.bod);if(Pr(e)===!1)return console.warn("msg body invalid",e),c(14);let n={off:t.off,ctr:t.ctr,eid:t.eid,gid:e.gid,pid:e.pid,tags:e.tags,type:e.type,body:e.body};return m(n)}class xe{applier;emitter=new Ht;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]=Ur(l);if(n.push(d),d!==0)continue;e.push(a)}let{stats:s,types:i,eids:o}=await this.applier(e),r=[];for(let l=0;l<t.length;l++){let a=n[l],d=s[l];if(a!==0){r.push(a);continue}if(d!==0){r.push(d);continue}r.push(0)}if(!this.cacheDriven)for(let l of i)this.emitter.emit(l,null);if(o.length>0)this.onDirtyEids?.(o);return r};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 rs={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){}};var D="entities",sn="entity_type_created_at",cs="entity_type_updated_at",as="entity_type_group_id",ds="entity_type_parent_id",ce="entity_tags",Mi="db",Pi=13;function wr(t){return"typ"in t}function Br(t){let e={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:R(t.eid),gid:t.gid,pid:t.pid?R(t.pid):void 0,tgs:t.tags,typ:t.type,upd:t.updatedAt};if(e.gid===void 0)delete e.gid;if(e.pid===void 0)delete e.pid;if(e.tgs===void 0)delete e.tgs;if(e.ctr===void 0)delete e.ctr;return e}function Jr(t){if(!F(t))return{eid:R(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return Br(t)}function zt(t){return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:et(t.eid),gid:t.gid,pid:t.pid?et(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{}}}function ls(t){if(wr(t))return zt(t);return{eid:et(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function Nr(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 zr(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 Er(t,e,n){let s=[];if(typeof n==="string"){for(let r of t)if(r.typ===e)s.push(zt(r));return s}let i=new Set,o="prefix"in n?n.prefix:void 0;for(let r of t){if(r.typ!==e)continue;if(i.has(r.eid))continue;if(o!==void 0){let l=r.tgs;if(!l||!l.some((a)=>a.startsWith(o)))continue}i.add(r.eid),s.push(zt(r))}return s}class us{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=vr().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;try{s=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let i=s.transaction(D,"readwrite"),o=i.objectStore(D);return new Promise((r)=>{let l=Array(t.length).fill(0);if(t.length<1){r({stats:[],types:e,eids:n});return}i.oncomplete=()=>{r({stats:l,types:e,eids:n})},i.onerror=()=>{for(let d=0;d<l.length;d++)if(l[d]===void 0)l[d]=18;r({stats:l,types:e,eids:n})};let a=new Map;for(let d=0;d<t.length;d++){let u=t[d],p=R(u.eid),h={op:u,index:d},y=a.get(p);if(y)y.push(h);else a.set(p,[h])}for(let[d,u]of a){if(u.length<1)continue;let p=o.get(d);p.onsuccess=()=>{let h=p.result,y=h?ls(h):void 0,Z=!1;for(let{op:b,index:G}of u){let[S,X]=ae(y,b);if(X!==0){l[G]=X;continue}if(S===void 0){l[G]=12;continue}Z=!0;for(let W of de(y,S))e.add(W);y=S}if(Z)n.push(u[0].op.eid);if(y){let b=o.put(Jr(y));b.onerror=(G)=>{G.preventDefault();for(let{index:S}of u)l[S]=18}}},p.onerror=()=>{for(let{index:h}of u)l[h]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(D,"readwrite"),n=e.objectStore(D);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=R(t),i=e.transaction(D,"readonly").objectStore(D);return new Promise((o)=>{let r=i.get(n);r.onsuccess=()=>{let l=r.result;if(!l)o(m(void 0));else o(m(ls(l)))},r.onerror=()=>o(c(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!F(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=Re(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let r=i.transaction(D,"readonly").objectStore(D).index(cs),l=Nr(t,e);return new Promise((a)=>{let d=r.getAll(l);d.onsuccess=()=>{let u=d.result;a(m(u.map(zt)))},d.onerror=()=>a(c(18))})}async getGroupMembers(t,e){let n;try{n=await this.ensureDb()}catch{return c(16)}let i=n.transaction(D,"readonly").objectStore(D).index(as);return new Promise((o)=>{let r=i.getAll(IDBKeyRange.only([t,e]));r.onsuccess=()=>{let l=r.result;o(m(l.map(zt)))},r.onerror=()=>o(c(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D).index(sn);return new Promise((i)=>{let o=s.getAll(IDBKeyRange.bound([t],[t,[]]));o.onsuccess=()=>{let r=o.result;i(m(r.map(zt)))},o.onerror=()=>i(c(18))})}async getByTag(t,e){let[n,s]=Ce(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let o=zr(e),l=i.transaction(D,"readonly").objectStore(D).index(ce);return new Promise((a)=>{let d=l.getAll(o);d.onsuccess=()=>{let u=d.result;a(m(Er(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=R(t.pid),i=e.transaction(D,"readonly").objectStore(D).index(ds);return new Promise((o)=>{let r=i.getAll(IDBKeyRange.only([t.type,n]));r.onsuccess=()=>{let a=r.result.map(zt);o(m(a))},r.onerror=()=>o(c(18))})}else if("gid"in t)return await this.getGroupMembers(t.type,t.gid);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,n]=await this.getAllEntities(t);if(n!==0)return c(n);return m(e)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D).index(sn);return new Promise((i)=>{let o=IDBKeyRange.bound([t],[t,[]]),r=s.count(o);r.onsuccess=()=>i(m(r.result)),r.onerror=()=>i(c(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D),i=[];return new Promise((o)=>{let r=s.openCursor();r.onsuccess=()=>{let l=r.result;if(l){let a=l.value;i.push(Te(ls(a))),l.continue()}else Ke(i,t).then(o)},r.onerror=()=>o(c(18))})}}function Fr(t,e){if(!t.objectStoreNames.contains(D))t.createObjectStore(D,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(D);if(!n.indexNames.contains(sn))n.createIndex(sn,["typ","crd"],{unique:!1});if(!n.indexNames.contains(cs))n.createIndex(cs,["typ","upd"],{unique:!1});if(!n.indexNames.contains(as))n.createIndex(as,["typ","gid"],{unique:!1});if(!n.indexNames.contains(ds))n.createIndex(ds,["typ","pid"],{unique:!1});if(n.indexNames.contains(ce)){if(n.index(ce).keyPath!=="tgs")n.deleteIndex(ce)}if(!n.indexNames.contains(ce))n.createIndex(ce,"tgs",{unique:!1,multiEntry:!0})}function vr(){return new Promise((t,e)=>{let n=indexedDB.open(Mi,Pi);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!i){e(Error("Transaction is null during EntDB upgrade"));return}try{Fr(s,i)}catch(o){e(o instanceof Error?o:Error(String(o)))}},n.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${Mi} → v${Pi}); waiting for other connections to close`)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error??Error("EntDB IndexedDB open failed"))})}async function Ui(){let t=new us;return await t.init(),t}class on{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeGid=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=R(t.eid),n=this.ents.get(e);if(n!==void 0&&F(n))this.unindex(e,n);if(this.ents.set(e,t),F(t))this.index(e,t)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(F(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=R(e.pid),i=this.byTypePid.get(e.type);if(!i)i=new Map,this.byTypePid.set(e.type,i);let o=i.get(s);if(!o)o=new Map,i.set(s,o);o.set(t,e)}if(typeof e.gid==="string"){let s=this.byTypeGid.get(e.type);if(!s)s=new Map,this.byTypeGid.set(e.type,s);let i=s.get(e.gid);if(!i)i=new Map,s.set(e.gid,i);i.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 o=s.get(i);if(!o)o=new Map,s.set(i,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=R(e.pid),i=this.byTypePid.get(e.type),o=i?.get(s);if(o){if(o.delete(t),o.size===0)i?.delete(s)}if(i&&i.size===0)this.byTypePid.delete(e.type)}if(typeof e.gid==="string"){let s=this.byTypeGid.get(e.type),i=s?.get(e.gid);if(i){if(i.delete(t),i.size===0)s?.delete(e.gid)}if(s&&s.size===0)this.byTypeGid.delete(e.type)}if(e.tags){let s=this.byTypeTag.get(e.type);if(s){for(let i of e.tags){let o=s.get(i);if(o){if(o.delete(t),o.size===0)s.delete(i)}}if(s.size===0)this.byTypeTag.delete(e.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeGid.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]=Ce(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 o=new Set,r=[];for(let[l,a]of i){if(!ms(l,e))continue;for(let[d,u]of a){if(o.has(d))continue;o.add(d),r.push(u)}}return m(r)}byDateSpec(t,e){let[n,s]=Re(e);if(s!==0)return c(s);if(!n)return m([]);let i=[],o=this.byType.get(t);if(o){for(let r of o.values())if(ps(r.updatedAt,e))i.push(r)}return m(i)}async apply(t){let e=new Set,n=[],s=[];for(let i of t){let o=R(i.eid),r=this.ents.get(o),[l,a]=ae(r,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of de(r,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=R(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||!F(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=R(t.pid);return m(this.bucketList(this.byTypePid.get(e)?.get(s)))}if("gid"in t)return m(this.bucketList(this.byTypeGid.get(e)?.get(t.gid)));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(F(s)&&s.type===e&&s.pid&&B(s.pid,t.pid))n.push(s)}else if("gid"in t){for(let s of this.ents.values())if(F(s)&&s.type===e&&(typeof s.gid==="string"&&s.gid===t.gid))n.push(s)}else if("tag"in t){let s=t.tag,[i,o]=Ce(s);if(o!==0)return c(o);if(!i)return m(n);for(let r of this.ents.values())if(F(r)&&r.type===e&&r.tags&&r.tags.some((l)=>ms(l,s)))n.push(r)}else if("updatedAt"in t){let s=t.updatedAt,[i,o]=Re(s);if(o!==0)return c(o);if(!i)return m(n);for(let r of this.ents.values())if(F(r)&&r.type===e&&ps(r.updatedAt,s))n.push(r)}else for(let s of this.ents.values())if(F(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(F(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(Te(n));return Ke(e,t)}}async function hs(t){let e=await Ui();if(t?.cache===!1)return e;return new He(e,void 0,{indexes:t?.indexes})}class He{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();constructor(t,e,n){if(this.durable=t,this.mem=new on(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;for(let e of this.listeners)e(t)}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){this.emit(qr(this.mem,t).types);let e=new Map;for(let n of t){let s=R(n.eid);e.set(s,Bi(this.mem.ents.get(s)))}return this.run(async()=>{let n=await this.durable.apply(t),{changed:s,status:i}=await this.pullEids(t.map((o)=>o.eid),e);if(this.emit(s),i!==0)return{stats:t.map(()=>i),types:n.types,eids:n.eids};return n})}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){return this.run(async()=>{let{changed:e,status:n}=await this.pullEids(t);return this.emit(e),n})}async pullEids(t,e){let n=new Set,s=new Set;for(let i of t){let o=R(i);if(s.has(o))continue;s.add(o);let[r,l]=await this.durable.getRow(i);if(l!==0)return{changed:n,status:l};let a=this.mem.ents.get(o);if(e){if(!Ar(Bi(a),e.get(o)))continue}else if(a!==void 0&&r!==void 0&&wi(a,r))continue;if(r){if(this.mem.put(r),!a||!Qr(a,r)){if(F(r))n.add(r.type);if(a!==void 0&&F(a))n.add(a.type)}}else if(a!==void 0){if(this.mem.del(o),F(a))n.add(a.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let[e,n]=await this.durable.getEntities({type:t});if(n!==0)return n;if(e)for(let s of e){let i=R(s.eid),o=this.mem.ents.get(i);if(!o||wi(s,o))this.mem.put(s)}return this.warmed.add(t),0}async getRow(t){let e=R(t);if(this.mem.ents.has(e))return this.mem.getRow(t);return this.run(async()=>{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)this.mem.put(n);return m(n)})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!F(e))return m(void 0);return m(e)}async getEntities(t){if(!this.warmed.has(t.type)){let e=await this.run(()=>this.warmType(t.type));if(e!==0)return c(e)}return this.mem.getEntities(t)}async countEntities({type:t}){if(!this.warmed.has(t)){let e=await this.run(()=>this.warmType(t));if(e!==0)return c(e)}return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function Qr(t,e){if(F(t)!==F(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!B(t.eid,e.eid))return!1;if(!F(t)||!F(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(t.gid!==e.gid)return!1;if(!Or(t.pid,e.pid))return!1;if(!Dr(t.tags,e.tags))return!1;return jr(t.body,e.body)}function Dr(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 Or(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return B(t,e)}function jr(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return B(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();try{return B(Nt(t),Nt(e))}catch{return!1}}function wi(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Bi(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function Ar(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function qr(t,e){let n=new Set,s=[];for(let i of e){let o=R(i.eid),r=t.ents.get(o),[l,a]=ae(r,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of de(r,l))n.add(d);t.put(l),s.push(0)}return{stats:s,types:n}}function rn(t){if(t instanceof He){let e=new xe((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 xe((e)=>t.apply(e),()=>t.clear())}function F(t){return"type"in t}function _r(t){return!F(t)}function $r(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 Re(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return c(10);return m(!0)}function ps(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return $r(t,e.range)}function tl(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 Ce(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 ms(t,e){if(typeof e==="string")return t===e;if("range"in e)return tl(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function Ji(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 Te(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function ys(t){let e=new M(t.eid),[n,s]=e.readStruct(A);if(s!==0)return c(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function ae(t,e){let n=new M(e.eid),[s,i]=n.readStruct(A);if(i!==0)return c(i);let o=new Date(s.ts.getTime()+e.off);if(t!==void 0&&o<=t.updatedAt)return c(15);if(Li(e)){let r=Ji(e.tags);return m({eid:e.eid,gid:e.gid,pid:e.pid,...r!==void 0?{tags:r}:{},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 de(t,e){let n=new Set;if(t!==void 0&&F(t))n.add(t.type);if(F(e))n.add(e.type);return[...n]}var el={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};class ln{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 cn=100;class Ye{timer=null;delayMs;work;tail=new ln;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)}}function Ni(t){let e=new M(t.eid),[n,s]=A.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function nl(t,e){let n=Ni(t),s=Ni(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 ue(t,e){return t.slice().sort((n,s)=>nl(e(n),e(s)))}var Et={phase:"idle"},pe=50;function an(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}function dn(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 zi(t,e,n){let s=[],i=[],o=0;for(let r of t){let l=e(r);if(i.length>0&&o+l>n)s.push(i),i=[],o=0;if(i.push(r),o+=l,o>=n)s.push(i),i=[],o=0}if(i.length>0)s.push(i);return s}async function bs(t,e,n){let s=t.length;if(s<1)return[];let i=Array(s),o=0,r=Math.min(Math.max(1,e),s),l=async()=>{while(!0){let d=o;if(o+=1,d>=s)return;i[d]=await n(t[d],d)}},a=[];for(let d=0;d<r;d++)a.push(l());return await Promise.all(a),i}async function un(t,e,n,s){let i=new M(t.headCph),[o,r]=i.readStruct(qe);if(r!==0)return c(r);let{sig:l,kdm:a,headCph:d}=o;if(!await s.checkSigEd25519(l,d,e))return c(3);let p=n.deriveCipher(a,"decrypt"),h;try{h=await p.decrypt(d)}catch{return c(20)}return m({kdm:a,headEnc:h})}var Wt="f",Ut="t",Gt="e";function sl(t){return t===Wt||t===Ut||t===Gt}function me(t){if(t===!0||t===Ut)return Ut;if(t===Gt)return Gt;return Wt}function il(t){return me(t.apld)===Wt}function Zs(t){return t!==0&&t!==15&&t!==18&&t!==17}function Ft(t,e,n){if(t.apld=e,e===Gt&&n!==void 0)t.err=n;else delete t.err}async function wt(t,e,n,s){let i=s?.body!==!1,o=me(e.apld),r=e.body,l=r?.length??0,a;if(i&&r&&l>0)a=await n.blake3(r);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,len:l,hsh:a},u={hash:t,head:d,apld:o};if(i&&r!==void 0)u.body=r;if(o===Gt&&e.err!==void 0)u.err=e.err;return u}var Gs=1048576,Xs=1048576,Fi=64;function ol(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}async function rl(t,e,n,s,i){if(s.length<1)return 0;let[o,r]=await t.push(s);if(r!==0)return r;if(!o)return 27;for(let a of o){if(a.status!==0){console.error("push err",a);continue}let d=i[a.idx];if(!d){console.error("no hash",a);continue}await e.uploads.deq(n,[d])}let l=await e.hosts.get(n);if(l){let a=l.lastSeq,d=a,u=[];for(let p of o)if(p.status===0)u.push(p.seq);u.sort((p,h)=>p-h);for(let p of u)if(p===a+1)a=p;if(a>d)await e.hosts.touch(n,a)}return 0}async function Ei(t,e){if(e.length<1)return m([]);let n=new Map,s=[];for(let l of e)n.set(l.seq,l),s.push(l.seq);let[i,o]=await t.pull(s);if(o!==0)return c(o);if(!i)return c(27);let r=[];for(let{seq:l,bodyCph:a}of i){let d=n.get(l);if(!d)continue;r.push({dl:d,bodyCph:a})}return m(r)}async function ll(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let i=[],o=[],r=[],l=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:h,seq:y,host:Z}=d,[b,G]=await vi(d,n);if(G!==0||!b){let Y=l.get(Z)??[];Y.push(y),l.set(Z,Y);continue}let{headEnc:S,headEncHash:X}=b,W=e.deriveCipher(h,"decrypt"),[f,V]=await jn(S,u,W,n,X);if(V!==0||!f){let Y=l.get(Z)??[];Y.push(y),l.set(Z,Y);continue}let C={head:p,body:f.bod},H=f.headHash;r.push({key:H,data:Oi(C)}),i.push(C),o.push(H);let k=l.get(Z)??[];k.push(y),l.set(Z,k)}let a=await t.messages.add(r);for(let[d,u]of l)await t.downloads.deq(d,u);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:i,hashes:o})}async function vi(t,e){let n=t.headEnc;if(!n){let i=new U,o=i.writeStruct(ut,t.head);if(o!==0)return c(o);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 Qi(t,e,n){let s=new Set;for(let r of e)s.add(R(r));if(s.size<1)return;let i=Array.from(await t.downloads.list());if(i.length<1)return;let o=new Map;for(let r of i){let l;if(r.headEncHash)l=R(r.headEncHash);else{let[d,u]=await vi(r,n);if(u!==0||!d)continue;l=R(d.headEncHash)}if(!s.has(l))continue;let a=o.get(r.host)??[];a.push(r.seq),o.set(r.host,a)}for(let[r,l]of o)await t.downloads.deq(r,l)}async function fs({conn:t,store:e,enclave:n,host:s,crypto:i,onProgress:o,peekProgressEvery:r,peekConcurrency:l}){let a=await t.identity(),d=[],[u,p]=await t.peek(s.lastSeq);if(p!==0)return p;let h=u.length,y=r??pe,Z=l??Fi;if(o&&h>0)o({phase:"peek",host:s.label,done:0,total:h});let b=0,G=await bs(u,Z,async(X)=>{let[W,f]=await un(X,a.publicKey,n,i),V;if(f!==0||!W)V={ok:!1,seq:X.seq,stat:f};else{let C=await i.blake3(W.headEnc);V={ok:!0,seq:X.seq,kdm:W.kdm,headEnc:W.headEnc,headEncHash:C}}if(b+=1,o&&an(b,h,y))o({phase:"peek",host:s.label,done:b,total:h});return V}),S=new Set;for(let X of G){if(!X.ok){console.error("peek: decrypting item head",X.stat);continue}let W=R(X.headEncHash);if(await e.messages.has(X.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(s.label,[X.headEncHash]),await e.downloads.deq(s.label,[X.seq]);continue}if(S.has(W)){await e.downloads.deq(s.label,[X.seq]);continue}let V=new M(X.headEnc),[C,H]=V.readStruct(ut);if(H!==0){console.error("peek: reading item head",H);continue}S.add(W),d.push({kdm:X.kdm,head:C,seq:X.seq,host:s.label,headEnc:X.headEnc,headEncHash:X.headEncHash})}if(await e.downloads.enq(d),u.length>0){let X=Math.max(...u.map((W)=>W.seq));await e.hosts.recordStats(s.label,{lastSeq:X})}if(o)o({phase:"peek",host:s.label,done:h,total:h});return 0}async function Di({conn:t,store:e,host:n,maxPushBytes:s,onProgress:i}){let o=s??Gs,r=await e.uploads.list(n.label),l=r.length,a=0;if(i&&l>0)i({phase:"push",host:n.label,done:0,total:l});let d=[],u=[],p=0,h=async()=>{if(d.length<1)return 0;let y=d.length,Z=await rl(t,e,n.label,d,u);if(d=[],u=[],p=0,Z===0){if(a+=y,i)i({phase:"push",host:n.label,done:a,total:l})}return Z};for(let y of r){let Z=await e.messages.get(y);if(!Z){a+=1;continue}let b={...Z.head,bod:Z.body},[G,S]=await t.seal(b);if(S!==0)return S;if(!G)return 12;let X=ol(G);if(d.length>0&&p+X>o){let W=await h();if(W!==0)return W}if(d.push(G),u.push(y),p+=X,p>=o){let W=await h();if(W!==0)return W}}return h()}async function Is({conn:t,store:e,enclave:n,host:s,crypto:i,maxPullBytes:o,onProgress:r},l){let a=o??Xs,d=await e.downloads.list(),u=Array.from(d).filter((G)=>G.host===s.label);if(u.length<1)return 15;let p=ue(u,(G)=>G.head),h=zi(p,(G)=>G.head.len,a),y=p.length,Z=0;if(r)r({phase:"pull",host:s.label,done:0,total:y});let b=Ei(t,h[0]);for(let G=0;G<h.length;G++){let[S,X]=await b;if(X!==0||!S)return X;if(Z+=h[G].length,r)r({phase:"pull",host:s.label,done:Z,total:y});let W=h[G+1];if(W)b=Ei(t,W);if(r)r({phase:"open",host:s.label,done:Z,total:y});let f=ue(S,(C)=>C.dl.head),[,V]=await ll(e,n,i,f);if(V!==0)return V;if(l){if(r)r({phase:"exec",host:s.label,done:Z,total:y});await l()}}return 0}function Oi({head:t,body:e}){let n={eid:t.eid,body:e,apld:Wt};if(t.off!==0)n.off=t.off;if(t.ctr!==0)n.ctr=t.ctr;return n}async function ji(t,{conn:e,store:n,enclave:s,host:i,crypto:o,onProgress:r},l){let a=i.label,d=await e.identity(),u=new M(t),[p,h]=u.readStructs(Ae);if(h!==0){console.error("Failed decoding notif",g[h]);return}let y=!1,b=(await n.hosts.get(a))?.lastSeq,G=[],S=!1;for(let f of p){let[V,C]=await un({seq:f.seq,headCph:f.headCph},d.publicKey,s,o);if(C!==0){console.error("Failed decrypting notif",g[C]);continue}let H=await o.blake3(V.headEnc);if(await n.messages.has(H))continue;let k=new M(V.headEnc),[Y,w]=k.readStruct(ut);if(w!==0){console.error("Failed to parse head",g[w]);continue}if(!f.bodyCph&&Y.len>0)S=!0,await n.downloads.enq([{seq:f.seq,host:a,kdm:V.kdm,head:Y,headEnc:V.headEnc,headEncHash:H}]);else G.push({...V,head:Y,bodyCph:f.bodyCph,headEncHash:H});if(b===void 0||f.seq!==b+1)console.log("out of seq",f.seq,b),y=!0;else b=f.seq}if(b!==void 0)await n.hosts.touch(i.label,b);let X=[];for(let f of G){let V=s.deriveCipher(f.kdm,"decrypt"),[C,H]=await jn(f.headEnc,f.bodyCph,V,o);if(H!==0){console.error("Failed to open body",g[H]);continue}X.push({key:f.headEncHash,data:Oi({head:f.head,body:C.bod})})}let W=await n.messages.add(X);for(let f=0;f<W.length;f++){let V=W[f];if(V!==0&&V!==15)console.error("ERR storing",g[V],"for message",f)}if(r&&X.length>0)r({phase:"open",host:i.label,done:X.length,total:X.length});if(y||S||X.length>0)l()}async function Ss(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:i,store:o,enclave:r,host:l,crypto:a,onProgress:d,peekProgressEvery:u,peekConcurrency:p}=t,h=await i.identity(),[y,Z]=await i.peek(0);if(Z!==0)return c(Z);let b=y.length,G=u??pe,S=p??Fi;if(d&&b>0)d({phase:"peek",host:l.label,done:0,total:b});let X=0,W=await bs(y,S,async(T)=>{let[P,L]=await un(T,h.publicKey,r,a),E;if(L!==0||!P)E={ok:!1,seq:T.seq,stat:L};else{let x=await a.blake3(P.headEnc);E={ok:!0,seq:T.seq,kdm:P.kdm,headEnc:P.headEnc,headEncHash:x}}if(X+=1,d&&an(X,b,G))d({phase:"peek",host:l.label,done:X,total:b});return E}),f=new Map;for(let T of W){if(!T.ok)continue;let P=R(T.headEncHash),L=f.get(P);if(L)L.count+=1;else f.set(P,{hash:T.headEncHash,count:1,sample:T})}let V=0,C=[];for(let T of f.values()){if(T.count>1)V+=T.count-1;C.push(T.hash)}let H=y.length,k=f.size,Y=await le(C,a),w=[],z=0;for(let T of f.values()){if(await o.messages.has(T.hash)){await o.uploads.deq(l.label,[T.hash]);continue}if(z+=1,!n)continue;let L=T.sample,E=new M(L.headEnc),[x,O]=E.readStruct(ut);if(O!==0){console.error("reconcile: reading msg header",O);continue}w.push({kdm:L.kdm,head:x,seq:L.seq,host:l.label,headEnc:L.headEnc,headEncHash:L.headEncHash})}if(w.length>0)await o.downloads.enq(w);let N=0;if(s){let T=await o.messages.listKeys(),P=new Set(f.keys()),L=[];for(let E of T)if(!P.has(R(E)))N+=1,L.push(E);if(L.length>0)await o.uploads.enq(l.label,L)}else{let T=await o.messages.listKeys(),P=new Set(f.keys());for(let L of T)if(!P.has(R(L)))N+=1}let I=y.length>0?Math.max(...y.map((T)=>T.seq)):0;if(await o.hosts.recordStats(l.label,{setLastSeq:I}),d)d({phase:"peek",host:l.label,done:b,total:b});return m({msgcheck:Y,numBags:H,uniqueMsgs:k,numDupes:V,missingLocal:z,missingHost:N})}class he{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new ln;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=pe;lastProgress=Et;scheduledSync;constructor(t,e,n,s,i,o=!0,r=Gs,l=Xs,a){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=i;this.forceSkewHandlingByDefault=o;this.onScheduleSync=a;this.maxPushBytes=r,this.maxPullBytes=l,this.clientState=new bt(()=>this.getClientState()),this.xferState=new bt(()=>this.getXferState()),this.scheduledSync=new Ye(cn,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()};async setSeed(t,e){await this.store.seed.save(t,e),this.clientState.emit()}async getClientState(){let{store:t,connections:e}=this,n=await t.seed.load(),s=await t.hosts.list(),i=!1;for(let o of e.values())if(o.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)=>this.enqueueApplyJob(()=>this.doApply(t,e));async doApply(t,e={enqueueUpload:!0,triggerUpload:!0}){let n=[],s=[];for(let{head:o,body:r}of t){let l=new U;l.writeStruct(ut,o);let a=l.result(),d=await this.crypto.blake3(a),u={eid:o.eid,body:r,apld:Wt};if(o.off!==0)u.off=o.off;if(o.ctr!==0)u.ctr=o.ctr;n.push(d),s.push({key:d,data:u})}await this.store.messages.add(s),await Qi(this.store,n,this.crypto);let i=await this.doApplyHashes(n);if(e.enqueueUpload){let o=[];for(let r=0;r<n.length;r++){let l=i[r];if(l===0||l===15)o.push(n[r])}if(o.length>0){let r=await this.store.hosts.list();for(let l of r)await this.store.uploads.enq(l.label,o);this.xferState.emit()}}if(e.triggerUpload)this.scheduleSync();return i}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:Wt});if(t.length<1)return[];let e=ue(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 o=await this.store.messages.get(i);if(o)e.push(o)}let n=await this.applyStored(e),s=new Map;for(let i=0;i<e.length;i++)s.set(R(e[i].hash),n[i]??12);return t.map((i)=>s.get(R(i))??13)}async applyStored(t){if(t.length<1)return[];let e=t.map((o)=>({...o.head,bod:o.body})),n=await this.state.apply(e),s=[],i=[];for(let o=0;o<t.length;o++){let r=n[o];if(r===0||r===15)s.push(t[o].hash);else if(r!==void 0&&Zs(r))i.push({key:t[o].hash,err:r})}if(s.length>0)await this.store.messages.markApplied(s);if(i.length>0)await this.store.messages.markFailed(i);return n}async insertRaw(t){let{clock:e,crypto:n}=this,[s,i]=await Hi({now:e.now(),bod:t,crypto:n});if(i!==0)return c(i);let r=(await this.apply([{head:s,body:t}]))[0];if(r!==0&&r!==15)return c(r??12);return m(s)}async makeUpdate(t,e){let{clock:n,crypto:s}=this,i=n.now();if(t.updatedAt.getTime()>i.getTime())return c(4);let o=t.ctr+1,[r,l]=await nn({now:i,eid:t.eid,ctr:o,bod:e,crypto:s});if(l!==0)return c(l);return m({head:r,body:e})}async updateWithSkew(t,e,n){if(n===!1)return c(4);let{clock:s,crypto:i}=this,o=s.now(),r=new M(t.eid),[l,a]=r.readStruct(A);if(a!==0)return c(a);let d=t.updatedAt.getTime()-l.ts.getTime(),u={eid:t.eid,off:d+1,ctr:t.ctr+1,len:0},h=(await this.apply([{head:u,body:void 0}]))[0];if(h!==0&&h!==15)return c(h??12);if(e===void 0)return m(u);let[y,Z]=re({id:l.id,ts:o});if(Z!==0)return c(Z);let[b,G]=await nn({now:o,eid:y,ctr:0,bod:e,crypto:i});if(G!==0)return c(G);let X=(await this.apply([{head:b,body:e}]))[0];if(X!==0&&X!==15)return c(X??12);return m(b)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault){if(t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n);return this.enqueueApplyJob(async()=>{let[s,i]=await this.makeUpdate(t,e);if(i!==0)return c(i);let r=(await this.doApply([s]))[0];if(r!==0&&r!==15)return c(r??12);return m(s.head)})}async insert(t){let{body:e,type:n,gid:s,pid:i,tags:o}=t,l=Nt({body:e,type:n,gid:s,pid:i,tags:o});return this.insertRaw(l)}async update(t){let{prior:e,body:n,type:s,gid:i,pid:o,tags:r,force:l}=t,d=Nt({body:n,type:s,gid:i,pid:o,tags:r});return this.updateRaw(e,d,l??this.forceSkewHandlingByDefault)}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 ys(e.head);let n=new M(t),[s,i]=n.readStruct(A);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 re({id:t,ts:s});let i=await n.genRandomBytes(8);return re({id:i,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;await this.drainApplyQueue();for(let[i,o]of t){let r=await n.hosts.get(i);if(!r)continue;let l={conn:o,store:n,enclave:s,host:r,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},a=await fs(l);if(a!==0)return console.error(`Failed to peek: ${a}`),this.emitProgress({phase:"idle"}),a;this.xferState.emit();let d=await Di(l);if(d!==0)return console.error(`Failed to push: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Is(l,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 le(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,o=await i.seed.load();if(!o)return c(22);let r=await i.hosts.get(t);if(!r)return c(13);let l=n.get(t);if(!l||!l.isConnected()){if(await this.connectToHost(r,!1,!1),r=await i.hosts.get(t),!r)return c(13);l=n.get(t)}if(!l)return c(12);let a={conn:l,store:i,enclave:o,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[d,u]=await Ss({...a,host:r},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 h=await i.hosts.get(t);if(!h)return c(13);let[y,Z]=await Ss({...a,host:h},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),Z!==0)return c(Z);if(!y)return c(12);return m(y)}async repull(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;let i=Array.from(await n.hosts.list());if(i.length<1)return 0;for(let o of i){let r=t.get(o.label);if(!r||!r.isConnected())await this.connectToHost(o,!1,!1)}for(let[o,r]of t){let l=await n.hosts.get(o);if(!l)continue;let a={conn:r,store:n,enclave:s,host:{...l,lastSeq:0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},d=await fs(a);if(d!==0)return console.error(`rebuild: failed to peek: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await Is(a);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=ue(e,(o)=>o.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let i=0;while(i<n.length){let o=0,r=0,l=i;for(let d=i;d<n.length&&r<100&&o<102400;d++)o+=n[d].head.len,r++,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:o}=this;if(s)await o.hosts.wipe(),await o.uploads.wipe(),await o.downloads.wipe();if(e)await o.messages.wipe();if(i)await o.seed.wipe();if(n)await this.state.clear();this.lastProgress=Et,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n,store:s}=this,i=e?.onProgress,o=await s.seed.load();if(!o)return 22;console.time("import: decoding file...");let r=await t.bytes(),[l,a]=await en.decodeFile(r,n,o);if(a!==0)return a;console.timeEnd("import: decoding file...");let d=0;while(d<l.length){let u=0,p=0,h=d;for(let b=d;b<l.length&&p<100&&u<102400;b++)u+=l[b].head.len,p++,h=b+1;let y=l.slice(d,h);console.time(`import: applying [${d}, ${h}]`);let Z=await this.apply(y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${d}, ${h}]`);for(let b=0;b<y.length;b++){let G=Z[b];if(G!==0&&G!==15)console.warn(`failed to import msg ${d+b}: ${g[G]}`)}if(i)queueMicrotask(()=>i(h,l.length,0));this.emitProgress({phase:"import",done:h,total:l.length}),d=h}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=await e.seed.load();if(!n)return c(22);let s=await e.messages.list();return en.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 dn(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),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),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:o,store:r,transport:l}=this,a=i.get(t.label);if(a){if(a.isConnected())return;try{a.closeListener()}catch{}i.delete(t.label)}let d=await r.seed.load();if(!d)return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new $e(d,o,t,s,l(t),(p)=>r.hosts.set(t.label,p));if(await u.register(),e)await u.listen(async(p)=>{let h={conn:u,store:r,enclave:d,host:t,crypto:o,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return ji(p,h,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(!await i.seed.load())return;await this.drainApplyQueue();let r=await i.hosts.list();for(let l of r)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()}}var vt=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function pn(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 j(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 Vs(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 Ai(t,e){j(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function gs(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var Vt=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));var cl=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!cl)throw Error("Non little-endian hardware is not supported");function al(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function mn(t){if(typeof t==="string")t=al(t);else if(Ws(t))t=hn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function qi(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function _i(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}var $i=(t,e)=>{function n(s,...i){if(j(s),t.nonceLength!==void 0){let u=i[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)j(u);else j(u,t.nonceLength)}let o=t.tagLength;if(o&&i[1]!==void 0)j(i[1]);let r=e(s,...i),l=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");j(p)}},a=!1;return{encrypt(u,p){if(a)throw Error("cannot encrypt() twice with same key + nonce");return a=!0,j(u),l(r.encrypt.length,p),r.encrypt(u,p)},decrypt(u,p){if(j(u),o&&u.length<o)throw Error("invalid ciphertext length: smaller than tagLength="+o);return l(r.decrypt.length,p),r.decrypt(u,p)}}}return Object.assign(n,t),n};function Ks(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&&!dl(e))throw Error("invalid output, must be aligned");return e}function dl(t){return t.byteOffset%4===0}function hn(t){return Uint8Array.from(t)}function Xt(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function ke(t=32){if(vt&&typeof vt.getRandomValues==="function")return vt.getRandomValues(new Uint8Array(t));if(vt&&typeof vt.randomBytes==="function")return vt.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var eo=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),ul=eo("expand 16-byte k"),pl=eo("expand 32-byte k"),ml=Vt(ul),hl=Vt(pl);function K(t,e){return t<<e|t>>>32-e}function xs(t){return t.byteOffset%4===0}var yn=64,yl=16,no=4294967295,to=new Uint32Array;function bl(t,e,n,s,i,o,r,l){let a=i.length,d=new Uint8Array(yn),u=Vt(d),p=xs(i)&&xs(o),h=p?Vt(i):to,y=p?Vt(o):to;for(let Z=0;Z<a;r++){if(t(e,n,s,u,r,l),r>=no)throw Error("arx: counter overflow");let b=Math.min(yn,a-Z);if(p&&b===yn){let G=Z/4;if(Z%4!==0)throw Error("arx: invalid block position");for(let S=0,X;S<yl;S++)X=G+S,y[X]=h[X]^u[S];Z+=yn;continue}for(let G=0,S;G<b;G++)S=Z+G,o[S]=i[S]^d[G];Z+=b}}function so(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:i,counterRight:o,rounds:r}=qi({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return pn(i),pn(r),gs(o),gs(n),(l,a,d,u,p=0)=>{j(l),j(a),j(d);let h=d.length;if(u===void 0)u=new Uint8Array(h);if(j(u),pn(p),p<0||p>=no)throw Error("arx: counter overflow");if(u.length<h)throw Error(`arx: output (${u.length}) is shorter than data (${h})`);let y=[],Z=l.length,b,G;if(Z===32)y.push(b=hn(l)),G=hl;else if(Z===16&&n)b=new Uint8Array(32),b.set(l),b.set(l,16),G=ml,y.push(b);else throw Error(`arx: invalid 32-byte key, got length=${Z}`);if(!xs(a))y.push(a=hn(a));let S=Vt(b);if(s){if(a.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(G,S,Vt(a.subarray(0,16)),S),a=a.subarray(16)}let X=16-i;if(X!==a.length)throw Error(`arx: nonce must be ${X} or 16 bytes`);if(X!==12){let f=new Uint8Array(12);f.set(a,o?0:12-a.length),a=f,y.push(a)}let W=Vt(a);return bl(t,G,S,W,d,u,p,r),Xt(...y),u}}var _=(t,e)=>t[e++]&255|(t[e++]&255)<<8;class io{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=mn(t),j(t,32);let e=_(t,0),n=_(t,2),s=_(t,4),i=_(t,6),o=_(t,8),r=_(t,10),l=_(t,12),a=_(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|o<<12)&255,this.r[5]=o>>>1&8190,this.r[6]=(o>>>14|r<<2)&8191,this.r[7]=(r>>>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]=_(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:i,r:o}=this,r=o[0],l=o[1],a=o[2],d=o[3],u=o[4],p=o[5],h=o[6],y=o[7],Z=o[8],b=o[9],G=_(t,e+0),S=_(t,e+2),X=_(t,e+4),W=_(t,e+6),f=_(t,e+8),V=_(t,e+10),C=_(t,e+12),H=_(t,e+14),k=i[0]+(G&8191),Y=i[1]+((G>>>13|S<<3)&8191),w=i[2]+((S>>>10|X<<6)&8191),z=i[3]+((X>>>7|W<<9)&8191),N=i[4]+((W>>>4|f<<12)&8191),I=i[5]+(f>>>1&8191),T=i[6]+((f>>>14|V<<2)&8191),P=i[7]+((V>>>11|C<<5)&8191),L=i[8]+((C>>>8|H<<8)&8191),E=i[9]+(H>>>5|s),x=0,O=x+k*r+Y*(5*b)+w*(5*Z)+z*(5*y)+N*(5*h);x=O>>>13,O&=8191,O+=I*(5*p)+T*(5*u)+P*(5*d)+L*(5*a)+E*(5*l),x+=O>>>13,O&=8191;let nt=x+k*l+Y*r+w*(5*b)+z*(5*Z)+N*(5*y);x=nt>>>13,nt&=8191,nt+=I*(5*h)+T*(5*p)+P*(5*u)+L*(5*d)+E*(5*a),x+=nt>>>13,nt&=8191;let ct=x+k*a+Y*l+w*r+z*(5*b)+N*(5*Z);x=ct>>>13,ct&=8191,ct+=I*(5*y)+T*(5*h)+P*(5*p)+L*(5*u)+E*(5*d),x+=ct>>>13,ct&=8191;let Q=x+k*d+Y*a+w*l+z*r+N*(5*b);x=Q>>>13,Q&=8191,Q+=I*(5*Z)+T*(5*y)+P*(5*h)+L*(5*p)+E*(5*u),x+=Q>>>13,Q&=8191;let St=x+k*u+Y*d+w*a+z*l+N*r;x=St>>>13,St&=8191,St+=I*(5*b)+T*(5*Z)+P*(5*y)+L*(5*h)+E*(5*p),x+=St>>>13,St&=8191;let _t=x+k*p+Y*u+w*d+z*a+N*l;x=_t>>>13,_t&=8191,_t+=I*r+T*(5*b)+P*(5*Z)+L*(5*y)+E*(5*h),x+=_t>>>13,_t&=8191;let $t=x+k*h+Y*p+w*u+z*d+N*a;x=$t>>>13,$t&=8191,$t+=I*l+T*r+P*(5*b)+L*(5*Z)+E*(5*y),x+=$t>>>13,$t&=8191;let te=x+k*y+Y*h+w*p+z*u+N*d;x=te>>>13,te&=8191,te+=I*a+T*l+P*r+L*(5*b)+E*(5*Z),x+=te>>>13,te&=8191;let ee=x+k*Z+Y*y+w*h+z*p+N*u;x=ee>>>13,ee&=8191,ee+=I*d+T*a+P*l+L*r+E*(5*b),x+=ee>>>13,ee&=8191;let ne=x+k*b+Y*Z+w*y+z*h+N*p;x=ne>>>13,ne&=8191,ne+=I*u+T*d+P*a+L*l+E*r,x+=ne>>>13,ne&=8191,x=(x<<2)+x|0,x=x+O|0,O=x&8191,x=x>>>13,nt+=x,i[0]=O,i[1]=nt,i[2]=ct,i[3]=Q,i[4]=St,i[5]=_t,i[6]=$t,i[7]=te,i[8]=ee,i[9]=ne}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let r=2;r<10;r++)t[r]+=s,s=t[r]>>>13,t[r]&=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 r=1;r<10;r++)n[r]=t[r]+s,s=n[r]>>>13,n[r]&=8191;n[9]-=8192;let i=(s^1)-1;for(let r=0;r<10;r++)n[r]&=i;i=~i;for(let r=0;r<10;r++)t[r]=t[r]&i|n[r];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 r=1;r<8;r++)o=(t[r]+e[r]|0)+(o>>>16)|0,t[r]=o&65535;Xt(n)}update(t){Vs(this);let{buffer:e,blockLen:n}=this;t=mn(t);let s=t.length;for(let i=0;i<s;){let o=Math.min(n-this.pos,s-i);if(o===n){for(;n<=s-i;i+=n)this.process(t,i);continue}if(e.set(t.subarray(i,i+o),this.pos),this.pos+=o,i+=o,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){Xt(this.h,this.r,this.buffer,this.pad)}digestInto(t){Vs(this),Ai(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 o=0;o<8;o++)t[i++]=n[o]>>>0,t[i++]=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 Zl(t){let e=(s,i)=>t(i).update(mn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var Rs=Zl((t)=>new io(t));function Gl(t,e,n,s,i,o=20){let r=t[0],l=e[0],a=e[1],d=e[2],u=e[3],p=t[1],h=n[0],y=n[1],Z=i,b=0,G=t[2],S=e[4],X=e[5],W=e[6],f=e[7],V=t[3],C=r,H=l,k=a,Y=d,w=u,z=p,N=h,I=y,T=Z,P=b,L=G,E=S,x=X,O=W,nt=f,ct=V;for(let St=0;St<o;St+=2)w^=K(C+x|0,7),T^=K(w+C|0,9),x^=K(T+w|0,13),C^=K(x+T|0,18),P^=K(z+H|0,7),O^=K(P+z|0,9),H^=K(O+P|0,13),z^=K(H+O|0,18),nt^=K(L+N|0,7),k^=K(nt+L|0,9),N^=K(k+nt|0,13),L^=K(N+k|0,18),Y^=K(ct+E|0,7),I^=K(Y+ct|0,9),E^=K(I+Y|0,13),ct^=K(E+I|0,18),H^=K(C+Y|0,7),k^=K(H+C|0,9),Y^=K(k+H|0,13),C^=K(Y+k|0,18),N^=K(z+w|0,7),I^=K(N+z|0,9),w^=K(I+N|0,13),z^=K(w+I|0,18),E^=K(L+P|0,7),T^=K(E+L|0,9),P^=K(T+E|0,13),L^=K(P+T|0,18),x^=K(ct+nt|0,7),O^=K(x+ct|0,9),nt^=K(O+x|0,13),ct^=K(nt+O|0,18);let Q=0;s[Q++]=r+C|0,s[Q++]=l+H|0,s[Q++]=a+k|0,s[Q++]=d+Y|0,s[Q++]=u+w|0,s[Q++]=p+z|0,s[Q++]=h+N|0,s[Q++]=y+I|0,s[Q++]=Z+T|0,s[Q++]=b+P|0,s[Q++]=G+L|0,s[Q++]=S+E|0,s[Q++]=X+x|0,s[Q++]=W+O|0,s[Q++]=f+nt|0,s[Q++]=V+ct|0}function Xl(t,e,n,s){let i=t[0],o=e[0],r=e[1],l=e[2],a=e[3],d=t[1],u=n[0],p=n[1],h=n[2],y=n[3],Z=t[2],b=e[4],G=e[5],S=e[6],X=e[7],W=t[3];for(let V=0;V<20;V+=2)a^=K(i+G|0,7),h^=K(a+i|0,9),G^=K(h+a|0,13),i^=K(G+h|0,18),y^=K(d+o|0,7),S^=K(y+d|0,9),o^=K(S+y|0,13),d^=K(o+S|0,18),X^=K(Z+u|0,7),r^=K(X+Z|0,9),u^=K(r+X|0,13),Z^=K(u+r|0,18),l^=K(W+b|0,7),p^=K(l+W|0,9),b^=K(p+l|0,13),W^=K(b+p|0,18),o^=K(i+l|0,7),r^=K(o+i|0,9),l^=K(r+o|0,13),i^=K(l+r|0,18),u^=K(d+a|0,7),p^=K(u+d|0,9),a^=K(p+u|0,13),d^=K(a+p|0,18),b^=K(Z+y|0,7),h^=K(b+Z|0,9),y^=K(h+b|0,13),Z^=K(y+h|0,18),G^=K(W+X|0,7),S^=K(G+W|0,9),X^=K(S+G|0,13),W^=K(X+S|0,18);let f=0;s[f++]=i,s[f++]=d,s[f++]=Z,s[f++]=W,s[f++]=u,s[f++]=p,s[f++]=h,s[f++]=y}var Cs=so(Gl,{counterRight:!0,extendNonceFn:Xl}),Ts=$i({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=Ks(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32);s.set(n,32),Xt(i),Cs(t,e,s,s);let r=Rs(o,i);return s.set(r,16),Xt(s.subarray(0,16),r),s.subarray(16)},decrypt(n,s){j(n),s=Ks(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32,48),r=s.subarray(48);s.set(n,32),Xt(i);let l=Cs(t,e,i,i),a=Rs(r,l);if(!_i(o,a))throw Error("invalid tag");return Cs(t,e,s.subarray(16),s.subarray(16)),Xt(i,o,a),r}}));/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function fl(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function Le(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Qt(t,...e){if(!fl(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 Me(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 bn(t,e){Qt(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function oo(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function ye(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function be(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function Pe(t,e){return t<<32-e|t>>>e}var ro=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function lo(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}var co=ro?(t)=>t:(t)=>lo(t);function Il(t){for(let e=0;e<t.length;e++)t[e]=lo(t[e]);return t}var it=ro?(t)=>t:Il;function Sl(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Ze(t){if(typeof t==="string")t=Sl(t);return Qt(t),t}class Hs{}function ao(t){let e=(s,i)=>t(i).update(Ze(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var uo=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var Zn=BigInt(4294967295),po=BigInt(32);function Ys(t,e=!1){if(e)return{h:Number(t&Zn),l:Number(t>>po&Zn)};return{h:Number(t>>po&Zn)|0,l:Number(t&Zn)|0}}function gt(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,16),n=n+s|0,e=Pe(e^n,12),{a:t,b:e,c:n,d:s}}function Kt(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,8),n=n+s|0,e=Pe(e^n,7),{a:t,b:e,c:n,d:s}}class ks extends Hs{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,Le(t),Le(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=ye(this.buffer)}update(t){Me(this),t=Ze(t),Qt(t);let{blockLen:e,buffer:n,buffer32:s}=this,i=t.length,o=t.byteOffset,r=t.buffer;for(let l=0;l<i;){if(this.pos===e)it(s),this.compress(s,0,!1),it(s),this.pos=0;let a=Math.min(e-this.pos,i-l),d=o+l;if(a===e&&!(d%4)&&l+a<i){let u=new Uint32Array(r,d,Math.floor((i-l)/4));it(u);for(let p=0;l+e<i;p+=s.length,l+=e)this.length+=e,this.compress(u,p,!1);it(u);continue}n.set(t.subarray(l,l+a),this.pos),this.pos+=a,this.length+=a,l+=a}return this}digestInto(t){Me(this),bn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,be(this.buffer.subarray(e)),it(n),this.compress(n,0,!0),it(n);let s=ye(t);this.get().forEach((i,o)=>s[o]=co(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:o,pos:r}=this;return t||(t=new this.constructor({dkLen:o})),t.set(...this.get()),t.buffer.set(e),t.destroyed=i,t.finished=s,t.length=n,t.pos=r,t.outputLen=o,t}clone(){return this._cloneInto()}}function Ls(t,e,n,s,i,o,r,l,a,d,u,p,h,y,Z,b,G,S,X,W){let f=0;for(let V=0;V<s;V++)({a:i,b:a,c:h,d:G}=gt(i,a,h,G,n[e+t[f++]])),{a:i,b:a,c:h,d:G}=Kt(i,a,h,G,n[e+t[f++]]),{a:o,b:d,c:y,d:S}=gt(o,d,y,S,n[e+t[f++]]),{a:o,b:d,c:y,d:S}=Kt(o,d,y,S,n[e+t[f++]]),{a:r,b:u,c:Z,d:X}=gt(r,u,Z,X,n[e+t[f++]]),{a:r,b:u,c:Z,d:X}=Kt(r,u,Z,X,n[e+t[f++]]),{a:l,b:p,c:b,d:W}=gt(l,p,b,W,n[e+t[f++]]),{a:l,b:p,c:b,d:W}=Kt(l,p,b,W,n[e+t[f++]]),{a:i,b:d,c:Z,d:W}=gt(i,d,Z,W,n[e+t[f++]]),{a:i,b:d,c:Z,d:W}=Kt(i,d,Z,W,n[e+t[f++]]),{a:o,b:u,c:b,d:G}=gt(o,u,b,G,n[e+t[f++]]),{a:o,b:u,c:b,d:G}=Kt(o,u,b,G,n[e+t[f++]]),{a:r,b:p,c:h,d:S}=gt(r,p,h,S,n[e+t[f++]]),{a:r,b:p,c:h,d:S}=Kt(r,p,h,S,n[e+t[f++]]),{a:l,b:a,c:y,d:X}=gt(l,a,y,X,n[e+t[f++]]),{a:l,b:a,c:y,d:X}=Kt(l,a,y,X,n[e+t[f++]]);return{v0:i,v1:o,v2:r,v3:l,v4:a,v5:d,v6:u,v7:p,v8:h,v9:y,v10:Z,v11:b,v12:G,v13:S,v14:X,v15:W}}var ft={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},xt=uo.slice(),mo=(()=>{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)})();class Ms extends ks{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 o=Ze(n).slice();Qt(o,32),this.IV=ye(o),it(this.IV),this.flags=e|ft.KEYED_HASH}else if(i){let o=Ze(s),r=new Ms({dkLen:32},ft.DERIVE_KEY_CONTEXT).update(o).digest();this.IV=ye(r),it(this.IV),this.flags=e|ft.DERIVE_KEY_MATERIAL}else this.IV=xt.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=oo(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:i,pos:o}=this,{h:r,l}=Ys(BigInt(t),!0),{v0:a,v1:d,v2:u,v3:p,v4:h,v5:y,v6:Z,v7:b,v8:G,v9:S,v10:X,v11:W,v12:f,v13:V,v14:C,v15:H}=Ls(mo,s,n,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],xt[0],xt[1],xt[2],xt[3],r,l,o,e);i[0]=a^G,i[1]=d^S,i[2]=u^X,i[3]=p^W,i[4]=h^f,i[5]=y^V,i[6]=Z^C,i[7]=b^H}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=ft.CHUNK_START;if(this.chunkPos===15||n)s|=ft.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 o,r=this.chunksDone+1;n||!(r&1);r>>=1){if(!(o=this.stack.pop()))break;this.buffer32.set(o,0),this.buffer32.set(i,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|ft.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:o,chunkOut:r,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=o,t.chunkOut=r,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,be(this.state,this.buffer32,this.IV,this.bufferOut32),be(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:i}=this,{h:o,l:r}=Ys(BigInt(this.chunkOut++));it(s);let{v0:l,v1:a,v2:d,v3:u,v4:p,v5:h,v6:y,v7:Z,v8:b,v9:G,v10:S,v11:X,v12:W,v13:f,v14:V,v15:C}=Ls(mo,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],xt[0],xt[1],xt[2],xt[3],r,o,e,n);i[0]=l^b,i[1]=a^G,i[2]=d^S,i[3]=u^X,i[4]=p^W,i[5]=h^f,i[6]=y^V,i[7]=Z^C,i[8]=t[0]^b,i[9]=t[1]^G,i[10]=t[2]^S,i[11]=t[3]^X,i[12]=t[4]^W,i[13]=t[5]^f,i[14]=t[6]^V,i[15]=t[7]^C,it(s),it(i),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,be(this.buffer.subarray(this.pos));let t=this.flags|ft.ROOT;if(this.stack.length)t|=ft.PARENT,it(this.buffer32),this.compress(this.buffer32,0,!0),it(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?ft.CHUNK_START:0)|ft.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){Me(this,!1),Qt(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 o=Math.min(e-this.posOut,i-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 Le(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(bn(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))}}var ho=ao((t)=>new Ms(t));var Wl=32,eb=Symbol("X25519Sk");function yo(t){if(t.byteLength!==Wl)return c(10);return m(t)}var J=(1n<<255n)-19n,Vl=121665n,bo=new Uint8Array(32);bo[0]=9;function Zo(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function gl(t){let e=new Uint8Array(32),n=(t%J+J)%J;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function Kl(t){let e=t.slice();return e[31]&=127,Zo(e)}function xl(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function Gn(t,e,n){let s=-t,i=(e^n)&s;return[e^i,n^i]}function Rl(t){let e=J-2n,n=(t%J+J)%J,s=1n;while(e>0n){if(e&1n)s=s*n%J;n=n*n%J,e>>=1n}return s}function Ps(t,e){let n=xl(t),s=Kl(e),i=1n,o=0n,r=s,l=1n,a=0n,d=Zo(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;a^=p,[i,r]=Gn(a,i,r),[o,l]=Gn(a,o,l),a=p;let h=(i+o)%J,y=h*h%J,Z=(i-o+J)%J,b=Z*Z%J,G=(y-b+J)%J,S=(r+l)%J,W=(r-l+J)%J*h%J,f=S*Z%J,V=(W+f)%J,C=(W-f+J)%J;r=V*V%J,l=s*C*C%J,i=y*b%J,o=G*(y+Vl*G)%J}return[i,r]=Gn(a,i,r),[o,l]=Gn(a,o,l),n.fill(0),gl(i*Rl(o)%J)}function Go(t){return Ps(t,bo)}var Us=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Xo(t){let e=new Uint8Array(Us.length+32);return e.set(Us),e.set(t.subarray(0,32),Us.length),e}var ws=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);function fo(t){let e=new Uint8Array(ws.length+32);return e.set(ws),e.set(t.subarray(0,32),ws.length),e}function Io(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Rt(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}class Dt{verifyKeys=new Map;async genRandomBytes(t){return ke(t)}async gen256BitSecureRandomSeed(){return ke(32)}async encryptXSalsa20Poly1305Combined(t,e){let n=ke(24),i=Ts(e,n).encrypt(t);return new Uint8Array([...n,...i])}async decryptXSalsa20Poly1305Combined(t,e){let n=t.slice(0,24),s=t.slice(24);return Ts(e,n).decrypt(s)}async deriveEd25519KeyPair(t){let e=t,n=Xo(e),s=Rt(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 o=i.x;i.d=void 0;let r=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:o},{name:"Ed25519"},!0,["verify"]),l=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",r));this.verifyKeys.set(at(l),r);let a=new Uint8Array(64);return a.set(e,0),a.set(l,32),{keyType:"ed25519",privateKey:a,publicKey:l}}async importSignKey(t){let e=t.subarray(0,32),n=Xo(e),s=Rt(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async importVerifyKey(t){let e=at(t),n=this.verifyKeys.get(e);if(n)return n;let s=await globalThis.crypto.subtle.importKey("raw",Rt(t),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(e,s),s}async signEd25519(t,e){let n=Io(t),s=await this.importSignKey(e),i=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Rt(n));return new Uint8Array(i)}async checkSigEd25519(t,e,n){let s=Io(e);try{let i=await this.importVerifyKey(n);return await globalThis.crypto.subtle.verify({name:"Ed25519"},i,Rt(t),Rt(s))}catch{return!1}}async blake3(t){return ho(t)}async genX25519(){let t=await ke(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=yo(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=Go(e),i=fo(e),o=Rt(i);try{let r=await globalThis.crypto.subtle.importKey("pkcs8",o,{name:"X25519"},!0,["deriveBits"]),l=await globalThis.crypto.subtle.exportKey("jwk",r);if(typeof l.x!=="string")throw Error("X25519 JWK missing x");let a=On(l.x);if(l.d=void 0,!B(a,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(r){throw e.fill(0),r}finally{i.fill(0),new Uint8Array(o).fill(0)}}async x25519Shared(t,e){let n=fo(t),s=Rt(n);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),o=await globalThis.crypto.subtle.importKey("raw",Rt(e),{name:"X25519"},!1,[]),r=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:o},i,256);return new Uint8Array(r)}catch{return Ps(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}}var Cl=new Dt,Ge=Cl;import{useEffect as Nn,useState as oi}from"react";class Bs{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(pt,"readwrite"),s=n.objectStore(pt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=`${r.host}:${r.seq}`;s.put(r,l)}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(pt,"readwrite"),i=s.objectStore(pt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=`${t}:${l}`;i.delete(a)}})}async list(){let e=this.db.transaction(pt,"readonly").objectStore(pt);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(pt,"readonly").objectStore(pt);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(pt,"readwrite"),e=t.objectStore(pt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}function So(t){return{label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:t.lastSeq||0,clockOffset:t.clockOffset,subscription:t.subscription}}function Tl(t,e){let n={...t};if(e.setLastSeq!==void 0)n.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0){let s=n.lastSeq||0;if(e.lastSeq>s)n.lastSeq=e.lastSeq}return delete n.numBags,delete n.numDupes,n}class Js{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);return this.put({...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0})}async put(t){let e={...t,handle:t.handle.toString(),lastSeq:t.lastSeq??0},n=this.db.transaction(ot,"readwrite"),s=n.objectStore(ot);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e)})}async touch(t,e){return this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.db.transaction(ot,"readwrite"),s=n.objectStore(ot);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);let r=s.get(t);r.onsuccess=()=>{let l=r.result;if(!l)return;s.put(Tl(l,e))}})}async get(t){let n=this.db.transaction(ot,"readonly").objectStore(ot);return new Promise((s,i)=>{let o=n.get(t);o.onsuccess=()=>{let r=o.result;if(!r)s(void 0);else s(So(r))},o.onerror=()=>i(o.error)})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put({...n,...e}),0}catch{return 18}}async del(t){let e=this.db.transaction(ot,"readwrite"),n=e.objectStore(ot);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}async list(){let e=this.db.transaction(ot,"readonly").objectStore(ot);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>{let o=i.result;n(o.map(So))},i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(ot,"readwrite"),e=t.objectStore(ot);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}class Ns{crypto;db;constructor(t,e){this.crypto=e;this.db=t}async add(t){let e=this.db.transaction(v,"readwrite"),n=e.objectStore(v);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 o=0;o<i.length;o++)i[o]=18;s(i)};for(let o=0;o<t.length;o++){let{key:r,data:l}=t[o],a=R(r),d=n.put(l,a);d.onerror=(u)=>{u.preventDefault(),i[o]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=R(r);s.delete(l)}})}async get(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o=R(t),r=n.get(o);r.onsuccess=async()=>{let l=r.result;if(l)s(await wt(t,l,this.crypto));else s(void 0)},r.onerror=()=>i(r.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(v,"readonly").objectStore(v);return new Promise((o,r)=>{let l=[],a=e===void 0?i.openCursor():i.index(Ue).openCursor(IDBKeyRange.only(e));a.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,h=u.value;l.push({hash:et(p),data:h}),u.continue()}else Promise.all(l.map(({hash:p,data:h})=>wt(p,h,this.crypto,{body:n}))).then(o).catch(r)},a.onerror=()=>r(a.error)})}async count(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o=t===void 0?n.count():n.index(Ue).count(IDBKeyRange.only(t));o.onsuccess=()=>s(o.result),o.onerror=()=>i(o.error)})}async listKeys(){let e=this.db.transaction(v,"readonly").objectStore(v);return new Promise((n,s)=>{let i=[],o=e.openKeyCursor();o.onsuccess=(r)=>{let l=r.target.result;if(l)i.push(et(l.key)),l.continue();else n(i)},o.onerror=()=>s(o.error)})}async last(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o,r=n.openCursor();r.onsuccess=async(l)=>{let a=l.target.result;if(a){let{key:d,value:u}=a;if(B(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=et(o.key);s(await wt(d,o.data,this.crypto))}else s(void 0)},r.onerror=()=>i(r.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=R(r),a=s.get(l);a.onsuccess=()=>{let d=a.result;if(!d)return;Ft(d,Ut),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(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let{key:r,err:l}of e){let a=R(r),d=s.get(a);d.onsuccess=()=>{let u=d.result;if(!u)return;Ft(u,Gt,l),s.put(u,a)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(v,"readwrite"),e=t.objectStore(v);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var Xn={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[o,r]=t.readVarInt();if(r!==0)return c(r);return m({handle:e,label:s,idx:o})}};var zs={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(Xn,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[o,r]=t.readStruct(Xn);if(r!==0)return c(r);if(o===void 0)return c(14);s.push(o)}return m({hosts:s})}};var Hl=new TextEncoder().encode("diplomatic.qrpair.v1"),we=32,Yl=we+24+16,kl=32,Nb=Symbol("DHKEReq"),zb=Symbol("DHKEResp");function Es(t){if(t.byteLength!==we)return c(10);return m(t)}function Fs(t){if(t.byteLength<Yl)return c(10);return m(t)}var fn=new Dt;async function vs(t,e,n,s){let i;try{i=await fn.x25519Shared(t,e)}catch{return c(29)}try{if(i.byteLength!==we||i.every((l)=>l===0))return c(10);let o=Zt(i,Hl),r=Zt(o,Zt(n,s));try{let l=await fn.blake3(r);return m(l.slice(0,kl))}finally{o.fill(0),r.fill(0)}}finally{i.fill(0)}}class Be{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await fn.genX25519();t=e.priv;let[n,s]=Es(e.pub);if(s!==0)return c(s);if(n===void 0)return c(10);let i=new Be(t,n);return t=void 0,m(i)}catch{return c(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}get dhkeReq(){let[t,e]=Es(this.#e.slice());if(t===void 0)throw Error(`dhkeReq ${e}`);return t}async finish(t){let e=t.subarray(0,we),n=t.subarray(we),[s,i]=await vs(this.#t,e,this.#e,e);if(i!==0)return c(i);if(s===void 0)return c(12);let o;try{try{o=await fn.decryptXSalsa20Poly1305Combined(n,s)}catch{return c(20)}let[r,l]=tt.fromPairPlain(o);if(l!==0)return c(l);if(r===void 0)return c(12);return this.wipe(),m(r)}finally{s.fill(0),o?.fill(0)}}}function Ct(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}var Ot=32,In="DIPLOMATIC",It="public-key",Ll=-7,Ml=-8,Pl=-257,Sn=[{type:It,alg:Ll},{type:It,alg:Ml},{type:It,alg:Pl}];function go(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function Bt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function Wn(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function jt(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return c(9);return m(go(location.hostname))}var Ds="";function Ul(){return Ds}function Jt(t){if(t instanceof Error){Ds=t.message===""?t.name:`${t.name}: ${t.message}`;return}Ds=String(t)}function Vn(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function Wo(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function Xe(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function gn(t=2500){if(Wo())return Xe(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(i),document.removeEventListener("visibilitychange",s),Xe(),e()},s=()=>{if(Wo())n()},i=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function Kn(t){await gn();try{return await navigator.credentials.create(t)}catch(e){if(!Vn(e))throw e;return Xe(),await navigator.credentials.create(t)}}async function xn(t){await gn();try{return await navigator.credentials.get(t)}catch(e){if(!Vn(e))throw e;return Xe(),await navigator.credentials.get(t)}}function At(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function qt(t){if(t===null||t.type!==It||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return c(27);return m(t)}async function Rn(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 Os(t){if(t==="platform"||t==="cross-platform")return t;return}function Ko(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 js(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 o of s)if(typeof o==="string"&&o.length>0)i.push(o);return i.length===0?void 0:i}var wl=32,Bl=64,Qs=37,Vo=16;function xo(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<Qs+Vo)return;let o=i[wl];if(o===void 0||(o&Bl)===0)return;return i.slice(Qs,Qs+Vo)}function Jl(){return Rn("extension:largeBlob")}async function Ro(t){let e=At();if(e!==0)return c(e);let[n,s]=jt(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.userName??t?.rpName??n,o={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)o.authenticatorAttachment=t.authenticatorAttachment;let r={largeBlob:{support:"required"}},l;try{l=await Kn({publicKey:{challenge:Ct(Ot),rp:{id:n,name:t?.rpName??In},user:{id:Ct(16),name:i,displayName:i},pubKeyCredParams:Sn,authenticatorSelection:o,extensions:r,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Jt(p),c(30)}let[a,d]=qt(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 As(t,e,n,s){let i={challenge:Ct(Ot),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)i.hints=e.hints;if(n!==void 0)i.allowCredentials=[{type:It,id:Bt(n)}];if(s!==void 0)i.extensions=s;let o;try{o=await xn({publicKey:i})}catch(a){return Jt(a),c(30)}let[r,l]=qt(o);if(l!==0)return c(l);if(r===void 0)return c(27);return m(r)}async function Co(t,e){let n=At();if(n!==0)return c(n);let[s,i]=jt(e);if(i!==0)return c(i);if(s===void 0)return c(9);let o=t;if(o===void 0){let[p,h]=await As(s,e);if(h!==0&&e?.hints!==void 0)[p,h]=await As(s,{rpId:e.rpId,rpName:e.rpName});if(h!==0)return c(h);if(p===void 0)return c(27);o=new Uint8Array(p.rawId)}let[r,l]=await As(s,e,o,{largeBlob:{read:!0}});if(l!==0)return c(l);if(r===void 0)return c(27);let d=r.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return c(7);let u=Wn(d.blob);if(u.byteLength===0)return c(7);return m({blob:u,credId:new Uint8Array(r.rawId)})}var Cn=new TextEncoder().encode("diplomatic.prf.v1"),Je="diplomatic-prf";async function Nl(){return Rn("extension:prf")}var Tn="dmFyIGtlPTY0O3ZhciBSbj0zMix2ZT04O3ZhciBVdD0zMjt2YXIgTG49MzAwMDAsS249NTEyLFU7KChJKT0+e0lbSS5TdWNjZXNzPTBdPSJTdWNjZXNzIjtJW0kuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7SVtJLkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7SVtJLlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7SVtJLlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO0lbSS5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO0lbSS5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50IjtJW0kuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO0lbSS5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO0lbSS5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0IjtJW0kuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO0lbSS5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjtJW0kuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7SVtJLk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO0lbSS5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjtJW0kuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjtJW0kuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO0lbSS5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO0lbSS5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO0lbSS5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjtJW0kuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7SVtJLk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO0lbSS5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO0lbSS5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO0lbSS5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7SVtJLkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7SVtJLkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIjtJW0kuQ3J5cHRvRXJyb3I9MjldPSJDcnlwdG9FcnJvciI7SVtJLldlYkF1dGhuRXJyb3I9MzBdPSJXZWJBdXRobkVycm9yIn0pKFV8fD17fSk7ZnVuY3Rpb24gT24oZSl7aWYoIWV8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gZSl8fCEoImlkImluIGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5vcD09PSJzdHJpbmciJiZ0eXBlb2YgZS5pZD09PSJudW1iZXIifWZ1bmN0aW9uIFZuKGUpe2xldCB0PWUubGVuZ3RoLHI9MCxuPTA7d2hpbGUobjx0KXtsZXQgcz1lLmNoYXJDb2RlQXQobisrKTtpZigocyY0Mjk0OTY3MTY4KT09PTApe3IrKztjb250aW51ZX1lbHNlIGlmKChzJjQyOTQ5NjUyNDgpPT09MClyKz0yO2Vsc2V7aWYocz49NTUyOTYmJnM8PTU2MzE5KXtpZihuPHQpe2xldCBpPWUuY2hhckNvZGVBdChuKTtpZigoaSY2NDUxMik9PT01NjMyMCkrK24scz0oKHMmMTAyMyk8PDEwKSsoaSYxMDIzKSs2NTUzNn19aWYoKHMmNDI5NDkwMTc2MCk9PT0wKXIrPTM7ZWxzZSByKz00fX1yZXR1cm4gcn1mdW5jdGlvbiBIaShlLHQscil7bGV0IG49ZS5sZW5ndGgscz1yLGk9MDt3aGlsZShpPG4pe2xldCBvPWUuY2hhckNvZGVBdChpKyspO2lmKChvJjQyOTQ5NjcxNjgpPT09MCl7dFtzKytdPW87Y29udGludWV9ZWxzZSBpZigobyY0Mjk0OTY1MjQ4KT09PTApdFtzKytdPW8+PjYmMzF8MTkyO2Vsc2V7aWYobz49NTUyOTYmJm88PTU2MzE5KXtpZihpPG4pe2xldCBhPWUuY2hhckNvZGVBdChpKTtpZigoYSY2NDUxMik9PT01NjMyMCkrK2ksbz0oKG8mMTAyMyk8PDEwKSsoYSYxMDIzKSs2NTUzNn19aWYoKG8mNDI5NDkwMTc2MCk9PT0wKXRbcysrXT1vPj4xMiYxNXwyMjQsdFtzKytdPW8+PjYmNjN8MTI4O2Vsc2UgdFtzKytdPW8+PjE4Jjd8MjQwLHRbcysrXT1vPj4xMiY2M3wxMjgsdFtzKytdPW8+PjYmNjN8MTI4fXRbcysrXT1vJjYzfDEyOH19dmFyIE1pPW5ldyBUZXh0RW5jb2RlcixSaT01MDtmdW5jdGlvbiBMaShlLHQscil7TWkuZW5jb2RlSW50byhlLHQuc3ViYXJyYXkocikpfWZ1bmN0aW9uIF9uKGUsdCxyKXtpZihlLmxlbmd0aD5SaSlMaShlLHQscik7ZWxzZSBIaShlLHQscil9dmFyIEtpPTQwOTY7ZnVuY3Rpb24gU3IoZSx0LHIpe2xldCBuPXQscz1uK3IsaT1bXSxvPSIiO3doaWxlKG48cyl7bGV0IGE9ZVtuKytdO2lmKChhJjEyOCk9PT0wKWkucHVzaChhKTtlbHNlIGlmKChhJjIyNCk9PT0xOTIpe2xldCBkPWVbbisrXSY2MztpLnB1c2goKGEmMzEpPDw2fGQpfWVsc2UgaWYoKGEmMjQwKT09PTIyNCl7bGV0IGQ9ZVtuKytdJjYzLHU9ZVtuKytdJjYzO2kucHVzaCgoYSYzMSk8PDEyfGQ8PDZ8dSl9ZWxzZSBpZigoYSYyNDgpPT09MjQwKXtsZXQgZD1lW24rK10mNjMsdT1lW24rK10mNjMsbD1lW24rK10mNjMsZj0oYSY3KTw8MTh8ZDw8MTJ8dTw8NnxsO2lmKGY+NjU1MzUpZi09NjU1MzYsaS5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfGYmMTAyMztpLnB1c2goZil9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGg+PUtpKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSksaS5sZW5ndGg9MH1pZihpLmxlbmd0aD4wKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSk7cmV0dXJuIG99dmFyIE9pPW5ldyBUZXh0RGVjb2RlcixWaT0yMDA7ZnVuY3Rpb24gX2koZSx0LHIpe2xldCBuPWUuc3ViYXJyYXkodCx0K3IpO3JldHVybiBPaS5kZWNvZGUobil9ZnVuY3Rpb24gTm4oZSx0LHIpe2lmKHI+VmkpcmV0dXJuIF9pKGUsdCxyKTtlbHNlIHJldHVybiBTcihlLHQscil9Y2xhc3MgUWV7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIGVlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9T2JqZWN0LmNyZWF0ZShlZS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ZWUubmFtZX0pfX12YXIgWWU9NDI5NDk2NzI5NTtmdW5jdGlvbiBxbihlLHQscil7bGV0IG49ci80Mjk0OTY3Mjk2LHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBCdChlLHQscil7bGV0IG49TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBrdChlLHQpe2xldCByPWUuZ2V0SW50MzIodCksbj1lLmdldFVpbnQzMih0KzQpO3JldHVybiByKjQyOTQ5NjcyOTYrbn1mdW5jdGlvbiBGbihlLHQpe2xldCByPWUuZ2V0VWludDMyKHQpLG49ZS5nZXRVaW50MzIodCs0KTtyZXR1cm4gcio0Mjk0OTY3Mjk2K259dmFyIE5pPS0xLHFpPTQyOTQ5NjcyOTUsRmk9MTcxNzk4NjkxODM7ZnVuY3Rpb24gV2koe3NlYzplLG5zZWM6dH0pe2lmKGU+PTAmJnQ+PTAmJmU8PUZpKWlmKHQ9PT0wJiZlPD1xaSl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLmJ1ZmZlcikuc2V0VWludDMyKDAsZSkscn1lbHNle2xldCByPWUvNDI5NDk2NzI5NixuPWUmNDI5NDk2NzI5NSxzPW5ldyBVaW50OEFycmF5KDgpLGk9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtyZXR1cm4gaS5zZXRVaW50MzIoMCx0PDwyfHImMyksaS5zZXRVaW50MzIoNCxuKSxzfWVsc2V7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMTIpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyKTtyZXR1cm4gbi5zZXRVaW50MzIoMCx0KSxCdChuLDQsZSkscn19ZnVuY3Rpb24gemkoZSl7bGV0IHQ9ZS5nZXRUaW1lKCkscj1NYXRoLmZsb29yKHQvMTAwMCksbj0odC1yKjEwMDApKjFlNixzPU1hdGguZmxvb3Iobi8xZTkpO3JldHVybntzZWM6citzLG5zZWM6bi1zKjFlOX19ZnVuY3Rpb24gWGkoZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCB0PXppKGUpO3JldHVybiBXaSh0KX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIGppKGUpe2xldCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCByPXQuZ2V0VWludDMyKDApLG49MDtyZXR1cm57c2VjOnIsbnNlYzowfX1jYXNlIDg6e2xldCByPXQuZ2V0VWludDMyKDApLG49dC5nZXRVaW50MzIoNCkscz0ociYzKSo0Mjk0OTY3Mjk2K24saT1yPj4+MjtyZXR1cm57c2VjOnMsbnNlYzppfX1jYXNlIDEyOntsZXQgcj1rdCh0LDQpLG49dC5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpyLG5zZWM6bn19ZGVmYXVsdDp0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCBkYXRhIHNpemUgZm9yIHRpbWVzdGFtcCAoZXhwZWN0ZWQgNCwgOCwgb3IgMTIpOiAke2UubGVuZ3RofWApfX1mdW5jdGlvbiBHaShlKXtsZXQgdD1qaShlKTtyZXR1cm4gbmV3IERhdGUodC5zZWMqMTAwMCt0Lm5zZWMvMWU2KX12YXIgV249e3R5cGU6TmksZW5jb2RlOlhpLGRlY29kZTpHaX07Y2xhc3MgSmV7c3RhdGljIGRlZmF1bHRDb2RlYz1uZXcgSmU7X19icmFuZDtidWlsdEluRW5jb2RlcnM9W107YnVpbHRJbkRlY29kZXJzPVtdO2VuY29kZXJzPVtdO2RlY29kZXJzPVtdO2NvbnN0cnVjdG9yKCl7dGhpcy5yZWdpc3RlcihXbil9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6cn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09cjtlbHNle2xldCBuPS0xLWU7dGhpcy5idWlsdEluRW5jb2RlcnNbbl09dCx0aGlzLmJ1aWx0SW5EZWNvZGVyc1tuXT1yfX10cnlUb0VuY29kZShlLHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5idWlsdEluRW5jb2RlcnMubGVuZ3RoO3IrKyl7bGV0IG49dGhpcy5idWlsdEluRW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpe2xldCBpPS0xLXI7cmV0dXJuIG5ldyBRZShpLHMpfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuZW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpcmV0dXJuIG5ldyBRZShyLHMpfX1pZihlIGluc3RhbmNlb2YgUWUpcmV0dXJuIGU7cmV0dXJuIG51bGx9ZGVjb2RlKGUsdCxyKXtsZXQgbj10PDA/dGhpcy5idWlsdEluRGVjb2RlcnNbLTEtdF06dGhpcy5kZWNvZGVyc1t0XTtpZihuKXJldHVybiBuKGUsdCxyKTtlbHNlIHJldHVybiBuZXcgUWUodCxlKX19ZnVuY3Rpb24gJGkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyfWZ1bmN0aW9uIGR0KGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtlbHNlIGlmKCRpKGUpKXJldHVybiBuZXcgVWludDhBcnJheShlKTtlbHNlIHJldHVybiBVaW50OEFycmF5LmZyb20oZSl9dmFyIFFpPTEwMCxZaT0yMDQ4O2NsYXNzIHZ0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7bWF4RGVwdGg7aW5pdGlhbEJ1ZmZlclNpemU7c29ydEtleXM7Zm9yY2VGbG9hdDMyO2lnbm9yZVVuZGVmaW5lZDtmb3JjZUludGVnZXJUb0Zsb2F0O3Bvczt2aWV3O2J5dGVzO2VudGVyZWQ9ITE7Y29uc3RydWN0b3IoZSl7dGhpcy5leHRlbnNpb25Db2RlYz1lPy5leHRlbnNpb25Db2RlYz8/SmUuZGVmYXVsdENvZGVjLHRoaXMuY29udGV4dD1lPy5jb250ZXh0LHRoaXMudXNlQmlnSW50NjQ9ZT8udXNlQmlnSW50NjQ/PyExLHRoaXMubWF4RGVwdGg9ZT8ubWF4RGVwdGg/P1FpLHRoaXMuaW5pdGlhbEJ1ZmZlclNpemU9ZT8uaW5pdGlhbEJ1ZmZlclNpemU/P1lpLHRoaXMuc29ydEtleXM9ZT8uc29ydEtleXM/PyExLHRoaXMuZm9yY2VGbG9hdDMyPWU/LmZvcmNlRmxvYXQzMj8/ITEsdGhpcy5pZ25vcmVVbmRlZmluZWQ9ZT8uaWdub3JlVW5kZWZpbmVkPz8hMSx0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQ9ZT8uZm9yY2VJbnRlZ2VyVG9GbG9hdD8/ITEsdGhpcy5wb3M9MCx0aGlzLnZpZXc9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSksdGhpcy5ieXRlcz1uZXcgVWludDhBcnJheSh0aGlzLnZpZXcuYnVmZmVyKX1jbG9uZSgpe3JldHVybiBuZXcgdnQoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGVTaGFyZWRSZWYoZSk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnN1YmFycmF5KDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1lbmNvZGUoZSl7aWYodGhpcy5lbnRlcmVkKXJldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlKGUpO3RyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zbGljZSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9FbmNvZGUoZSx0KXtpZih0PnRoaXMubWF4RGVwdGgpdGhyb3cgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO2lmKGU9PW51bGwpdGhpcy5lbmNvZGVOaWwoKTtlbHNlIGlmKHR5cGVvZiBlPT09ImJvb2xlYW4iKXRoaXMuZW5jb2RlQm9vbGVhbihlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im51bWJlciIpaWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCl0aGlzLmVuY29kZU51bWJlcihlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIGlmKHR5cGVvZiBlPT09InN0cmluZyIpdGhpcy5lbmNvZGVTdHJpbmcoZSk7ZWxzZSBpZih0aGlzLnVzZUJpZ0ludDY0JiZ0eXBlb2YgZT09PSJiaWdpbnQiKXRoaXMuZW5jb2RlQmlnSW50NjQoZSk7ZWxzZSB0aGlzLmVuY29kZU9iamVjdChlLHQpfWVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKGUpe2xldCB0PXRoaXMucG9zK2U7aWYodGhpcy52aWV3LmJ5dGVMZW5ndGg8dCl0aGlzLnJlc2l6ZUJ1ZmZlcih0KjIpfXJlc2l6ZUJ1ZmZlcihlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZSkscj1uZXcgVWludDhBcnJheSh0KSxuPW5ldyBEYXRhVmlldyh0KTtyLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9bix0aGlzLmJ5dGVzPXJ9ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXtpZihlPT09ITEpdGhpcy53cml0ZVU4KDE5NCk7ZWxzZSB0aGlzLndyaXRlVTgoMTk1KX1lbmNvZGVOdW1iZXIoZSl7aWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCYmTnVtYmVyLmlzU2FmZUludGVnZXIoZSkpaWYoZT49MClpZihlPDEyOCl0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZSBpZihlPDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKTtlbHNlIGlmKCF0aGlzLnVzZUJpZ0ludDY0KXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSk7ZWxzZSB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk7ZWxzZSBpZihlPj0tMzIpdGhpcy53cml0ZVU4KDIyNHxlKzMyKTtlbHNlIGlmKGU+PS0xMjgpdGhpcy53cml0ZVU4KDIwOCksdGhpcy53cml0ZUk4KGUpO2Vsc2UgaWYoZT49LTMyNzY4KXRoaXMud3JpdGVVOCgyMDkpLHRoaXMud3JpdGVJMTYoZSk7ZWxzZSBpZihlPj0tMjE0NzQ4MzY0OCl0aGlzLndyaXRlVTgoMjEwKSx0aGlzLndyaXRlSTMyKGUpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUk2NChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe2lmKHRoaXMuZm9yY2VGbG9hdDMyKXRoaXMud3JpdGVVOCgyMDIpLHRoaXMud3JpdGVGMzIoZSk7ZWxzZSB0aGlzLndyaXRlVTgoMjAzKSx0aGlzLndyaXRlRjY0KGUpfWVuY29kZUJpZ0ludDY0KGUpe2lmKGU+PUJpZ0ludCgwKSl0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpO2Vsc2UgdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpfXdyaXRlU3RyaW5nSGVhZGVyKGUpe2lmKGU8MzIpdGhpcy53cml0ZVU4KDE2MCtlKTtlbHNlIGlmKGU8MjU2KXRoaXMud3JpdGVVOCgyMTcpLHRoaXMud3JpdGVVOChlKTtlbHNlIGlmKGU8NjU1MzYpdGhpcy53cml0ZVU4KDIxOCksdGhpcy53cml0ZVUxNihlKTtlbHNlIGlmKGU8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsb25nIHN0cmluZzogJHtlfSBieXRlcyBpbiBVVEYtOGApfWVuY29kZVN0cmluZyhlKXtsZXQgcj1WbihlKTt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDUrciksdGhpcy53cml0ZVN0cmluZ0hlYWRlcihyKSxfbihlLHRoaXMuYnl0ZXMsdGhpcy5wb3MpLHRoaXMucG9zKz1yfWVuY29kZU9iamVjdChlLHQpe2xldCByPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKHIhPW51bGwpdGhpcy5lbmNvZGVFeHRlbnNpb24ocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im9iamVjdCIpdGhpcy5lbmNvZGVNYXAoZSx0KTtlbHNlIHRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgb2JqZWN0OiAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZSl9YCl9ZW5jb2RlQmluYXJ5KGUpe2xldCB0PWUuYnl0ZUxlbmd0aDtpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk2KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgxOTcpLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDE5OCksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgYmluYXJ5OiAke3R9YCk7bGV0IHI9ZHQoZSk7dGhpcy53cml0ZVU4YShyKX1lbmNvZGVBcnJheShlLHQpe2xldCByPWUubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDE0NCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihyKTtlbHNlIGlmKHI8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIxKSx0aGlzLndyaXRlVTMyKHIpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtyfWApO2ZvcihsZXQgbiBvZiBlKXRoaXMuZG9FbmNvZGUobix0KzEpfWNvdW50V2l0aG91dFVuZGVmaW5lZChlLHQpe2xldCByPTA7Zm9yKGxldCBuIG9mIHQpaWYoZVtuXSE9PXZvaWQgMClyKys7cmV0dXJuIHJ9ZW5jb2RlTWFwKGUsdCl7bGV0IHI9T2JqZWN0LmtleXMoZSk7aWYodGhpcy5zb3J0S2V5cylyLnNvcnQoKTtsZXQgbj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLHIpOnIubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDEyOCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihuKTtlbHNlIGlmKG48NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIzKSx0aGlzLndyaXRlVTMyKG4pO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke259YCk7Zm9yKGxldCBzIG9mIHIpe2xldCBpPWVbc107aWYoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCYmaT09PXZvaWQgMCkpdGhpcy5lbmNvZGVTdHJpbmcocyksdGhpcy5kb0VuY29kZShpLHQrMSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZih0eXBlb2YgZS5kYXRhPT09ImZ1bmN0aW9uIil7bGV0IHI9ZS5kYXRhKHRoaXMucG9zKzYpLG49ci5sZW5ndGg7aWYobj49NDI5NDk2NzI5Nil0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGV4dGVuc2lvbiBvYmplY3Q6ICR7bn1gKTt0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEocik7cmV0dXJufWxldCB0PWUuZGF0YS5sZW5ndGg7aWYodD09PTEpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZih0PT09Mil0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKHQ9PT00KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYodD09PTgpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZih0PT09MTYpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwMSksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEoZS5kYXRhKX13cml0ZVU4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldFVpbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVOGEoZSl7bGV0IHQ9ZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSh0KSx0aGlzLmJ5dGVzLnNldChlLHRoaXMucG9zKSx0aGlzLnBvcys9dH13cml0ZUk4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldEludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVUxNihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRVaW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVJMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVVMzIoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0VWludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlSTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsZSksdGhpcy5wb3MrPTR9d3JpdGVGNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSx0aGlzLnZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZVU2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHFuKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUk2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLEJ0KHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19ZnVuY3Rpb24gTWUoZSx0KXtyZXR1cm4gbmV3IHZ0KHQpLmVuY29kZVNoYXJlZFJlZihlKX1mdW5jdGlvbiBEdChlKXtyZXR1cm5gJHtlPDA/Ii0iOiIifTB4JHtNYXRoLmFicyhlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWB9dmFyIEppPTE2LFppPTE2O2NsYXNzIGJye2hpdD0wO21pc3M9MDtjYWNoZXM7bWF4S2V5TGVuZ3RoO21heExlbmd0aFBlcktleTtjb25zdHJ1Y3RvcihlPUppLHQ9Wmkpe3RoaXMubWF4S2V5TGVuZ3RoPWUsdGhpcy5tYXhMZW5ndGhQZXJLZXk9dCx0aGlzLmNhY2hlcz1bXTtmb3IobGV0IHI9MDtyPHRoaXMubWF4S2V5TGVuZ3RoO3IrKyl0aGlzLmNhY2hlcy5wdXNoKFtdKX1jYW5CZUNhY2hlZChlKXtyZXR1cm4gZT4wJiZlPD10aGlzLm1heEtleUxlbmd0aH1maW5kKGUsdCxyKXtsZXQgbj10aGlzLmNhY2hlc1tyLTFdO2U6Zm9yKGxldCBzIG9mIG4pe2xldCBpPXMuYnl0ZXM7Zm9yKGxldCBvPTA7bzxyO28rKylpZihpW29dIT09ZVt0K29dKWNvbnRpbnVlIGU7cmV0dXJuIHMuc3RyfXJldHVybiBudWxsfXN0b3JlKGUsdCl7bGV0IHI9dGhpcy5jYWNoZXNbZS5sZW5ndGgtMV0sbj17Ynl0ZXM6ZSxzdHI6dH07aWYoci5sZW5ndGg+PXRoaXMubWF4TGVuZ3RoUGVyS2V5KXJbTWF0aC5yYW5kb20oKSpyLmxlbmd0aHwwXT1uO2Vsc2Ugci5wdXNoKG4pfWRlY29kZShlLHQscil7bGV0IG49dGhpcy5maW5kKGUsdCxyKTtpZihuIT1udWxsKXJldHVybiB0aGlzLmhpdCsrLG47dGhpcy5taXNzKys7bGV0IHM9U3IoZSx0LHIpLGk9VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLHQsdCtyKTtyZXR1cm4gdGhpcy5zdG9yZShpLHMpLHN9fXZhciB3cj0iYXJyYXkiLGx0PSJtYXBfa2V5IixYbj0ibWFwX3ZhbHVlIixlbz0oZSk9PntpZih0eXBlb2YgZT09PSJzdHJpbmcifHx0eXBlb2YgZT09PSJudW1iZXIiKXJldHVybiBlO3Rocm93IG5ldyBlZSgiVGhlIHR5cGUgb2Yga2V5IG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciBidXQgIit0eXBlb2YgZSl9O2NsYXNzIGpue3N0YWNrPVtdO3N0YWNrSGVhZFBvc2l0aW9uPS0xO2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5zdGFja0hlYWRQb3NpdGlvbisxfXRvcCgpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXB1c2hBcnJheVN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9d3IsdC5wb3NpdGlvbj0wLHQuc2l6ZT1lLHQuYXJyYXk9QXJyYXkoZSl9cHVzaE1hcFN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9bHQsdC5yZWFkQ291bnQ9MCx0LnNpemU9ZSx0Lm1hcD17fX1nZXRVbmluaXRpYWxpemVkU3RhdGVGcm9tUG9vbCgpe2lmKHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rKyx0aGlzLnN0YWNrSGVhZFBvc2l0aW9uPT09dGhpcy5zdGFjay5sZW5ndGgpe2xldCBlPXt0eXBlOnZvaWQgMCxzaXplOjAsYXJyYXk6dm9pZCAwLHBvc2l0aW9uOjAscmVhZENvdW50OjAsbWFwOnZvaWQgMCxrZXk6bnVsbH07dGhpcy5zdGFjay5wdXNoKGUpfXJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXJlbGVhc2UoZSl7aWYodGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXSE9PWUpdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhY2sgc3RhdGUuIFJlbGVhc2VkIHN0YXRlIGlzIG5vdCBvbiB0b3Agb2YgdGhlIHN0YWNrLiIpO2lmKGUudHlwZT09PXdyKXtsZXQgcj1lO3Iuc2l6ZT0wLHIuYXJyYXk9dm9pZCAwLHIucG9zaXRpb249MCxyLnR5cGU9dm9pZCAwfWlmKGUudHlwZT09PWx0fHxlLnR5cGU9PT1Ybil7bGV0IHI9ZTtyLnNpemU9MCxyLm1hcD12b2lkIDAsci5yZWFkQ291bnQ9MCxyLnR5cGU9dm9pZCAwfXRoaXMuc3RhY2tIZWFkUG9zaXRpb24tLX1yZXNldCgpe3RoaXMuc3RhY2subGVuZ3RoPTAsdGhpcy5zdGFja0hlYWRQb3NpdGlvbj0tMX19dmFyIHV0PS0xLElyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpLHRvPW5ldyBVaW50OEFycmF5KElyLmJ1ZmZlcik7dHJ5e0lyLmdldEludDgoMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIil9dmFyIHpuPVJhbmdlRXJyb3IoIkluc3VmZmljaWVudCBkYXRhIikscm89bmV3IGJyO2NsYXNzIEN0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7cmF3U3RyaW5nczttYXhTdHJMZW5ndGg7bWF4QmluTGVuZ3RoO21heEFycmF5TGVuZ3RoO21heE1hcExlbmd0aDttYXhFeHRMZW5ndGg7a2V5RGVjb2RlcjttYXBLZXlDb252ZXJ0ZXI7dG90YWxQb3M9MDtwb3M9MDt2aWV3PUlyO2J5dGVzPXRvO2hlYWRCeXRlPXV0O3N0YWNrPW5ldyBqbjtlbnRlcmVkPSExO2NvbnN0cnVjdG9yKGUpe3RoaXMuZXh0ZW5zaW9uQ29kZWM9ZT8uZXh0ZW5zaW9uQ29kZWM/P0plLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLnJhd1N0cmluZ3M9ZT8ucmF3U3RyaW5ncz8/ITEsdGhpcy5tYXhTdHJMZW5ndGg9ZT8ubWF4U3RyTGVuZ3RoPz9ZZSx0aGlzLm1heEJpbkxlbmd0aD1lPy5tYXhCaW5MZW5ndGg/P1llLHRoaXMubWF4QXJyYXlMZW5ndGg9ZT8ubWF4QXJyYXlMZW5ndGg/P1llLHRoaXMubWF4TWFwTGVuZ3RoPWU/Lm1heE1hcExlbmd0aD8/WWUsdGhpcy5tYXhFeHRMZW5ndGg9ZT8ubWF4RXh0TGVuZ3RoPz9ZZSx0aGlzLmtleURlY29kZXI9ZT8ua2V5RGVjb2RlciE9PXZvaWQgMD9lLmtleURlY29kZXI6cm8sdGhpcy5tYXBLZXlDb252ZXJ0ZXI9ZT8ubWFwS2V5Q29udmVydGVyPz9lb31jbG9uZSgpe3JldHVybiBuZXcgQ3Qoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxyYXdTdHJpbmdzOnRoaXMucmF3U3RyaW5ncyxtYXhTdHJMZW5ndGg6dGhpcy5tYXhTdHJMZW5ndGgsbWF4QmluTGVuZ3RoOnRoaXMubWF4QmluTGVuZ3RoLG1heEFycmF5TGVuZ3RoOnRoaXMubWF4QXJyYXlMZW5ndGgsbWF4TWFwTGVuZ3RoOnRoaXMubWF4TWFwTGVuZ3RoLG1heEV4dExlbmd0aDp0aGlzLm1heEV4dExlbmd0aCxrZXlEZWNvZGVyOnRoaXMua2V5RGVjb2Rlcn0pfXJlaW5pdGlhbGl6ZVN0YXRlKCl7dGhpcy50b3RhbFBvcz0wLHRoaXMuaGVhZEJ5dGU9dXQsdGhpcy5zdGFjay5yZXNldCgpfXNldEJ1ZmZlcihlKXtsZXQgdD1kdChlKTt0aGlzLmJ5dGVzPXQsdGhpcy52aWV3PW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wfWFwcGVuZEJ1ZmZlcihlKXtpZih0aGlzLmhlYWRCeXRlPT09dXQmJiF0aGlzLmhhc1JlbWFpbmluZygxKSl0aGlzLnNldEJ1ZmZlcihlKTtlbHNle2xldCB0PXRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpLHI9ZHQoZSksbj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtyLmxlbmd0aCk7bi5zZXQodCksbi5zZXQocix0Lmxlbmd0aCksdGhpcy5zZXRCdWZmZXIobil9fWhhc1JlbWFpbmluZyhlKXtyZXR1cm4gdGhpcy52aWV3LmJ5dGVMZW5ndGgtdGhpcy5wb3M+PWV9Y3JlYXRlRXh0cmFCeXRlRXJyb3IoZSl7bGV0e3ZpZXc6dCxwb3M6cn09dGhpcztyZXR1cm4gUmFuZ2VFcnJvcihgRXh0cmEgJHt0LmJ5dGVMZW5ndGgtcn0gb2YgJHt0LmJ5dGVMZW5ndGh9IGJ5dGUocykgZm91bmQgYXQgYnVmZmVyWyR7ZX1dYCl9ZGVjb2RlKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZShlKTt0cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcihlKTtsZXQgdD10aGlzLmRvRGVjb2RlU3luYygpO2lmKHRoaXMuaGFzUmVtYWluaW5nKDEpKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX0qZGVjb2RlTXVsdGkoZSl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGkoZSk7cmV0dXJufXRyeXt0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuc2V0QnVmZmVyKGUpO3doaWxlKHRoaXMuaGFzUmVtYWluaW5nKDEpKXlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWFzeW5jIGRlY29kZUFzeW5jKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZUFzeW5jKGUpO3RyeXt0aGlzLmVudGVyZWQ9ITA7bGV0IHQ9ITEscjtmb3IgYXdhaXQobGV0IG8gb2YgZSl7aWYodCl0aHJvdyB0aGlzLmVudGVyZWQ9ITEsdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTt0aGlzLmFwcGVuZEJ1ZmZlcihvKTt0cnl7cj10aGlzLmRvRGVjb2RlU3luYygpLHQ9ITB9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgYX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc31pZih0KXtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpO3JldHVybiByfWxldHtoZWFkQnl0ZTpuLHBvczpzLHRvdGFsUG9zOml9PXRoaXM7dGhyb3cgUmFuZ2VFcnJvcihgSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAke0R0KG4pfSBhdCAke2l9ICgke3N9IGluIHRoZSBjdXJyZW50IGJ1ZmZlcilgKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZGVjb2RlQXJyYXlTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCEwKX1kZWNvZGVTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCExKX1hc3luYypkZWNvZGVNdWx0aUFzeW5jKGUsdCl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGlBc3luYyhlLHQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwO2xldCByPXQsbj0tMTtmb3IgYXdhaXQobGV0IHMgb2YgZSl7aWYodCYmbj09PTApdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtpZih0aGlzLmFwcGVuZEJ1ZmZlcihzKSxyKW49dGhpcy5yZWFkQXJyYXlTaXplKCkscj0hMSx0aGlzLmNvbXBsZXRlKCk7dHJ5e3doaWxlKCEwKWlmKHlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCksLS1uPT09MClicmVha31jYXRjaChpKXtpZighKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyBpfXRoaXMudG90YWxQb3MrPXRoaXMucG9zfX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9EZWNvZGVTeW5jKCl7ZTp3aGlsZSghMCl7bGV0IGU9dGhpcy5yZWFkSGVhZEJ5dGUoKSx0O2lmKGU+PTIyNCl0PWUtMjU2O2Vsc2UgaWYoZTwxOTIpaWYoZTwxMjgpdD1lO2Vsc2UgaWYoZTwxNDQpe2xldCBuPWUtMTI4O2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPDE2MCl7bGV0IG49ZS0xNDQ7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2V7bGV0IG49ZS0xNjA7dD10aGlzLmRlY29kZVN0cmluZyhuLDApfWVsc2UgaWYoZT09PTE5Mil0PW51bGw7ZWxzZSBpZihlPT09MTk0KXQ9ITE7ZWxzZSBpZihlPT09MTk1KXQ9ITA7ZWxzZSBpZihlPT09MjAyKXQ9dGhpcy5yZWFkRjMyKCk7ZWxzZSBpZihlPT09MjAzKXQ9dGhpcy5yZWFkRjY0KCk7ZWxzZSBpZihlPT09MjA0KXQ9dGhpcy5yZWFkVTgoKTtlbHNlIGlmKGU9PT0yMDUpdD10aGlzLnJlYWRVMTYoKTtlbHNlIGlmKGU9PT0yMDYpdD10aGlzLnJlYWRVMzIoKTtlbHNlIGlmKGU9PT0yMDcpaWYodGhpcy51c2VCaWdJbnQ2NCl0PXRoaXMucmVhZFU2NEFzQmlnSW50KCk7ZWxzZSB0PXRoaXMucmVhZFU2NCgpO2Vsc2UgaWYoZT09PTIwOCl0PXRoaXMucmVhZEk4KCk7ZWxzZSBpZihlPT09MjA5KXQ9dGhpcy5yZWFkSTE2KCk7ZWxzZSBpZihlPT09MjEwKXQ9dGhpcy5yZWFkSTMyKCk7ZWxzZSBpZihlPT09MjExKWlmKHRoaXMudXNlQmlnSW50NjQpdD10aGlzLnJlYWRJNjRBc0JpZ0ludCgpO2Vsc2UgdD10aGlzLnJlYWRJNjQoKTtlbHNlIGlmKGU9PT0yMTcpe2xldCBuPXRoaXMubG9va1U4KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDEpfWVsc2UgaWYoZT09PTIxOCl7bGV0IG49dGhpcy5sb29rVTE2KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDIpfWVsc2UgaWYoZT09PTIxOSl7bGV0IG49dGhpcy5sb29rVTMyKCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDQpfWVsc2UgaWYoZT09PTIyMCl7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMSl7bGV0IG49dGhpcy5yZWFkVTMyKCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMil7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaE1hcFN0YXRlKG4pLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSBlfWVsc2UgdD17fX1lbHNlIGlmKGU9PT0yMjMpe2xldCBuPXRoaXMucmVhZFUzMigpO2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPT09MTk2KXtsZXQgbj10aGlzLmxvb2tVOCgpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwxKX1lbHNlIGlmKGU9PT0xOTcpe2xldCBuPXRoaXMubG9va1UxNigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwyKX1lbHNlIGlmKGU9PT0xOTgpe2xldCBuPXRoaXMubG9va1UzMigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiw0KX1lbHNlIGlmKGU9PT0yMTIpdD10aGlzLmRlY29kZUV4dGVuc2lvbigxLDApO2Vsc2UgaWYoZT09PTIxMyl0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsMCk7ZWxzZSBpZihlPT09MjE0KXQ9dGhpcy5kZWNvZGVFeHRlbnNpb24oNCwwKTtlbHNlIGlmKGU9PT0yMTUpdD10aGlzLmRlY29kZUV4dGVuc2lvbig4LDApO2Vsc2UgaWYoZT09PTIxNil0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LDApO2Vsc2UgaWYoZT09PTE5OSl7bGV0IG49dGhpcy5sb29rVTgoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMSl9ZWxzZSBpZihlPT09MjAwKXtsZXQgbj10aGlzLmxvb2tVMTYoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMil9ZWxzZSBpZihlPT09MjAxKXtsZXQgbj10aGlzLmxvb2tVMzIoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sNCl9ZWxzZSB0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7RHQoZSl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCByPXRoaXMuc3RhY2s7d2hpbGUoci5sZW5ndGg+MCl7bGV0IG49ci50b3AoKTtpZihuLnR5cGU9PT13cilpZihuLmFycmF5W24ucG9zaXRpb25dPXQsbi5wb3NpdGlvbisrLG4ucG9zaXRpb249PT1uLnNpemUpdD1uLmFycmF5LHIucmVsZWFzZShuKTtlbHNlIGNvbnRpbnVlIGU7ZWxzZSBpZihuLnR5cGU9PT1sdCl7aWYodD09PSJfX3Byb3RvX18iKXRocm93IG5ldyBlZSgiVGhlIGtleSBfX3Byb3RvX18gaXMgbm90IGFsbG93ZWQiKTtuLmtleT10aGlzLm1hcEtleUNvbnZlcnRlcih0KSxuLnR5cGU9WG47Y29udGludWUgZX1lbHNlIGlmKG4ubWFwW24ua2V5XT10LG4ucmVhZENvdW50Kyssbi5yZWFkQ291bnQ9PT1uLnNpemUpdD1uLm1hcCxyLnJlbGVhc2Uobik7ZWxzZXtuLmtleT1udWxsLG4udHlwZT1sdDtjb250aW51ZSBlfX1yZXR1cm4gdH19cmVhZEhlYWRCeXRlKCl7aWYodGhpcy5oZWFkQnl0ZT09PXV0KXRoaXMuaGVhZEJ5dGU9dGhpcy5yZWFkVTgoKTtyZXR1cm4gdGhpcy5oZWFkQnl0ZX1jb21wbGV0ZSgpe3RoaXMuaGVhZEJ5dGU9dXR9cmVhZEFycmF5U2l6ZSgpe2xldCBlPXRoaXMucmVhZEhlYWRCeXRlKCk7c3dpdGNoKGUpe2Nhc2UgMjIwOnJldHVybiB0aGlzLnJlYWRVMTYoKTtjYXNlIDIyMTpyZXR1cm4gdGhpcy5yZWFkVTMyKCk7ZGVmYXVsdDppZihlPDE2MClyZXR1cm4gZS0xNDQ7ZWxzZSB0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCBhcnJheSB0eXBlIGJ5dGU6ICR7RHQoZSl9YCl9fXB1c2hNYXBTdGF0ZShlKXtpZihlPnRoaXMubWF4TWFwTGVuZ3RoKXRocm93IG5ldyBlZShgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHtlfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKGUpfXB1c2hBcnJheVN0YXRlKGUpe2lmKGU+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGFycmF5IGxlbmd0aCAoJHtlfSkgPiBtYXhBcnJheUxlbmd0aCAoJHt0aGlzLm1heEFycmF5TGVuZ3RofSlgKTt0aGlzLnN0YWNrLnB1c2hBcnJheVN0YXRlKGUpfWRlY29kZVN0cmluZyhlLHQpe2lmKCF0aGlzLnJhd1N0cmluZ3N8fHRoaXMuc3RhdGVJc01hcEtleSgpKXJldHVybiB0aGlzLmRlY29kZVV0ZjhTdHJpbmcoZSx0KTtyZXR1cm4gdGhpcy5kZWNvZGVCaW5hcnkoZSx0KX1kZWNvZGVVdGY4U3RyaW5nKGUsdCl7aWYoZT50aGlzLm1heFN0ckxlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgke2V9KSA+IG1heFN0ckxlbmd0aCAoJHt0aGlzLm1heFN0ckxlbmd0aH0pYCk7aWYodGhpcy5ieXRlcy5ieXRlTGVuZ3RoPHRoaXMucG9zK3QrZSl0aHJvdyB6bjtsZXQgcj10aGlzLnBvcyt0LG47aWYodGhpcy5zdGF0ZUlzTWFwS2V5KCkmJnRoaXMua2V5RGVjb2Rlcj8uY2FuQmVDYWNoZWQoZSkpbj10aGlzLmtleURlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMscixlKTtlbHNlIG49Tm4odGhpcy5ieXRlcyxyLGUpO3JldHVybiB0aGlzLnBvcys9dCtlLG59c3RhdGVJc01hcEtleSgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuc3RhY2sudG9wKCkudHlwZT09PWx0O3JldHVybiExfWRlY29kZUJpbmFyeShlLHQpe2lmKGU+dGhpcy5tYXhCaW5MZW5ndGgpdGhyb3cgbmV3IGVlKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgke2V9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKGUrdCkpdGhyb3cgem47bGV0IHI9dGhpcy5wb3MrdCxuPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixyK2UpO3JldHVybiB0aGlzLnBvcys9dCtlLG59ZGVjb2RlRXh0ZW5zaW9uKGUsdCl7aWYoZT50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCR7ZX0pID4gbWF4RXh0TGVuZ3RoICgke3RoaXMubWF4RXh0TGVuZ3RofSlgKTtsZXQgcj10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyt0KSxuPXRoaXMuZGVjb2RlQmluYXJ5KGUsdCsxKTtyZXR1cm4gdGhpcy5leHRlbnNpb25Db2RlYy5kZWNvZGUobixyLHRoaXMuY29udGV4dCl9bG9va1U4KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyl9bG9va1UxNigpe3JldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKX1sb29rVTMyKCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpfXJlYWRVOCgpe2xldCBlPXRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkSTgoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkVTE2KCl7bGV0IGU9dGhpcy52aWV3LmdldFVpbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZEkxNigpe2xldCBlPXRoaXMudmlldy5nZXRJbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZFUzMigpe2xldCBlPXRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRJMzIoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRVNjQoKXtsZXQgZT1Gbih0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjQoKXtsZXQgZT1rdCh0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRVNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdVaW50NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdJbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEYzMigpe2xldCBlPXRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRjY0KCl7bGV0IGU9dGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBuZXcgQ3QodCkuZGVjb2RlKGUpfWNsYXNzIGZ0e2xpc3RlbmVycz1uZXcgTWFwO2FkZEV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYoIXIpcj1uZXcgU2V0LHRoaXMubGlzdGVuZXJzLnNldChlLHIpO3JldHVybiByLmFkZCh0KSwoKT0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2lmKHIuZGVsZXRlKHQpLHIuc2l6ZT09PTApdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2xldCBuPUFycmF5LmZyb20ocik7Zm9yKGxldCBzIG9mIG4pcyh0KX19ZW1pdEFsbChlKXtsZXQgdD1BcnJheS5mcm9tKHRoaXMubGlzdGVuZXJzLmtleXMoKSk7Zm9yKGxldCByIG9mIHQpdGhpcy5lbWl0KHIsZSl9fWNsYXNzIFJle2dldHRlcjtzdGF0aWMgZXZlbnROYW1lPSJ1cGRhdGUiO2VtaXR0ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5nZXR0ZXI9ZTt0aGlzLmVtaXR0ZXI9bmV3IGZ0fWdldD0oKT0+dGhpcy5nZXR0ZXIoKTthc3luYyBlbWl0KCl7bGV0IGU9YXdhaXQgdGhpcy5nZXR0ZXIoKTtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5lbWl0dGVyLmVtaXQoUmUuZXZlbnROYW1lLGUpKX1saXN0ZW4oZSl7cmV0dXJuIHRoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKFJlLmV2ZW50TmFtZSxlKSwoKT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKFJlLmV2ZW50TmFtZSxlKX19fWZ1bmN0aW9uIHAoZSl7cmV0dXJuW2UsMF19ZnVuY3Rpb24gYyhlKXtyZXR1cm5bdm9pZCAwLGVdfWZ1bmN0aW9uIG5vKGUpe2lmKGU8MCljb25zb2xlLmluZm8oIk4iLGUpLGNvbnNvbGUudHJhY2UoKTtpZih0eXBlb2YgZSE9PSJiaWdpbnQiKWU9QmlnSW50KGUpO2lmKGU8MG4pcmV0dXJuIGMoMTApO2xldCB0PVtdO3doaWxlKGU+MG4pe2xldCByPU51bWJlcihlJjB4N2ZuKTtpZihlPj49N24sZT4wbil0LnB1c2gocnwxMjgpO2Vsc2UgdC5wdXNoKHIpfWlmKHQubGVuZ3RoPT09MClyZXR1cm4gcChuZXcgVWludDhBcnJheShbMF0pKTtpZih0Lmxlbmd0aD44KXJldHVybiBjKDI2KTtyZXR1cm4gcChuZXcgVWludDhBcnJheSh0KSl9ZnVuY3Rpb24gc28oZSx0PTApe2xldCByPTBuLG49MCxzPXQ7d2hpbGUoITApe2lmKHM+PWUubGVuZ3RoKXJldHVybiBjKDE0KTtsZXQgaT1lW3MrK107aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7aWYocnw9QmlnSW50KGkmMTI3KTw8QmlnSW50KG4pLChpJjEyOCk9PT0wKXtpZihzLXQ+OClyZXR1cm4gYygyNik7cmV0dXJuIHAoe3ZhbHVlOnI+MHgxZmZmZmZmZmZmZmZmZm4/cjpOdW1iZXIociksYnl0ZXNSZWFkOnMtdH0pfWlmKG4rPTcsbj49NTYpcmV0dXJuIGMoMjYpfX1jbGFzcyBMe2RhdGE7cG9zPTA7Y29uc3RydWN0b3IoZSl7dGhpcy5kYXRhPWV9c3RhdGljIGFzeW5jIGZyb21SZXNwb25zZShlKXtsZXQgdD1hd2FpdCBlLmFycmF5QnVmZmVyKCkscj1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gbmV3IEwocil9cmVhZEJpZ0ludCgpe2lmKHRoaXMucG9zKzg+dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gYyg3KTtsZXQgZT1uZXcgRGF0YVZpZXcodGhpcy5kYXRhLmJ1ZmZlcix0aGlzLmRhdGEuYnl0ZU9mZnNldCt0aGlzLnBvcykuZ2V0QmlnVWludDY0KDAsITEpO3JldHVybiB0aGlzLnBvcys9OCxwKGUpfXJlYWREYXRlKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIHAobmV3IERhdGUoZSkpfXJlYWRWYXJJbnQoKXtsZXRbZSx0XT1zbyh0aGlzLmRhdGEsdGhpcy5wb3MpO2lmKHQhPT0wKXJldHVybiBjKHQpO3RoaXMucG9zKz1lLmJ5dGVzUmVhZDtsZXQgcj1lLnZhbHVlO3JldHVybiBwKHR5cGVvZiByPT09ImJpZ2ludCI/TnVtYmVyKHIpOnIpfXJlYWRWYXJTdHJpbmcoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz1uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7cmV0dXJuIHAocyl9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gYygxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBjKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLHAodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3QucHVzaChyKX1yZXR1cm4gcCh0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTt0LnB1c2gocil9cmV0dXJuIHAodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgS3twYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09bm8oZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH1wcmVwZW5kQnl0ZXMoZSl7dGhpcy5wYXJ0cy51bnNoaWZ0KGUuc2xpY2UoKSl9d3JpdGVCeXRlcyhlKXt0aGlzLnBhcnRzLnB1c2goZS5zbGljZSgpKX13cml0ZVZhckJ5dGVzKGUpe2xldCB0PXRoaXMud3JpdGVWYXJJbnQoZS5sZW5ndGgpO2lmKHQhPT0wKXJldHVybiB0O3JldHVybiB0aGlzLndyaXRlQnl0ZXMoZSksMH13cml0ZVN0cnVjdChlLHQpe3JldHVybiBlLmVuY29kZSh0aGlzLHQpfXdyaXRlU3RydWN0cyhlLHQpe2ZvcihsZXQgciBvZiB0KXtsZXQgbj10aGlzLndyaXRlU3RydWN0KGUscik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9d3JpdGVCeXRlc1NlcShlKXtmb3IobGV0IHQgb2YgZSl0aGlzLndyaXRlQnl0ZXModCl9cmVzdWx0KCl7bGV0IGU9dGhpcy5wYXJ0cy5yZWR1Y2UoKG4scyk9Pm4rcy5sZW5ndGgsMCksdD1uZXcgVWludDhBcnJheShlKSxyPTA7Zm9yKGxldCBuIG9mIHRoaXMucGFydHMpdC5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gdH13aXBlKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpZS5maWxsKDApO3RoaXMucGFydHMubGVuZ3RoPTB9KnNjYW4oKXtmb3IobGV0IGUgb2YgdGhpcy5wYXJ0cyl5aWVsZCBlfX1hc3luYyBmdW5jdGlvbiBFcihlLHQpe2xldCByPW5ldyBLLG49ci53cml0ZURhdGUodCk7aWYobiE9PTApcmV0dXJuIGMobik7bGV0IHM9ci5yZXN1bHQoKSxpPWF3YWl0IGUuc2lnbihzKTtyZXR1cm4gcCh7cHViS2V5OmUucHVibGljS2V5LHNpZzppLHRpbWVzdGFtcDp0fSl9YXN5bmMgZnVuY3Rpb24gRGUoZSx0LHIpe2xldCBuPXIubm93KCkuZ2V0VGltZSgpLHM9ZS50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKG4tcyk+TG4pcmV0dXJuIDQ7bGV0IG89bmV3IEs7by53cml0ZURhdGUoZS50aW1lc3RhbXApO2xldCBhPW8ucmVzdWx0KCk7aWYoIWF3YWl0IHQuY2hlY2tTaWdFZDI1NTE5KGUuc2lnLGEsZS5wdWJLZXkpKXJldHVybiAzO3JldHVybiAwfXZhciBhZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudHMpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWREYXRlKCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2lkOnQsdHM6bn0pfX07ZnVuY3Rpb24gVHQoZSl7bGV0IHQ9bmV3IEsscj10LndyaXRlU3RydWN0KGFlLGUpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXQucmVzdWx0KCk7cmV0dXJuIHAobil9dmFyIGRlPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5laWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5vZmYpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJJbnQodC5jdHIpO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5sZW4pO2lmKGkhPT0wKXJldHVybiBpO2lmKHQuaHNoKWUud3JpdGVCeXRlcyh0LmhzaCk7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPW5ldyBMKHQpLFssc109YWUuZGVjb2RlKG4pO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldFthLGRdPWUucmVhZFZhckludCgpO2lmKGQhPT0wKXJldHVybiBjKGQpO2xldFt1LGxdPWUucmVhZFZhckludCgpO2lmKGwhPT0wKXJldHVybiBjKGwpO2xldCBmO2lmKHU+MCl7bGV0W2gseV09ZS5yZWFkQnl0ZXMoVXQpO2lmKHkhPT0wKXJldHVybiBjKHkpO2Y9aH1yZXR1cm4gcCh7ZWlkOnQsb2ZmOmksY3RyOmEsbGVuOnUsaHNoOmZ9KX19O2Z1bmN0aW9uIGhlKGUpe3JldHVybiBBcnJheS5mcm9tKGUpLm1hcCgocik9PnIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiIil9ZnVuY3Rpb24gR24oZSl7aWYoZS5sZW5ndGglMiE9PTApdGhyb3cgRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO2xldCB0PW5ldyBVaW50OEFycmF5KGUubGVuZ3RoLzIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cis9Mil0W3IvMl09TnVtYmVyLnBhcnNlSW50KGUuc3Vic3RyKHIsMiksMTYpO3JldHVybiB0fWZ1bmN0aW9uIFgoZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7cmV0dXJuIGUuZXZlcnkoKHIsbik9PnI9PT10W25dKX12YXIgQztpZih0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQ9PT0iZnVuY3Rpb24iKUM9KGUpPT5lLnRvQmFzZTY0KCk7ZWxzZSBDPShlKT0+YnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUpKTt2YXIgZmU7aWYodHlwZW9mIFVpbnQ4QXJyYXkuZnJvbUJhc2U2ND09PSJmdW5jdGlvbiIpZmU9KGUpPT5VaW50OEFycmF5LmZyb21CYXNlNjQoZSk7ZWxzZSBmZT0oZSk9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKGUpLCh0KT0+dC5jaGFyQ29kZUF0KDApKTtmdW5jdGlvbiAkbihlKXtsZXQgdD1lLmxlbmd0aCU0PT09MD8iIjoiPSIucmVwZWF0KDQtZS5sZW5ndGglNCkscj1lLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpK3Q7cmV0dXJuIGZlKHIpfWZ1bmN0aW9uIHllKGUsdCl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO3JldHVybiByLnNldChlLDApLHIuc2V0KHQsZS5sZW5ndGgpLHJ9ZnVuY3Rpb24gUW4oZSx0LHIpe3JldHVybiByLmNoZWNrU2lnRWQyNTUxOShlLnNpZyxlLmhlYWRDcGgsdCl9YXN5bmMgZnVuY3Rpb24gWW4oZSx0LHIsbil7bGV0IHM7aWYoZS5ib2QmJmUubGVuPjApcz1hd2FpdCByLmJsYWtlMyhlLmJvZCk7bGV0IGk9bmV3IEssbz1kZS5lbmNvZGUoaSx7Li4uZSxoc2g6c30pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhPWkucmVzdWx0KCksZD1hd2FpdCB0LmtkbUZvcihhKSx1PW4uZGVyaXZlQ2lwaGVyKGQsImVuY3J5cHQiKSxsPWF3YWl0IHUuZW5jcnlwdChhKSxmPWUuYm9kP2F3YWl0IHUuZW5jcnlwdChlLmJvZCk6bmV3IFVpbnQ4QXJyYXkoMCksaD1hd2FpdCB0LnNpZ24obCk7cmV0dXJuIHAoe3NpZzpoLGtkbTpkLGhlYWRDcGg6bCxib2R5Q3BoOmZ9KX1hc3luYyBmdW5jdGlvbiBBcihlLHQscixuLHMpe2xldCBpPW5ldyBMKGUpLFtvLGFdPWRlLmRlY29kZShpKTtpZihhIT09MClyZXR1cm4gYygxNCk7bGV0IGQ7dHJ5e2Q9dCYmdC5sZW5ndGg+MD9hd2FpdCByLmRlY3J5cHQodCk6dm9pZCAwfWNhdGNoe3JldHVybiBjKDIwKX1sZXQgdT1vLmhzaCYmZD09PXZvaWQgMCxsPW8uaHNoPT09dm9pZCAwJiZkIT09dm9pZCAwO2lmKHV8fGwpcmV0dXJuIGMoMTkpO2lmKG8uaHNoJiZkKXtsZXQgaD1hd2FpdCBuLmJsYWtlMyhkKTtpZighWChoLG8uaHNoKSlyZXR1cm4gYygxOSl9bGV0IGY9cz8/YXdhaXQgbi5ibGFrZTMoZSk7cmV0dXJuIHAoe21zZ0hlYWQ6byxib2Q6ZCxoZWFkSGFzaDpmfSl9Y2xhc3MgUHJ7bm93KCl7cmV0dXJuIG5ldyBEYXRlfX1mdW5jdGlvbiBKbihlLHQscixuKXtsZXQgcz10LmdldFRpbWUoKS1lLmdldFRpbWUoKSxpPXIuZ2V0VGltZSgpLW4uZ2V0VGltZSgpO3JldHVybihzK2kpLzJ9dmFyIHB0PXtlbmNvZGUoZSx0KXtpZihlLndyaXRlVmFySW50KHQucXVvdGEpLHQucXVvdGE+MCl7aWYodC51c2FnZT09PXZvaWQgMClyZXR1cm4gOTtlLndyaXRlVmFySW50KHQudXNhZ2UpfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0IG47aWYodD4wKXtsZXRbcyxpXT1lLnJlYWRWYXJJbnQoKTtpZihpIT09MClyZXR1cm4gYyhpKTtuPXN9cmV0dXJuIHAoe3F1b3RhOnQsdXNhZ2U6bn0pfX07dmFyIFVyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW3Quc3RhdHVzXSkpO2xldCByPWUud3JpdGVEYXRlKHQudGltZVJjdmQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudGltZVNlbnQpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24udGVybSk7aWYocyE9PTApcmV0dXJuIHM7bGV0IGk9ZS53cml0ZVZhckludCh0LnN1YnNjcmlwdGlvbi5lbGFwc2VkKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1lLndyaXRlU3RydWN0KHB0LHQuc3Vic2NyaXB0aW9uLnN0YXQpO2lmKG8hPT0wKXJldHVybiBvO2xldCBhPWUud3JpdGVTdHJ1Y3QocHQsdC5zdWJzY3JpcHRpb24uZHluKTtpZihhIT09MClyZXR1cm4gYTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKDEpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXRbMF0sW3MsaV09ZS5yZWFkRGF0ZSgpO2lmKGkhPT0wKXJldHVybiBjKGkpO2xldFtvLGFdPWUucmVhZERhdGUoKTtpZihhIT09MClyZXR1cm4gYyhhKTtsZXRbZCx1XT1lLnJlYWRWYXJJbnQoKTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXRbbCxmXT1lLnJlYWRWYXJJbnQoKTtpZihmIT09MClyZXR1cm4gYyhmKTtsZXRbaCx5XT1lLnJlYWRTdHJ1Y3QocHQpO2lmKHkhPT0wKXJldHVybiBjKHkpO2xldFtnLG1dPWUucmVhZFN0cnVjdChwdCk7aWYobSE9PTApcmV0dXJuIGMobSk7cmV0dXJuIHAoe3N0YXR1czpuLHRpbWVSY3ZkOnMsdGltZVNlbnQ6byxzdWJzY3JpcHRpb246e3Rlcm06ZCxlbGFwc2VkOmwsc3RhdDpoLGR5bjpnfX0pfX07dmFyIEJyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuc2VxKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckJ5dGVzKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFySW50KCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2hlYWRDcGg6dCxzZXE6bn0pfX07dmFyIGNlPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5wdWJLZXkpLGUud3JpdGVCeXRlcyh0LnNpZyk7bGV0IHI9ZS53cml0ZURhdGUodC50aW1lc3RhbXApO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoUm4pO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKGtlKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWREYXRlKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe3B1YktleTp0LHNpZzpuLHRpbWVzdGFtcDppfSl9fTt2YXIgWm49e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe2xldCBpPXMud3JpdGVTdHJ1Y3QoY2Uscik7aWYoaSE9PTApcmV0dXJuIGk7Zm9yKGxldCBvIG9mIG4pcy53cml0ZVZhckludChvKTtyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGNlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgZD1hd2FpdCBEZShvLHMsbik7aWYoZCE9PTApcmV0dXJuIGQ7bGV0e3B1YktleTp1fT1vLFtsLGZdPWF3YWl0IGkuaGFzVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtpZighbClyZXR1cm4gNTtsZXRbaCx5XT10LnJlYWRWYXJJbnQoKTtpZih5IT09MClyZXR1cm4geTtpZighdC5kb25lKCkpcmV0dXJuIDg7bGV0W2csbV09YXdhaXQgaS5saXN0SGVhZHModSxoKTtpZihtIT09MClyZXR1cm4gbTtyZXR1cm4gci53cml0ZVN0cnVjdHMoQnIsZyl9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoQnIpfX07dmFyIGtyPXtlbmNvZGUoZSx0KXtlLndyaXRlVmFySW50KHQuc2VxKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5ib2R5Q3BoKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZFZhckJ5dGVzKCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe3NlcTp0LGJvZHlDcGg6bn0pfX07dmFyIGVzPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgaT1zLndyaXRlU3RydWN0KGNlLHIpO2lmKGkhPT0wKXJldHVybiBpO2ZvcihsZXQgbyBvZiBuKXtsZXQgYT1zLndyaXRlVmFySW50KG8pO2lmKGEhPT0wKXJldHVybiBhfXJldHVybiAwfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6aX09ZSxbbyxhXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGEhPT0wKXJldHVybiBhO2xldCBkPWF3YWl0IERlKG8scyxuKTtpZihkIT09MClyZXR1cm4gZDtsZXR7cHViS2V5OnV9PW8sW2wsZl09YXdhaXQgaS5oYXNVc2VyKHUpO2lmKGYhPT0wKXJldHVybiBmO2lmKCFsKXJldHVybiA1O2xldCBoPVtdO3doaWxlKCF0LmRvbmUoKSl7bGV0W20sU109dC5yZWFkVmFySW50KCk7aWYoUyE9PTApcmV0dXJuIFM7aC5wdXNoKG0pfWNvbnNvbGUuaW5mbyhgUFVMTDogJHtoLmxlbmd0aH0gYmFnc2ApO2xldFt5LGddPWF3YWl0IGkuZ2V0Qm9kaWVzKHUsaCk7aWYoZyE9PTApcmV0dXJuIGc7aWYoIXkpcmV0dXJuIDE3O2ZvcihsZXR7c2VxOm0sYm9keUNwaDpTfW9mIHkpe2xldCB4PXtzZXE6bSxib2R5Q3BoOlN9LGI9ci53cml0ZVN0cnVjdChrcix4KTtpZihiIT09MClyZXR1cm4gYn1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhrcil9fTt2YXIgdnI9e2VuY29kZShlLHQpe2Uud3JpdGVCeXRlcyh0LnNpZyksZS53cml0ZUJ5dGVzKHQua2RtKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5ib2R5Q3BoKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKGtlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyh2ZSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFyQnl0ZXMoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXRbYSxkXT1lLnJlYWRWYXJCeXRlcygpO2lmKGQhPT0wKXJldHVybiBjKGQpO3JldHVybiBwKHtzaWc6dCxrZG06bixoZWFkQ3BoOmksYm9keUNwaDphfSl9fTt2YXIgSHQ9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5zZXEpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPXQuYm9keUNwaD90LmJvZHlDcGgubGVuZ3RoOjAsaT1lLndyaXRlVmFySW50KHMpO2lmKGkhPT0wKXJldHVybiBpO2lmKHM+MCl7aWYoIXQuYm9keUNwaClyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQuYm9keUNwaCl9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhO2lmKGk+MCl7bGV0W2QsdV09ZS5yZWFkQnl0ZXMoaSk7aWYodSE9PTApcmV0dXJuIGModSk7YT1kfXJldHVybiBwKHtzZXE6dCxoZWFkQ3BoOm4sYm9keUNwaDphfSl9fTt2YXIgTXQ9e2VuY29kZShlLHQpe2Uud3JpdGVCeXRlcyh0LnNpZyksZS53cml0ZUJ5dGVzKHQua2RtKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKGtlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyh2ZSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFyQnl0ZXMoKTtpZihvIT09MClyZXR1cm4gYyhvKTtyZXR1cm4gcCh7c2lnOnQsa2RtOm4saGVhZENwaDppfSl9fTt2YXIgUnQ9e2VuY29kZShlLHQpe2lmKGUud3JpdGVWYXJJbnQodC5pZHgpLGUud3JpdGVCeXRlcyhuZXcgVWludDhBcnJheShbdC5zdGF0dXNdKSksdC5zdGF0dXM9PT0wKWUud3JpdGVWYXJJbnQodC5zZXEpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoMSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0IGk9blswXTtpZihpIT09MClyZXR1cm4gcCh7aWR4OnQsc3RhdHVzOml9KTtsZXRbbyxhXT1lLnJlYWRWYXJJbnQoKTtpZihhIT09MClyZXR1cm4gYyhhKTtyZXR1cm4gcCh7aWR4OnQsc3RhdHVzOmksc2VxOm99KX19O3ZhciB0cz17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdChjZSxyKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1zLndyaXRlU3RydWN0cyh2cixuKTtpZihvIT09MClyZXR1cm4gbztyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOmksbm90aWZpZXI6b309ZSxbYSxkXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGQhPT0wKXJldHVybiBkO2xldCB1PWF3YWl0IERlKGEscyxuKTtpZih1IT09MClyZXR1cm4gdTtsZXR7cHViS2V5Omx9PWEsW2YsaF09YXdhaXQgaS5oYXNVc2VyKGwpO2lmKGghPT0wKXJldHVybiBoO2lmKCFmKXJldHVybiA1O2xldFt5LGddPXQucmVhZFN0cnVjdHModnIpO2lmKGchPT0wKXJldHVybiBnO2NvbnNvbGUuaW5mbyhgUFVTSDogJHt5Lmxlbmd0aH0gYmFnc2ApO2xldCBtPVtdLFM9W107Zm9yKGxldCB3PTA7dzx5Lmxlbmd0aDt3Kyspe2xldCBBPXlbd107aWYoIWF3YWl0IFFuKEEsbCxzKSl7bGV0IEQ9e2lkeDp3LHN0YXR1czozfSxIPXIud3JpdGVTdHJ1Y3QoUnQsRCk7aWYoSCE9PTApcmV0dXJuIEg7Y29udGludWV9bS5wdXNoKHcpLFMucHVzaChBKX1sZXRbeCxiXT1hd2FpdCBpLnNldEJhZ3MobCxTKTtpZihiIT09MClyZXR1cm4gYjtpZigheHx8eC5sZW5ndGghPT1TLmxlbmd0aClyZXR1cm4gMTc7bGV0IEU9W107Zm9yKGxldCB3PTA7dzxTLmxlbmd0aDt3Kyspe2xldCBBPVNbd10saz1tW3ddLEQ9eFt3XSxIPW5ldyBLLFQ9SC53cml0ZVN0cnVjdChNdCxBKTtpZihUIT09MClyZXR1cm4gVDtsZXQgTz1ILnJlc3VsdCgpLE49e3NlcTpELGhlYWRDcGg6T307aWYoeS5sZW5ndGg9PT0xJiZBLmJvZHlDcGgubGVuZ3RoPD1LbilOLmJvZHlDcGg9QS5ib2R5Q3BoO0UucHVzaChOKTtsZXQgXz17aWR4Omssc3RhdHVzOjAsc2VxOkR9LEk9ci53cml0ZVN0cnVjdChSdCxfKTtpZihJIT09MClyZXR1cm4gSX1pZihFLmxlbmd0aD4wKXtsZXQgdz1uZXcgSyxBPXcud3JpdGVTdHJ1Y3RzKEh0LEUpO2lmKEEhPT0wKXJldHVybiBBO2xldCBrPXcucmVzdWx0KCk7YXdhaXQgUHJvbWlzZS5yZXNvbHZlKG8ucHVzaChsLGspKX1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhSdCl9fTt2YXIgcnM9e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe3JldHVybiBzLndyaXRlU3RydWN0KGNlLHIpfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6aX09ZSxbbyxhXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGEhPT0wKXJldHVybiBhO2xldCBkPWF3YWl0IERlKG8scyxuKTtpZihkIT09MClyZXR1cm4gZDtsZXR7cHViS2V5OnV9PW87aWYoIXQuZG9uZSgpKXJldHVybiA4O2xldFtsLGZdPWF3YWl0IGkuYWRkVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtyZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gcCh2b2lkIDApfX07Y2xhc3MgRHJ7dXJsO3dlYnNvY2tldDtjb25zdHJ1Y3RvcihlKXt0aGlzLnVybD1lfWNvbm5lY3RlZCgpe3JldHVybiB0aGlzLndlYnNvY2tldCE9PXZvaWQgMCYmdGhpcy53ZWJzb2NrZXQucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOfWFzeW5jIGNvbm5lY3QoZSx0LHI9KCk9Pnt9LG49KCk9Pnt9KXtsZXR7dXJsOnN9PXRoaXM7aWYodGhpcy53ZWJzb2NrZXQpdGhpcy53ZWJzb2NrZXQuY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDA7bGV0IGk9bmV3IEs7aS53cml0ZVN0cnVjdChjZSxlKTtsZXQgbz1pLnJlc3VsdCgpLGE9aGUobyk7cmV0dXJuIHMuc2VhcmNoUGFyYW1zLnNldCgidCIsYSksdGhpcy53ZWJzb2NrZXQ9bmV3IFdlYlNvY2tldChzKSx0aGlzLndlYnNvY2tldC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsdGhpcy53ZWJzb2NrZXQub25vcGVuPSgpPT57Y29uc29sZS5sb2coIkNPTk5FQ1RFRCIpLG4oKX0sdGhpcy53ZWJzb2NrZXQub25jbG9zZT0oKT0+e2NvbnNvbGUubG9nKCJESVNDT05ORUNURUQiKSx0aGlzLndlYnNvY2tldD12b2lkIDAscigpfSx0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2U9KGQpPT57bGV0IHU9bmV3IFVpbnQ4QXJyYXkoZC5kYXRhKTt0KHUpfSx0aGlzLndlYnNvY2tldC5vbmVycm9yPShkKT0+e2NvbnNvbGUubG9nKGBFUlJPUjogJHtKU09OLnN0cmluZ2lmeShkKX1gKSx0aGlzLndlYnNvY2tldD12b2lkIDAscigpfSxQcm9taXNlLnJlc29sdmUoMCl9ZGlzY29ubmVjdCgpe3RoaXMud2Vic29ja2V0Py5jbG9zZSgpLHRoaXMud2Vic29ja2V0PXZvaWQgMH19dmFyIFk9e3VzZXI6e3BhdGg6Ii91c2VyIixlbmRwb2ludDpycyxuYW1lOjB9LHB1c2g6e3BhdGg6Ii9wdXNoIixlbmRwb2ludDp0cyxuYW1lOjJ9LHBlZWs6e3BhdGg6Ii9wZWVrIixlbmRwb2ludDpabixuYW1lOjF9LHB1bGw6e3BhdGg6Ii9wdWxsIixlbmRwb2ludDplcyxuYW1lOjN9fSxpbz17MDpZLnVzZXIsMjpZLnB1c2gsMTpZLnBlZWssMzpZLnB1bGx9LHF1PXtbWS51c2VyLnBhdGhdOlkudXNlcixbWS5wdXNoLnBhdGhdOlkucHVzaCxbWS5wZWVrLnBhdGhdOlkucGVlayxbWS5wdWxsLnBhdGhdOlkucHVsbH07Y2xhc3MgbnN7dXJsO2xpc3RlbmVyO2NvbnN0cnVjdG9yKGUpe3RoaXMudXJsPWU7dGhpcy5saXN0ZW5lcj1uZXcgRHIoZSl9YXN5bmMgY2FsbChlLHQpe2xldHtwYXRoOnJ9PWlvW2VdLG49bmV3IFVSTChyLHRoaXMudXJsKTt0cnl7cmV0dXJuIGF3YWl0IG9vKG4sdCl9Y2F0Y2h7cmV0dXJuIGMoMjUpfX19dmFyIHNzPShlKT0+bmV3IG5zKGUuaGFuZGxlKTthc3luYyBmdW5jdGlvbiBvbyhlLHQpe2xldCByPWF3YWl0IGZldGNoKGUse21ldGhvZDoiUE9TVCIsYm9keTp0LnJlc3VsdCgpLnNsaWNlKCl9KTtpZighci5vaylyZXR1cm4gYygyNCk7bGV0IG49YXdhaXQgTC5mcm9tUmVzcG9uc2Uocik7cmV0dXJuIHAobil9Y2xhc3MgTHR7ZW5jbGF2ZTtjcnlwdG87aG9zdDtjbG9jazt0cmFuc3BvcnQ7dXBkYXRlSG9zdE1ldGE7Y29uc3RydWN0b3IoZSx0LHIsbixzLGkpe3RoaXMuZW5jbGF2ZT1lO3RoaXMuY3J5cHRvPXQ7dGhpcy5ob3N0PXI7dGhpcy5jbG9jaz1uO3RoaXMudHJhbnNwb3J0PXM7dGhpcy51cGRhdGVIb3N0TWV0YT1pfWFzeW5jIGNhbGwoZSx0KXtsZXR7Y2xvY2s6cix0cmFuc3BvcnQ6bn09dGhpcyx7ZW5kcG9pbnQ6cyxuYW1lOml9PWUsbz1hd2FpdCB0aGlzLmlkZW50aXR5KCksYT1yLm5vdygpLFtkLHVdPWF3YWl0IEVyKG8sYSk7aWYodSE9PTApcmV0dXJuIGModSk7bGV0IGw9bmV3IEssZj1hd2FpdCBzLmVuY29kZVJlcSh0aGlzLG8sZCx0LGwpO2lmKGYhPT0wKXJldHVybiBjKGYpO2xldCBoPXIubm93KCksW3ksZ109YXdhaXQgbi5jYWxsKGksbCksbT1yLm5vdygpO2lmKGchPT0wKXJldHVybiBjKGcpO2xldFtTLHhdPXkucmVhZFN0cnVjdChVcik7aWYoeCE9PTApcmV0dXJuIGMoeCk7aWYoUy5zdGF0dXMhPT0wKXJldHVybiBjKFMuc3RhdHVzKTtsZXQgRT17Y2xvY2tPZmZzZXQ6Sm4oaCxTLnRpbWVSY3ZkLFMudGltZVNlbnQsbSksc3Vic2NyaXB0aW9uOlMuc3Vic2NyaXB0aW9ufSx3PWF3YWl0IHRoaXMudXBkYXRlSG9zdE1ldGEoRSk7aWYodyE9PTApcmV0dXJuIGModyk7cmV0dXJuIHMuZGVjb2RlUmVzcCh5KX1pZGVudGl0eT0oKT0+e2xldHtob3N0OmUsZW5jbGF2ZTp0fT10aGlzO3JldHVybiB0LmRlcml2ZUlkZW50aXR5KGUubGFiZWwsZS5pZHg/PzApfTtzZWFsPWFzeW5jKGUpPT57bGV0e2NyeXB0bzp0LGVuY2xhdmU6cn09dGhpcyxuPWF3YWl0IHRoaXMuaWRlbnRpdHkoKTtyZXR1cm4gWW4oZSxuLHQscil9O3JlZ2lzdGVyPSgpPT50aGlzLmNhbGwoWS51c2VyLFtdKTtwZWVrPShlKT0+dGhpcy5jYWxsKFkucGVlayxbZV0pO3B1c2g9KGUpPT50aGlzLmNhbGwoWS5wdXNoLGUpO3B1bGw9KGUpPT50aGlzLmNhbGwoWS5wdWxsLGUpO2xpc3Rlbj1hc3luYyhlLHQscik9PntsZXR7Y2xvY2s6bix0cmFuc3BvcnQ6c309dGhpcyx7bGlzdGVuZXI6aX09cyxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPW4ubm93KCksW2QsdV09YXdhaXQgRXIobyxhKTtpZih1IT09MClyZXR1cm4gdTtyZXR1cm4gYXdhaXQgaS5jb25uZWN0KGQsZSx0LHIpfTtpc0Nvbm5lY3RlZCgpe2xldCBlPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZihlJiZ0eXBlb2YgZS5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiBlLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19dmFyIENyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGJsKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuaWR4KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQubnVtKTtpZihzIT09MClyZXR1cm4gcztyZXR1cm4gZS53cml0ZUJ5dGVzKHQuaHNoKSxlLndyaXRlQnl0ZXModC5zaWcpLDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXRbYSxkXT1lLnJlYWRCeXRlcyhVdCk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0W3UsbF09ZS5yZWFkQnl0ZXMoa2UpO2lmKGwhPT0wKXJldHVybiBjKGwpO3JldHVybiBwKHtsYmw6dCxpZHg6bixudW06aSxoc2g6YSxzaWc6dX0pfX07dmFyIEt0PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlU3RydWN0KENyLHQuaGVhZCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuaW5kZXhFbmMpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlFbmMpO2lmKHMhPT0wKXJldHVybiBzO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KENyKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe2hlYWQ6dCxpbmRleEVuYzpuLGJvZHlFbmM6aX0pfX07dmFyIFRyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5sZW5Cb2R5KTtpZihuIT09MClyZXR1cm4gbjtpZih0LmxlbkJvZHk+MCYmdC5vZmZCb2R5IT09dm9pZCAwKXtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmQm9keSk7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyh2ZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXQgYTtpZihpPjApe2xldFtkLHVdPWUucmVhZFZhckludCgpO2lmKHUhPT0wKXJldHVybiBjKHUpO2E9ZH1yZXR1cm4gcCh7a2RtOnQsaGVhZENwaDpuLGxlbkJvZHk6aSxvZmZCb2R5OmF9KX19O3ZhciBPdDsoKGlzKT0+e2lzLmRlZmF1bHRGaWxlRXh0ZW5zaW9uPSJkcGwiO2FzeW5jIGZ1bmN0aW9uIHQocyxpLG8sYSxkKXtsZXQgdT1hd2FpdCBkLmRlcml2ZUlkZW50aXR5KHMsaSksbD1uZXcgSyxmPW5ldyBLLGg9MCx5PTA7Zm9yKGxldCBBIG9mIG8pe2xldCBrPW5ldyBLLEQ9ay53cml0ZVN0cnVjdChkZSxBLmhlYWQpO2lmKEQhPT0wKXJldHVybiBjKEQpO2xldCBIPWsucmVzdWx0KCksVD1hd2FpdCB1LmtkbUZvcihIKSxPPWQuZGVyaXZlQ2lwaGVyKFQsImVuY3J5cHQiKSxOPWF3YWl0IE8uZW5jcnlwdChIKSxfPUEuYm9keT9hd2FpdCBPLmVuY3J5cHQoQS5ib2R5KTpuZXcgVWludDhBcnJheSgwKSxJPUEuaGVhZC5sZW4+MCYmQS5oZWFkLmhzaCE9PXZvaWQgMD9fLmxlbmd0aDowLHY9e2tkbTpULGhlYWRDcGg6TixsZW5Cb2R5Okksb2ZmQm9keTpJPjA/eTp2b2lkIDB9LFI9bC53cml0ZVN0cnVjdChUcix2KTtpZihSIT09MClyZXR1cm4gYyhSKTtpZihBLmJvZHkpZi53cml0ZUJ5dGVzKF8pLHkrPV8ubGVuZ3RoO2grK31sZXQgZz1mLnJlc3VsdCgpLG09bC5yZXN1bHQoKSxTPWF3YWl0IGEuYmxha2UzKG0pLHg9YXdhaXQgdS5zaWduKFMpLGI9e2xibDpzLGlkeDppLG51bTpoLGhzaDpTLHNpZzp4fSxFPW5ldyBLO0Uud3JpdGVTdHJ1Y3QoS3Qse2hlYWQ6YixpbmRleEVuYzptLGJvZHlFbmM6Z30pO2xldCB3PUUucmVzdWx0KCk7cmV0dXJuIHAodyl9aXMuZW5jb2RlRmlsZT10O2FzeW5jIGZ1bmN0aW9uIHIocyxpLG8pe2xldFthLGRdPUt0LmRlY29kZShuZXcgTChzKSk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0e2hlYWQ6dSxpbmRleEVuYzpsLGJvZHlFbmM6Zn09YSxoPWF3YWl0IG8uZGVyaXZlSWRlbnRpdHkodS5sYmwsdS5pZHgpO2lmKCFhd2FpdCBpLmNoZWNrU2lnRWQyNTUxOSh1LnNpZyx1LmhzaCxoLnB1YmxpY0tleSkpcmV0dXJuIGMoMyk7bGV0IGc9YXdhaXQgaS5ibGFrZTMobCk7aWYoIVgoZyx1LmhzaCkpcmV0dXJuIGMoMTkpO2xldCBtPW5ldyBMKGwpLFM9W107Zm9yKGxldCBiPTA7Yjx1Lm51bTtiKyspe2xldFtFLHddPW0ucmVhZFN0cnVjdChUcik7aWYodyE9PTApcmV0dXJuIGModyk7Uy5wdXNoKEUpfWlmKFMubGVuZ3RoIT09dS5udW0pcmV0dXJuIGMoMTQpO2xldCB4PVtdO2ZvcihsZXQgYiBvZiBTKXtsZXQgRT1vLmRlcml2ZUNpcGhlcihiLmtkbSwiZGVjcnlwdCIpLHc7dHJ5e3c9YXdhaXQgRS5kZWNyeXB0KGIuaGVhZENwaCl9Y2F0Y2h7cmV0dXJuIGMoMjApfWxldFtBLGtdPWRlLmRlY29kZShuZXcgTCh3KSk7aWYoayE9PTApcmV0dXJuIGMoayk7bGV0IEQ7aWYoYi5sZW5Cb2R5PjAmJmIub2ZmQm9keSE9PXZvaWQgMCl7aWYoQS5oc2g9PT12b2lkIDApcmV0dXJuIGMoMTQpO2xldCBIPWYuc2xpY2UoYi5vZmZCb2R5LGIub2ZmQm9keStiLmxlbkJvZHkpO3RyeXtEPWF3YWl0IEUuZGVjcnlwdChIKX1jYXRjaHtyZXR1cm4gYygyMCl9bGV0IFQ9YXdhaXQgaS5ibGFrZTMoRCk7aWYoIVgoVCxBLmhzaCkpcmV0dXJuIGMoMTkpfXgucHVzaCh7aGVhZDpBLGJvZHk6RH0pfXJldHVybiBwKHgpfWlzLmRlY29kZUZpbGU9cjthc3luYyBmdW5jdGlvbiBuKHMsaSxvLGEsZCl7bGV0W3UsbF09YXdhaXQgcihzLGksbyk7aWYobCE9PTApcmV0dXJuIGMobCk7bGV0W2YsaF09S3QuZGVjb2RlKG5ldyBMKHMpKTtpZihoIT09MClyZXR1cm4gYyhoKTtyZXR1cm4gdChmLmhlYWQubGJsLGYuaGVhZC5pZHgsZCh1KSxpLGEpfWlzLm1pZ3JhdGVGaWxlPW59KShPdHx8PXt9KTthc3luYyBmdW5jdGlvbiBvcyh7bm93OmUsYm9kOnQsY3J5cHRvOnJ9KXtsZXQgbj1hd2FpdCByLmdlblJhbmRvbUJ5dGVzKDgpLHM9bmV3IEssaT1zLndyaXRlU3RydWN0KGFlLHtpZDpuLHRzOmV9KTtpZihpIT09MClyZXR1cm4gYyhpKTtsZXQgbz1zLnJlc3VsdCgpO3JldHVybiBWdCh7bm93OmUsZWlkOm8sY3RyOjAsYm9kOnQsY3J5cHRvOnJ9KX1hc3luYyBmdW5jdGlvbiBWdCh7bm93OmUsZWlkOnQsY3RyOnIsYm9kOm4sY3J5cHRvOnN9KXtsZXQgaT1uZXcgTCh0KSxbbyxhXT1hZS5kZWNvZGUoaSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7bGV0IGQ9ZS5nZXRUaW1lKCktby50cy5nZXRUaW1lKCksdSxsPW4/Lmxlbmd0aD8/MDtpZihuJiZsPjApdT1hd2FpdCBzLmJsYWtlMyhuKTtyZXR1cm4gcCh7ZWlkOnQsb2ZmOmQsY3RyOnIsbGVuOmwsaHNoOnV9KX1mdW5jdGlvbiBhbyhlLHQpe2xldCByPWUubGVuZ3RoPHQubGVuZ3RoP2UubGVuZ3RoOnQubGVuZ3RoO2ZvcihsZXQgbj0wO248cjtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuIGVbbl0tdFtuXTtyZXR1cm4gZS5sZW5ndGgtdC5sZW5ndGh9YXN5bmMgZnVuY3Rpb24gaHQoZSx0KXtsZXQgcj1BcnJheS5mcm9tKGUpO3Iuc29ydChhbyk7bGV0IG49MDtmb3IobGV0IG8gb2YgciluKz1vLmxlbmd0aDtsZXQgcz1uZXcgVWludDhBcnJheShuKSxpPTA7Zm9yKGxldCBvIG9mIHIpcy5zZXQobyxpKSxpKz1vLmxlbmd0aDtyZXR1cm4gdC5ibGFrZTMocyl9ZnVuY3Rpb24gY28oZSl7bGV0IHQ9bmV3IEsscj10LndyaXRlVmFyQnl0ZXMoZS5laWQpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXQud3JpdGVEYXRlKGUudXBkYXRlZEF0KTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz10LndyaXRlVmFySW50KGUuY3RyKTtpZihzIT09MClyZXR1cm4gYyhzKTtyZXR1cm4gcCh0LnJlc3VsdCgpKX1hc3luYyBmdW5jdGlvbiBfdChlLHQpe2xldCByPVtdO2ZvcihsZXQgbiBvZiBlKXtsZXRbcyxpXT1jbyhuKTtpZihpIT09MHx8IXMpcmV0dXJuIGMoaSk7ci5wdXNoKHMpfXJldHVybiBwKGF3YWl0IGh0KHIsdCkpfXZhciBSbD1TeW1ib2woIk1hc3RlclNlZWQiKSxMbD1TeW1ib2woIlNlYWxlZE1hc3RlcktleSIpLG1lPTMyLGFzPTI0K21lKzE2O2Z1bmN0aW9uIExlKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PWFzKXJldHVybiBjKDEwKTtyZXR1cm4gcChlKX12YXIgT2w9U3ltYm9sKCJFbnRpdHlJRCIpO2Z1bmN0aW9uIGNzKGUpe3JldHVybiJ0eXBlImluIGV9dmFyIFZsPVN5bWJvbCgiRGVyaXZhdGlvblNlZWQiKSxfbD1TeW1ib2woIlB1YmxpY0tleSIpLE5sPVN5bWJvbCgiUHJpdmF0ZUtleSIpLHFsPVN5bWJvbCgiSG9zdFNwZWNpZmljS2V5UGFpciIpLEZsPVN5bWJvbCgiSGFzaCIpO2Z1bmN0aW9uIHVvKGUpe2lmKCFlKXJldHVybiExO2lmKHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoImJvZHkiaW4gZT09PSExKXJldHVybiExO2lmKCJ0eXBlImluIGU9PT0hMSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBsbyhlKXtpZighZS5ib2R8fGUuYm9kLmxlbmd0aD09PTApe2xldCBuPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZH07cmV0dXJuIHAobil9bGV0IHQ9eHIoZS5ib2QpO2lmKHVvKHQpPT09ITEpcmV0dXJuIGNvbnNvbGUud2FybigibXNnIGJvZHkgaW52YWxpZCIsdCksYygxNCk7bGV0IHI9e29mZjplLm9mZixjdHI6ZS5jdHIsZWlkOmUuZWlkLGdpZDp0LmdpZCxwaWQ6dC5waWQsdGFnczp0LnRhZ3MsdHlwZTp0LnR5cGUsYm9keTp0LmJvZHl9O3JldHVybiBwKHIpfWNsYXNzIE50e2FwcGxpZXI7ZW1pdHRlcj1uZXcgZnQ7Y2xlYXJlcjtvbkRpcnR5RWlkcztjYWNoZURyaXZlbjtwZWVySW5nZXN0O2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuYXBwbGllcj1lO3RoaXMuY2xlYXJlcj10LHRoaXMub25EaXJ0eUVpZHM9cix0aGlzLmNhY2hlRHJpdmVuPW4/LmNhY2hlRHJpdmVuPz8hMSx0aGlzLnBlZXJJbmdlc3Q9bj8ucGVlckluZ2VzdH1hcHBseT1hc3luYyhlKT0+e2xldCB0PVtdLHI9W107Zm9yKGxldCBhIG9mIGUpe2xldFtkLHVdPWxvKGEpO2lmKHIucHVzaCh1KSx1IT09MCljb250aW51ZTt0LnB1c2goZCl9bGV0e3N0YXRzOm4sdHlwZXM6cyxlaWRzOml9PWF3YWl0IHRoaXMuYXBwbGllcih0KSxvPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgZD1yW2FdLHU9blthXTtpZihkIT09MCl7by5wdXNoKGQpO2NvbnRpbnVlfWlmKHUhPT0wKXtvLnB1c2godSk7Y29udGludWV9by5wdXNoKDApfWlmKCF0aGlzLmNhY2hlRHJpdmVuKWZvcihsZXQgYSBvZiBzKXRoaXMuZW1pdHRlci5lbWl0KGEsbnVsbCk7aWYoaS5sZW5ndGg+MCl0aGlzLm9uRGlydHlFaWRzPy4oaSk7cmV0dXJuIG99O2NsZWFyPWFzeW5jKCk9PntsZXQgZT1hd2FpdCB0aGlzLmNsZWFyZXIoKTtpZihlIT09MClyZXR1cm4gZTtyZXR1cm4gdGhpcy5lbWl0dGVyLmVtaXRBbGwobnVsbCksZX07bm90aWZ5PShlKT0+e2ZvcihsZXQgdCBvZiBlKXRoaXMuZW1pdHRlci5lbWl0KHQsbnVsbCl9O3JlZnJlc2g9YXN5bmMoZSk9PntpZih0aGlzLnBlZXJJbmdlc3Qpe2F3YWl0IHRoaXMucGVlckluZ2VzdChlKTtyZXR1cm59fTtvbj0oZSx0KT0+e3RoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKGUsdCl9O29mZj0oZSx0KT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl9fXZhciBqPSJlbnRpdGllcyIscXQ9ImVudGl0eV90eXBlX2NyZWF0ZWRfYXQiLE1yPSJlbnRpdHlfdHlwZV91cGRhdGVkX2F0IixScj0iZW50aXR5X3R5cGVfZ3JvdXBfaWQiLExyPSJlbnRpdHlfdHlwZV9wYXJlbnRfaWQiLFplPSJlbnRpdHlfdGFncyIsZHM9ImRiIix1cz0xMztmdW5jdGlvbiBmbyhlKXtyZXR1cm4idHlwImluIGV9ZnVuY3Rpb24gcG8oZSl7bGV0IHQ9e2JvZDplLmJvZHksY3JkOmUuY3JlYXRlZEF0LC4uLmUuY3RyIT09MD97Y3RyOmUuY3RyfTp7fSxlaWQ6QyhlLmVpZCksZ2lkOmUuZ2lkLHBpZDplLnBpZD9DKGUucGlkKTp2b2lkIDAsdGdzOmUudGFncyx0eXA6ZS50eXBlLHVwZDplLnVwZGF0ZWRBdH07aWYodC5naWQ9PT12b2lkIDApZGVsZXRlIHQuZ2lkO2lmKHQucGlkPT09dm9pZCAwKWRlbGV0ZSB0LnBpZDtpZih0LnRncz09PXZvaWQgMClkZWxldGUgdC50Z3M7aWYodC5jdHI9PT12b2lkIDApZGVsZXRlIHQuY3RyO3JldHVybiB0fWZ1bmN0aW9uIGhvKGUpe2lmKCFGKGUpKXJldHVybntlaWQ6QyhlLmVpZCksdXBkOmUudXBkYXRlZEF0LC4uLmUuY3RyIT09MD97Y3RyOmUuY3RyfTp7fX07cmV0dXJuIHBvKGUpfWZ1bmN0aW9uIEtlKGUpe3JldHVybntib2R5OmUuYm9kLGNyZWF0ZWRBdDplLmNyZCx1cGRhdGVkQXQ6ZS51cGQsY3RyOmUuY3RyPz8wLHR5cGU6ZS50eXAsZWlkOmZlKGUuZWlkKSxnaWQ6ZS5naWQscGlkOmUucGlkP2ZlKGUucGlkKTp2b2lkIDAsLi4uZS50Z3MhPT12b2lkIDA/e3RhZ3M6ZS50Z3N9Ont9fX1mdW5jdGlvbiBIcihlKXtpZihmbyhlKSlyZXR1cm4gS2UoZSk7cmV0dXJue2VpZDpmZShlLmVpZCksdXBkYXRlZEF0OmUudXBkLGN0cjplLmN0cj8/MH19ZnVuY3Rpb24geW8oZSx0KXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gSURCS2V5UmFuZ2Uub25seShbZSx0XSk7bGV0IHI9dC5yYW5nZTtyZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoW2Usci5zdGFydF0sW2Usci5lbmRdLHIuZXhjbHVkZVN0YXJ0PT09ITAsci5leGNsdWRlRW5kPT09ITApfWZ1bmN0aW9uIG1vKGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpcmV0dXJuIElEQktleVJhbmdlLm9ubHkoZSk7aWYoInJhbmdlImluIGUpe2xldCB0PWUucmFuZ2U7cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHQuc3RhcnQsdC5lbmQsdC5leGNsdWRlU3RhcnQ9PT0hMCx0LmV4Y2x1ZGVFbmQ9PT0hMCl9cmV0dXJuIElEQktleVJhbmdlLmJvdW5kKGUucHJlZml4LGUucHJlZml4KyLvv78iKX1mdW5jdGlvbiBnbyhlLHQscil7bGV0IG49W107aWYodHlwZW9mIHI9PT0ic3RyaW5nIil7Zm9yKGxldCBvIG9mIGUpaWYoby50eXA9PT10KW4ucHVzaChLZShvKSk7cmV0dXJuIG59bGV0IHM9bmV3IFNldCxpPSJwcmVmaXgiaW4gcj9yLnByZWZpeDp2b2lkIDA7Zm9yKGxldCBvIG9mIGUpe2lmKG8udHlwIT09dCljb250aW51ZTtpZihzLmhhcyhvLmVpZCkpY29udGludWU7aWYoaSE9PXZvaWQgMCl7bGV0IGE9by50Z3M7aWYoIWF8fCFhLnNvbWUoKGQpPT5kLnN0YXJ0c1dpdGgoaSkpKWNvbnRpbnVlfXMuYWRkKG8uZWlkKSxuLnB1c2goS2UobykpfXJldHVybiBufWNsYXNzIGxze2RiO29wZW5pbmc7YXN5bmMgaW5pdCgpe2F3YWl0IHRoaXMuZW5zdXJlRGIoKX1hc3luYyBlbnN1cmVEYigpe2lmKHRoaXMuZGIpcmV0dXJuIHRoaXMuZGI7aWYodGhpcy5vcGVuaW5nKXJldHVybiB0aGlzLm9wZW5pbmc7cmV0dXJuIHRoaXMub3BlbmluZz1ibygpLnRoZW4oKGUpPT4oZS5vbnZlcnNpb25jaGFuZ2U9KCk9PntpZihlLmNsb3NlKCksdGhpcy5kYj09PWUpdGhpcy5kYj12b2lkIDB9LHRoaXMuZGI9ZSx0aGlzLm9wZW5pbmc9dm9pZCAwLGUpLChlKT0+e3Rocm93IHRoaXMub3BlbmluZz12b2lkIDAsZX0pLHRoaXMub3BlbmluZ31hcHBseT1hc3luYyhlKT0+e2xldCB0PW5ldyBTZXQscj1bXSxuO3RyeXtuPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PjE2KSx0eXBlczp0LGVpZHM6cn19bGV0IHM9bi50cmFuc2FjdGlvbihqLCJyZWFkd3JpdGUiKSxpPXMub2JqZWN0U3RvcmUoaik7cmV0dXJuIG5ldyBQcm9taXNlKChvKT0+e2xldCBhPUFycmF5KGUubGVuZ3RoKS5maWxsKDApO2lmKGUubGVuZ3RoPDEpe28oe3N0YXRzOltdLHR5cGVzOnQsZWlkczpyfSk7cmV0dXJufXMub25jb21wbGV0ZT0oKT0+e28oe3N0YXRzOmEsdHlwZXM6dCxlaWRzOnJ9KX0scy5vbmVycm9yPSgpPT57Zm9yKGxldCB1PTA7dTxhLmxlbmd0aDt1KyspaWYoYVt1XT09PXZvaWQgMClhW3VdPTE4O28oe3N0YXRzOmEsdHlwZXM6dCxlaWRzOnJ9KX07bGV0IGQ9bmV3IE1hcDtmb3IobGV0IHU9MDt1PGUubGVuZ3RoO3UrKyl7bGV0IGw9ZVt1XSxmPUMobC5laWQpLGg9e29wOmwsaW5kZXg6dX0seT1kLmdldChmKTtpZih5KXkucHVzaChoKTtlbHNlIGQuc2V0KGYsW2hdKX1mb3IobGV0W3UsbF1vZiBkKXtpZihsLmxlbmd0aDwxKWNvbnRpbnVlO2xldCBmPWkuZ2V0KHUpO2Yub25zdWNjZXNzPSgpPT57bGV0IGg9Zi5yZXN1bHQseT1oP0hyKGgpOnZvaWQgMCxnPSExO2ZvcihsZXR7b3A6bSxpbmRleDpTfW9mIGwpe2xldFt4LGJdPWV0KHksbSk7aWYoYiE9PTApe2FbU109Yjtjb250aW51ZX1pZih4PT09dm9pZCAwKXthW1NdPTEyO2NvbnRpbnVlfWc9ITA7Zm9yKGxldCBFIG9mIHR0KHkseCkpdC5hZGQoRSk7eT14fWlmKGcpci5wdXNoKGxbMF0ub3AuZWlkKTtpZih5KXtsZXQgbT1pLnB1dChobyh5KSk7bS5vbmVycm9yPShTKT0+e1MucHJldmVudERlZmF1bHQoKTtmb3IobGV0e2luZGV4Onh9b2YgbClhW3hdPTE4fX19LGYub25lcnJvcj0oKT0+e2ZvcihsZXR7aW5kZXg6aH1vZiBsKWFbaF09MTh9fX0pfTthc3luYyBjbGVhcigpe2xldCBlO3RyeXtlPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gMTZ9bGV0IHQ9ZS50cmFuc2FjdGlvbihqLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoaik7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e3Qub25jb21wbGV0ZT0oKT0+bigwKSx0Lm9uZXJyb3I9KCk9Pm4oMTgpLHIuY2xlYXIoKX0pfWFzeW5jIGdldFJvdyhlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCByPUMoZSkscz10LnRyYW5zYWN0aW9uKGosInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoaik7cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPXMuZ2V0KHIpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoIWEpaShwKHZvaWQgMCkpO2Vsc2UgaShwKEhyKGEpKSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX1hc3luYyBnZXRFbnQoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRSb3coZSk7aWYociE9PTApcmV0dXJuIGMocik7aWYodD09PXZvaWQgMHx8IUYodCkpcmV0dXJuIHAodm9pZCAwKTtyZXR1cm4gcCh0KX1hc3luYyBnZXRCeVVwZGF0ZWRBdChlLHQpe2xldFtyLG5dPXl0KHQpO2lmKG4hPT0wKXJldHVybiBjKG4pO2lmKCFyKXJldHVybiBwKFtdKTtsZXQgczt0cnl7cz1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCBvPXMudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKS5pbmRleChNciksYT15byhlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgoZCk9PntsZXQgdT1vLmdldEFsbChhKTt1Lm9uc3VjY2Vzcz0oKT0+e2xldCBsPXUucmVzdWx0O2QocChsLm1hcChLZSkpKX0sdS5vbmVycm9yPSgpPT5kKGMoMTgpKX0pfWFzeW5jIGdldEdyb3VwTWVtYmVycyhlLHQpe2xldCByO3RyeXtyPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IHM9ci50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KFJyKTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89cy5nZXRBbGwoSURCS2V5UmFuZ2Uub25seShbZSx0XSkpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aShwKGEubWFwKEtlKSkpfSxvLm9uZXJyb3I9KCk9PmkoYygxOCkpfSl9YXN5bmMgZ2V0QWxsT2ZUeXBlKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG49dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KHF0KTtyZXR1cm4gbmV3IFByb21pc2UoKHMpPT57bGV0IGk9bi5nZXRBbGwoSURCS2V5UmFuZ2UuYm91bmQoW2VdLFtlLFtdXSkpO2kub25zdWNjZXNzPSgpPT57bGV0IG89aS5yZXN1bHQ7cyhwKG8ubWFwKEtlKSkpfSxpLm9uZXJyb3I9KCk9PnMoYygxOCkpfSl9YXN5bmMgZ2V0QnlUYWcoZSx0KXtsZXRbcixuXT1tdCh0KTtpZihuIT09MClyZXR1cm4gYyhuKTtpZighcilyZXR1cm4gcChbXSk7bGV0IHM7dHJ5e3M9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBjKDE2KX1sZXQgaT1tbyh0KSxhPXMudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKS5pbmRleChaZSk7cmV0dXJuIG5ldyBQcm9taXNlKChkKT0+e2xldCB1PWEuZ2V0QWxsKGkpO3Uub25zdWNjZXNzPSgpPT57bGV0IGw9dS5yZXN1bHQ7ZChwKGdvKGwsZSx0KSkpfSx1Lm9uZXJyb3I9KCk9PmQoYygxOCkpfSl9YXN5bmMgZ2V0QWxsRW50aXRpZXMoZSl7aWYoInBpZCJpbiBlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCByPUMoZS5waWQpLHM9dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KExyKTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89cy5nZXRBbGwoSURCS2V5UmFuZ2Uub25seShbZS50eXBlLHJdKSk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgZD1vLnJlc3VsdC5tYXAoS2UpO2kocChkKSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX1lbHNlIGlmKCJnaWQiaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRHcm91cE1lbWJlcnMoZS50eXBlLGUuZ2lkKTtlbHNlIGlmKCJ0YWciaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVRhZyhlLnR5cGUsZS50YWcpO2Vsc2UgaWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiBhd2FpdCB0aGlzLmdldEJ5VXBkYXRlZEF0KGUudHlwZSxlLnVwZGF0ZWRBdCk7cmV0dXJuIGF3YWl0IHRoaXMuZ2V0QWxsT2ZUeXBlKGUudHlwZSl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtyZXR1cm4gcCh0KX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKS5pbmRleChxdCk7cmV0dXJuIG5ldyBQcm9taXNlKChzKT0+e2xldCBpPUlEQktleVJhbmdlLmJvdW5kKFtlXSxbZSxbXV0pLG89bi5jb3VudChpKTtvLm9uc3VjY2Vzcz0oKT0+cyhwKG8ucmVzdWx0KSksby5vbmVycm9yPSgpPT5zKGMoMTgpKX0pfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG49dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLHM9W107cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPW4ub3BlbkN1cnNvcigpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoYSl7bGV0IGQ9YS52YWx1ZTtzLnB1c2goRnQoSHIoZCkpKSxhLmNvbnRpbnVlKCl9ZWxzZSBfdChzLGUpLnRoZW4oaSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX19ZnVuY3Rpb24gU28oZSx0KXtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGopKWUuY3JlYXRlT2JqZWN0U3RvcmUoaix7a2V5UGF0aDoiZWlkIixhdXRvSW5jcmVtZW50OiExfSk7bGV0IHI9dC5vYmplY3RTdG9yZShqKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKHF0KSlyLmNyZWF0ZUluZGV4KHF0LFsidHlwIiwiY3JkIl0se3VuaXF1ZTohMX0pO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoTXIpKXIuY3JlYXRlSW5kZXgoTXIsWyJ0eXAiLCJ1cGQiXSx7dW5pcXVlOiExfSk7aWYoIXIuaW5kZXhOYW1lcy5jb250YWlucyhScikpci5jcmVhdGVJbmRleChScixbInR5cCIsImdpZCJdLHt1bmlxdWU6ITF9KTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKExyKSlyLmNyZWF0ZUluZGV4KExyLFsidHlwIiwicGlkIl0se3VuaXF1ZTohMX0pO2lmKHIuaW5kZXhOYW1lcy5jb250YWlucyhaZSkpe2lmKHIuaW5kZXgoWmUpLmtleVBhdGghPT0idGdzIilyLmRlbGV0ZUluZGV4KFplKX1pZighci5pbmRleE5hbWVzLmNvbnRhaW5zKFplKSlyLmNyZWF0ZUluZGV4KFplLCJ0Z3MiLHt1bmlxdWU6ITEsbXVsdGlFbnRyeTohMH0pfWZ1bmN0aW9uIGJvKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57bGV0IHI9aW5kZXhlZERCLm9wZW4oZHMsdXMpO3Iub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpuLHRyYW5zYWN0aW9uOnN9PXI7aWYoIXMpe3QoRXJyb3IoIlRyYW5zYWN0aW9uIGlzIG51bGwgZHVyaW5nIEVudERCIHVwZ3JhZGUiKSk7cmV0dXJufXRyeXtTbyhuLHMpfWNhdGNoKGkpe3QoaSBpbnN0YW5jZW9mIEVycm9yP2k6RXJyb3IoU3RyaW5nKGkpKSl9fSxyLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIEVudERCIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7ZHN9IOKGkiB2JHt1c30pOyB3YWl0aW5nIGZvciBvdGhlciBjb25uZWN0aW9ucyB0byBjbG9zZWApfSxyLm9uc3VjY2Vzcz0oKT0+ZShyLnJlc3VsdCksci5vbmVycm9yPSgpPT50KHIuZXJyb3I/P0Vycm9yKCJFbnREQiBJbmRleGVkREIgb3BlbiBmYWlsZWQiKSl9KX1hc3luYyBmdW5jdGlvbiBmcygpe2xldCBlPW5ldyBscztyZXR1cm4gYXdhaXQgZS5pbml0KCksZX1jbGFzcyBWcntlbnRzPW5ldyBNYXA7dXNlSW5kZXg7YnlUeXBlPW5ldyBNYXA7YnlUeXBlUGlkPW5ldyBNYXA7YnlUeXBlR2lkPW5ldyBNYXA7YnlUeXBlVGFnPW5ldyBNYXA7Y29uc3RydWN0b3IoZT1bXSx0KXt0aGlzLnVzZUluZGV4PXQ/LmluZGV4ZXMhPT0hMTtmb3IobGV0IHIgb2YgZSl0aGlzLnB1dChyKX1wdXQoZSl7bGV0IHQ9QyhlLmVpZCkscj10aGlzLmVudHMuZ2V0KHQpO2lmKHIhPT12b2lkIDAmJkYocikpdGhpcy51bmluZGV4KHQscik7aWYodGhpcy5lbnRzLnNldCh0LGUpLEYoZSkpdGhpcy5pbmRleCh0LGUpfWRlbChlKXtsZXQgdD10aGlzLmVudHMuZ2V0KGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuO2lmKEYodCkpdGhpcy51bmluZGV4KGUsdCk7dGhpcy5lbnRzLmRlbGV0ZShlKX1pbmRleChlLHQpe2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgcj10aGlzLmJ5VHlwZS5nZXQodC50eXBlKTtpZighcilyPW5ldyBNYXAsdGhpcy5ieVR5cGUuc2V0KHQudHlwZSxyKTtpZihyLnNldChlLHQpLHQucGlkKXtsZXQgbj1DKHQucGlkKSxzPXRoaXMuYnlUeXBlUGlkLmdldCh0LnR5cGUpO2lmKCFzKXM9bmV3IE1hcCx0aGlzLmJ5VHlwZVBpZC5zZXQodC50eXBlLHMpO2xldCBpPXMuZ2V0KG4pO2lmKCFpKWk9bmV3IE1hcCxzLnNldChuLGkpO2kuc2V0KGUsdCl9aWYodHlwZW9mIHQuZ2lkPT09InN0cmluZyIpe2xldCBuPXRoaXMuYnlUeXBlR2lkLmdldCh0LnR5cGUpO2lmKCFuKW49bmV3IE1hcCx0aGlzLmJ5VHlwZUdpZC5zZXQodC50eXBlLG4pO2xldCBzPW4uZ2V0KHQuZ2lkKTtpZighcylzPW5ldyBNYXAsbi5zZXQodC5naWQscyk7cy5zZXQoZSx0KX1pZih0LnRhZ3Mpe2xldCBuPXRoaXMuYnlUeXBlVGFnLmdldCh0LnR5cGUpO2lmKCFuKW49bmV3IE1hcCx0aGlzLmJ5VHlwZVRhZy5zZXQodC50eXBlLG4pO2ZvcihsZXQgcyBvZiB0LnRhZ3Mpe2xldCBpPW4uZ2V0KHMpO2lmKCFpKWk9bmV3IE1hcCxuLnNldChzLGkpO2kuc2V0KGUsdCl9fX11bmluZGV4KGUsdCl7aWYoIXRoaXMudXNlSW5kZXgpcmV0dXJuO2xldCByPXRoaXMuYnlUeXBlLmdldCh0LnR5cGUpO2lmKHIpe2lmKHIuZGVsZXRlKGUpLHIuc2l6ZT09PTApdGhpcy5ieVR5cGUuZGVsZXRlKHQudHlwZSl9aWYodC5waWQpe2xldCBuPUModC5waWQpLHM9dGhpcy5ieVR5cGVQaWQuZ2V0KHQudHlwZSksaT1zPy5nZXQobik7aWYoaSl7aWYoaS5kZWxldGUoZSksaS5zaXplPT09MClzPy5kZWxldGUobil9aWYocyYmcy5zaXplPT09MCl0aGlzLmJ5VHlwZVBpZC5kZWxldGUodC50eXBlKX1pZih0eXBlb2YgdC5naWQ9PT0ic3RyaW5nIil7bGV0IG49dGhpcy5ieVR5cGVHaWQuZ2V0KHQudHlwZSkscz1uPy5nZXQodC5naWQpO2lmKHMpe2lmKHMuZGVsZXRlKGUpLHMuc2l6ZT09PTApbj8uZGVsZXRlKHQuZ2lkKX1pZihuJiZuLnNpemU9PT0wKXRoaXMuYnlUeXBlR2lkLmRlbGV0ZSh0LnR5cGUpfWlmKHQudGFncyl7bGV0IG49dGhpcy5ieVR5cGVUYWcuZ2V0KHQudHlwZSk7aWYobil7Zm9yKGxldCBzIG9mIHQudGFncyl7bGV0IGk9bi5nZXQocyk7aWYoaSl7aWYoaS5kZWxldGUoZSksaS5zaXplPT09MCluLmRlbGV0ZShzKX19aWYobi5zaXplPT09MCl0aGlzLmJ5VHlwZVRhZy5kZWxldGUodC50eXBlKX19fWNsZWFySW5kZXhlcygpe3RoaXMuYnlUeXBlLmNsZWFyKCksdGhpcy5ieVR5cGVQaWQuY2xlYXIoKSx0aGlzLmJ5VHlwZUdpZC5jbGVhcigpLHRoaXMuYnlUeXBlVGFnLmNsZWFyKCl9YnVja2V0TGlzdChlKXtpZighZXx8ZS5zaXplPT09MClyZXR1cm5bXTtsZXQgdD1bXTtmb3IobGV0IHIgb2YgZS52YWx1ZXMoKSl0LnB1c2gocik7cmV0dXJuIHR9YnlUYWdTcGVjKGUsdCl7bGV0W3Isbl09bXQodCk7aWYobiE9PTApcmV0dXJuIGMobik7aWYoIXIpcmV0dXJuIHAoW10pO2lmKHR5cGVvZiB0PT09InN0cmluZyIpcmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlVGFnLmdldChlKT8uZ2V0KHQpKSk7bGV0IHM9dGhpcy5ieVR5cGVUYWcuZ2V0KGUpO2lmKCFzKXJldHVybiBwKFtdKTtsZXQgaT1uZXcgU2V0LG89W107Zm9yKGxldFthLGRdb2Ygcyl7aWYoIU9yKGEsdCkpY29udGludWU7Zm9yKGxldFt1LGxdb2YgZCl7aWYoaS5oYXModSkpY29udGludWU7aS5hZGQodSksby5wdXNoKGwpfX1yZXR1cm4gcChvKX1ieURhdGVTcGVjKGUsdCl7bGV0W3Isbl09eXQodCk7aWYobiE9PTApcmV0dXJuIGMobik7aWYoIXIpcmV0dXJuIHAoW10pO2xldCBzPVtdLGk9dGhpcy5ieVR5cGUuZ2V0KGUpO2lmKGkpe2ZvcihsZXQgbyBvZiBpLnZhbHVlcygpKWlmKEtyKG8udXBkYXRlZEF0LHQpKXMucHVzaChvKX1yZXR1cm4gcChzKX1hc3luYyBhcHBseShlKXtsZXQgdD1uZXcgU2V0LHI9W10sbj1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IGk9QyhzLmVpZCksbz10aGlzLmVudHMuZ2V0KGkpLFthLGRdPWV0KG8scyk7aWYoZCE9PTApe24ucHVzaChkKTtjb250aW51ZX1pZihhPT09dm9pZCAwKXtuLnB1c2goMTIpO2NvbnRpbnVlfWZvcihsZXQgdSBvZiB0dChvLGEpKXQuYWRkKHUpO3RoaXMucHV0KGEpLHIucHVzaChzLmVpZCksbi5wdXNoKDApfXJldHVybntzdGF0czpuLHR5cGVzOnQsZWlkczpyfX1hc3luYyBjbGVhcigpe3JldHVybiB0aGlzLmVudHMuY2xlYXIoKSx0aGlzLmNsZWFySW5kZXhlcygpLDB9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUMoZSkscj10aGlzLmVudHMuZ2V0KHQpO3JldHVybiBwKHIpfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhRih0KSlyZXR1cm4gcCh2b2lkIDApO3JldHVybiBwKHQpfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2xldHt0eXBlOnR9PWU7aWYodGhpcy51c2VJbmRleCl7aWYoInBpZCJpbiBlKXtsZXQgbj1DKGUucGlkKTtyZXR1cm4gcCh0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVQaWQuZ2V0KHQpPy5nZXQobikpKX1pZigiZ2lkImluIGUpcmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlR2lkLmdldCh0KT8uZ2V0KGUuZ2lkKSkpO2lmKCJ0YWciaW4gZSlyZXR1cm4gdGhpcy5ieVRhZ1NwZWModCxlLnRhZyk7aWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiB0aGlzLmJ5RGF0ZVNwZWModCxlLnVwZGF0ZWRBdCk7cmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlLmdldCh0KSkpfWxldCByPVtdO2lmKCJwaWQiaW4gZSl7Zm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihGKG4pJiZuLnR5cGU9PT10JiZuLnBpZCYmWChuLnBpZCxlLnBpZCkpci5wdXNoKG4pfWVsc2UgaWYoImdpZCJpbiBlKXtmb3IobGV0IG4gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEYobikmJm4udHlwZT09PXQmJih0eXBlb2Ygbi5naWQ9PT0ic3RyaW5nIiYmbi5naWQ9PT1lLmdpZCkpci5wdXNoKG4pfWVsc2UgaWYoInRhZyJpbiBlKXtsZXQgbj1lLnRhZyxbcyxpXT1tdChuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZighcylyZXR1cm4gcChyKTtmb3IobGV0IG8gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEYobykmJm8udHlwZT09PXQmJm8udGFncyYmby50YWdzLnNvbWUoKGEpPT5PcihhLG4pKSlyLnB1c2gobyl9ZWxzZSBpZigidXBkYXRlZEF0ImluIGUpe2xldCBuPWUudXBkYXRlZEF0LFtzLGldPXl0KG4pO2lmKGkhPT0wKXJldHVybiBjKGkpO2lmKCFzKXJldHVybiBwKHIpO2ZvcihsZXQgbyBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRihvKSYmby50eXBlPT09dCYmS3Ioby51cGRhdGVkQXQsbikpci5wdXNoKG8pfWVsc2UgZm9yKGxldCBuIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihGKG4pJiZuLnR5cGU9PT10KXIucHVzaChuKTtyZXR1cm4gcChyKX1hc3luYyBnZXRFbnRpdGllcyhlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldEFsbEVudGl0aWVzKGUpO2lmKHIhPT0wKXJldHVybiBjKHIpO3JldHVybiBwKHQpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2lmKHRoaXMudXNlSW5kZXgpcmV0dXJuIHAodGhpcy5ieVR5cGUuZ2V0KGUpPy5zaXplPz8wKTtsZXQgdD0wO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRihyKSYmci50eXBlPT09ZSl0Kz0xO3JldHVybiBwKHQpfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0PVtdO2ZvcihsZXQgciBvZiB0aGlzLmVudHMudmFsdWVzKCkpdC5wdXNoKEZ0KHIpKTtyZXR1cm4gX3QodCxlKX19YXN5bmMgZnVuY3Rpb24geXMoZSl7bGV0IHQ9YXdhaXQgZnMoKTtpZihlPy5jYWNoZT09PSExKXJldHVybiB0O3JldHVybiBuZXcgX3IodCx2b2lkIDAse2luZGV4ZXM6ZT8uaW5kZXhlc30pfWNsYXNzIF9ye21lbTtkdXJhYmxlO3dhcm1lZD1uZXcgU2V0O2xpc3RlbmVycz1uZXcgU2V0O2NoYWluPVByb21pc2UucmVzb2x2ZSgpO2NvbnN0cnVjdG9yKGUsdCxyKXtpZih0aGlzLmR1cmFibGU9ZSx0aGlzLm1lbT1uZXcgVnIodD8/W10se2luZGV4ZXM6cj8uaW5kZXhlc30pLHQpZm9yKGxldCBuIG9mIHQpdGhpcy53YXJtZWQuYWRkKG4udHlwZSl9c3Vic2NyaWJlKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5hZGQoZSksKCk9Pnt0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSl7aWYoZS5zaXplPDEpcmV0dXJuO2ZvcihsZXQgdCBvZiB0aGlzLmxpc3RlbmVycyl0KGUpfXJ1bihlKXtsZXQgdD10aGlzLmNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5jaGFpbj10LnRoZW4oKCk9PntyZXR1cm59LCgpPT57cmV0dXJufSksdH1hcHBseShlKXt0aGlzLmVtaXQoUG8odGhpcy5tZW0sZSkudHlwZXMpO2xldCB0PW5ldyBNYXA7Zm9yKGxldCByIG9mIGUpe2xldCBuPUMoci5laWQpO3Quc2V0KG4saHModGhpcy5tZW0uZW50cy5nZXQobikpKX1yZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2xldCByPWF3YWl0IHRoaXMuZHVyYWJsZS5hcHBseShlKSx7Y2hhbmdlZDpuLHN0YXR1czpzfT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUubWFwKChpKT0+aS5laWQpLHQpO2lmKHRoaXMuZW1pdChuKSxzIT09MClyZXR1cm57c3RhdHM6ZS5tYXAoKCk9PnMpLHR5cGVzOnIudHlwZXMsZWlkczpyLmVpZHN9O3JldHVybiByfSl9Y2xlYXIoKXtyZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2xldCBlPWF3YWl0IHRoaXMuZHVyYWJsZS5jbGVhcigpO2lmKGUhPT0wKXJldHVybiBlO2xldCB0PXRoaXMubWVtLmVudHMuc2l6ZT4wO3JldHVybiBhd2FpdCB0aGlzLm1lbS5jbGVhcigpLHRoaXMud2FybWVkLmNsZWFyKCksMH0pfWluZ2VzdEZyb21EdXJhYmxlKGUpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0e2NoYW5nZWQ6dCxzdGF0dXM6cn09YXdhaXQgdGhpcy5wdWxsRWlkcyhlKTtyZXR1cm4gdGhpcy5lbWl0KHQpLHJ9KX1hc3luYyBwdWxsRWlkcyhlLHQpe2xldCByPW5ldyBTZXQsbj1uZXcgU2V0O2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1DKHMpO2lmKG4uaGFzKGkpKWNvbnRpbnVlO24uYWRkKGkpO2xldFtvLGFdPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3cocyk7aWYoYSE9PTApcmV0dXJue2NoYW5nZWQ6cixzdGF0dXM6YX07bGV0IGQ9dGhpcy5tZW0uZW50cy5nZXQoaSk7aWYodCl7aWYoIUFvKGhzKGQpLHQuZ2V0KGkpKSljb250aW51ZX1lbHNlIGlmKGQhPT12b2lkIDAmJm8hPT12b2lkIDAmJnBzKGQsbykpY29udGludWU7aWYobyl7aWYodGhpcy5tZW0ucHV0KG8pLCFkfHwhd28oZCxvKSl7aWYoRihvKSlyLmFkZChvLnR5cGUpO2lmKGQhPT12b2lkIDAmJkYoZCkpci5hZGQoZC50eXBlKX19ZWxzZSBpZihkIT09dm9pZCAwKXtpZih0aGlzLm1lbS5kZWwoaSksRihkKSlyLmFkZChkLnR5cGUpfX1yZXR1cm57Y2hhbmdlZDpyLHN0YXR1czowfX1hc3luYyB3YXJtVHlwZShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIDA7bGV0W3Qscl09YXdhaXQgdGhpcy5kdXJhYmxlLmdldEVudGl0aWVzKHt0eXBlOmV9KTtpZihyIT09MClyZXR1cm4gcjtpZih0KWZvcihsZXQgbiBvZiB0KXtsZXQgcz1DKG4uZWlkKSxpPXRoaXMubWVtLmVudHMuZ2V0KHMpO2lmKCFpfHxwcyhuLGkpKXRoaXMubWVtLnB1dChuKX1yZXR1cm4gdGhpcy53YXJtZWQuYWRkKGUpLDB9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUMoZSk7aWYodGhpcy5tZW0uZW50cy5oYXModCkpcmV0dXJuIHRoaXMubWVtLmdldFJvdyhlKTtyZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2lmKHRoaXMubWVtLmVudHMuaGFzKHQpKXJldHVybiB0aGlzLm1lbS5nZXRSb3coZSk7bGV0W3Isbl09YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyKXRoaXMubWVtLnB1dChyKTtyZXR1cm4gcChyKX0pfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhRih0KSlyZXR1cm4gcCh2b2lkIDApO3JldHVybiBwKHQpfWFzeW5jIGdldEVudGl0aWVzKGUpe2lmKCF0aGlzLndhcm1lZC5oYXMoZS50eXBlKSl7bGV0IHQ9YXdhaXQgdGhpcy5ydW4oKCk9PnRoaXMud2FybVR5cGUoZS50eXBlKSk7aWYodCE9PTApcmV0dXJuIGModCl9cmV0dXJuIHRoaXMubWVtLmdldEVudGl0aWVzKGUpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2lmKCF0aGlzLndhcm1lZC5oYXMoZSkpe2xldCB0PWF3YWl0IHRoaXMucnVuKCgpPT50aGlzLndhcm1UeXBlKGUpKTtpZih0IT09MClyZXR1cm4gYyh0KX1yZXR1cm4gdGhpcy5tZW0uY291bnRFbnRpdGllcyh7dHlwZTplfSl9YXN5bmMgY2hlY2tzdW0oZSl7cmV0dXJuIHRoaXMuZHVyYWJsZS5jaGVja3N1bShlKX19ZnVuY3Rpb24gd28oZSx0KXtpZihGKGUpIT09Rih0KSlyZXR1cm4hMTtpZihlLmN0ciE9PXQuY3RyKXJldHVybiExO2lmKGUudXBkYXRlZEF0LmdldFRpbWUoKSE9PXQudXBkYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZighWChlLmVpZCx0LmVpZCkpcmV0dXJuITE7aWYoIUYoZSl8fCFGKHQpKXJldHVybiEwO2lmKGUuY3JlYXRlZEF0LmdldFRpbWUoKSE9PXQuY3JlYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZihlLnR5cGUhPT10LnR5cGUpcmV0dXJuITE7aWYoZS5naWQhPT10LmdpZClyZXR1cm4hMTtpZigheG8oZS5waWQsdC5waWQpKXJldHVybiExO2lmKCFJbyhlLnRhZ3MsdC50YWdzKSlyZXR1cm4hMTtyZXR1cm4gRW8oZS5ib2R5LHQuYm9keSl9ZnVuY3Rpb24gSW8oZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXSE9PXRbcl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24geG8oZSx0KXtpZihlPT09dm9pZCAwJiZ0PT09dm9pZCAwKXJldHVybiEwO2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuITE7cmV0dXJuIFgoZSx0KX1mdW5jdGlvbiBFbyhlLHQpe2lmKE9iamVjdC5pcyhlLHQpKXJldHVybiEwO2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZ0IGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gWChlLHQpO2lmKGUgaW5zdGFuY2VvZiBEYXRlJiZ0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gZS5nZXRUaW1lKCk9PT10LmdldFRpbWUoKTt0cnl7cmV0dXJuIFgoTWUoZSksTWUodCkpfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBwcyhlLHQpe2xldCByPWUudXBkYXRlZEF0LmdldFRpbWUoKSxuPXQudXBkYXRlZEF0LmdldFRpbWUoKTtpZihyIT09bilyZXR1cm4gcj5uO3JldHVybiBlLmN0cj50LmN0cn1mdW5jdGlvbiBocyhlKXtpZihlPT09dm9pZCAwKXJldHVybjtyZXR1cm57dDplLnVwZGF0ZWRBdC5nZXRUaW1lKCksY3RyOmUuY3RyfX1mdW5jdGlvbiBBbyhlLHQpe2lmKGU9PT12b2lkIDB8fHQ9PT12b2lkIDApcmV0dXJuIGU9PT10O3JldHVybiBlLnQ9PT10LnQmJmUuY3RyPT09dC5jdHJ9ZnVuY3Rpb24gUG8oZSx0KXtsZXQgcj1uZXcgU2V0LG49W107Zm9yKGxldCBzIG9mIHQpe2xldCBpPUMocy5laWQpLG89ZS5lbnRzLmdldChpKSxbYSxkXT1ldChvLHMpO2lmKGQhPT0wKXtuLnB1c2goZCk7Y29udGludWV9aWYoYT09PXZvaWQgMCl7bi5wdXNoKDEyKTtjb250aW51ZX1mb3IobGV0IHUgb2YgdHQobyxhKSlyLmFkZCh1KTtlLnB1dChhKSxuLnB1c2goMCl9cmV0dXJue3N0YXRzOm4sdHlwZXM6cn19ZnVuY3Rpb24gRihlKXtyZXR1cm4idHlwZSJpbiBlfWZ1bmN0aW9uIFVvKGUsdCl7bGV0IHI9dC5leGNsdWRlU3RhcnQ/ZT50LnN0YXJ0OmU+PXQuc3RhcnQsbj10LmV4Y2x1ZGVFbmQ/ZTx0LmVuZDplPD10LmVuZDtyZXR1cm4gciYmbn1mdW5jdGlvbiB5dChlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gcCghMCk7aWYoZS5yYW5nZS5zdGFydD5lLnJhbmdlLmVuZClyZXR1cm4gYygxMCk7cmV0dXJuIHAoITApfWZ1bmN0aW9uIEtyKGUsdCl7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7cmV0dXJuIFVvKGUsdC5yYW5nZSl9ZnVuY3Rpb24gQm8oZSx0KXtsZXQgcj10LmV4Y2x1ZGVTdGFydD9lPnQuc3RhcnQ6ZT49dC5zdGFydCxuPXQuZXhjbHVkZUVuZD9lPHQuZW5kOmU8PXQuZW5kO3JldHVybiByJiZufWZ1bmN0aW9uIG10KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpcmV0dXJuIHAoZS5sZW5ndGg+MCk7aWYoInJhbmdlImluIGUpe2lmKGUucmFuZ2Uuc3RhcnQ+ZS5yYW5nZS5lbmQpcmV0dXJuIGMoMTApO3JldHVybiBwKCEwKX1yZXR1cm4gcChlLnByZWZpeC5sZW5ndGg+MCl9ZnVuY3Rpb24gT3IoZSx0KXtpZih0eXBlb2YgdD09PSJzdHJpbmciKXJldHVybiBlPT09dDtpZigicmFuZ2UiaW4gdClyZXR1cm4gQm8oZSx0LnJhbmdlKTtpZih0LnByZWZpeC5sZW5ndGg9PT0wKXJldHVybiExO3JldHVybiBlLnN0YXJ0c1dpdGgodC5wcmVmaXgpfWZ1bmN0aW9uIGtvKGUpe2lmKCFBcnJheS5pc0FycmF5KGUpfHxlLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PW5ldyBTZXQscj1bXTtmb3IobGV0IG4gb2YgZSl7aWYodHlwZW9mIG4hPT0ic3RyaW5nInx8bi5sZW5ndGg9PT0wKWNvbnRpbnVlO2lmKHQuaGFzKG4pKWNvbnRpbnVlO3QuYWRkKG4pLHIucHVzaChuKX1yZXR1cm4gci5sZW5ndGg+MD9yOnZvaWQgMH1mdW5jdGlvbiBGdChlKXtyZXR1cm57ZWlkOmUuZWlkLGN0cjplLmN0cix1cGRhdGVkQXQ6ZS51cGRhdGVkQXR9fWZ1bmN0aW9uIG1zKGUpe2xldCB0PW5ldyBMKGUuZWlkKSxbcixuXT10LnJlYWRTdHJ1Y3QoYWUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3JldHVybiBwKHtlaWQ6ZS5laWQsY3RyOmUuY3RyLHVwZGF0ZWRBdDpuZXcgRGF0ZShyLnRzLmdldFRpbWUoKStlLm9mZil9KX1mdW5jdGlvbiBldChlLHQpe2xldCByPW5ldyBMKHQuZWlkKSxbbixzXT1yLnJlYWRTdHJ1Y3QoYWUpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBpPW5ldyBEYXRlKG4udHMuZ2V0VGltZSgpK3Qub2ZmKTtpZihlIT09dm9pZCAwJiZpPD1lLnVwZGF0ZWRBdClyZXR1cm4gYygxNSk7aWYoY3ModCkpe2xldCBvPWtvKHQudGFncyk7cmV0dXJuIHAoe2VpZDp0LmVpZCxnaWQ6dC5naWQscGlkOnQucGlkLC4uLm8hPT12b2lkIDA/e3RhZ3M6b306e30sdHlwZTp0LnR5cGUsY3JlYXRlZEF0Om4udHMsdXBkYXRlZEF0OmksY3RyOnQuY3RyLGJvZHk6dC5ib2R5fSl9cmV0dXJuIHAoe2VpZDp0LmVpZCx1cGRhdGVkQXQ6aSxjdHI6dC5jdHJ9KX1mdW5jdGlvbiB0dChlLHQpe2xldCByPW5ldyBTZXQ7aWYoZSE9PXZvaWQgMCYmRihlKSlyLmFkZChlLnR5cGUpO2lmKEYodCkpci5hZGQodC50eXBlKTtyZXR1cm5bLi4ucl19Y2xhc3MgV3R7aW5mbGlnaHQ9bnVsbDthZ2Fpbj0hMTtydW4oZSl7aWYodGhpcy5hZ2Fpbj0hMCx0aGlzLmluZmxpZ2h0KXJldHVybiB0aGlzLmluZmxpZ2h0O3JldHVybiB0aGlzLmluZmxpZ2h0PXRoaXMuZHJhaW4oZSksdGhpcy5pbmZsaWdodH1hc3luYyBmbHVzaCgpe2lmKCF0aGlzLmluZmxpZ2h0KXJldHVybjt0cnl7YXdhaXQgdGhpcy5pbmZsaWdodH1jYXRjaHt9fWFzeW5jIGRyYWluKGUpe3RyeXt0aGlzLmFnYWluPSExO2xldCB0PWF3YWl0IGUoKTt3aGlsZSh0aGlzLmFnYWluKXRoaXMuYWdhaW49ITEsdD1hd2FpdCBlKCk7cmV0dXJuIHR9ZmluYWxseXt0aGlzLmluZmxpZ2h0PW51bGx9fX12YXIgZ3M9MTAwO2NsYXNzIE5ye3RpbWVyPW51bGw7ZGVsYXlNczt3b3JrO3RhaWw9bmV3IFd0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kZWxheU1zPWU8MD8wOmUsdGhpcy53b3JrPXR9c2NoZWR1bGUoKXtpZih0aGlzLmRlbGF5TXM8PTApe3RoaXMuZmlyZSgpO3JldHVybn1pZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lcik7dGhpcy50aW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy50aW1lcj1udWxsLHRoaXMuZmlyZSgpfSx0aGlzLmRlbGF5TXMpfWFzeW5jIGZsdXNoKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKTthd2FpdCB0aGlzLnRhaWwuZmx1c2goKX1jYW5jZWwoKXtpZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj1udWxsfWZpcmUoKXtyZXR1cm4gdGhpcy50YWlsLnJ1bih0aGlzLndvcmspfX1mdW5jdGlvbiBTcyhlKXtsZXQgdD1uZXcgTChlLmVpZCksW3Isbl09YWUuZGVjb2RlKHQpO2lmKG4hPT0wKXJldHVybjtyZXR1cm4gci50cy5nZXRUaW1lKCkrZS5vZmZ9ZnVuY3Rpb24gdm8oZSx0KXtsZXQgcj1TcyhlKSxuPVNzKHQpO2lmKHI9PT12b2lkIDAmJm49PT12b2lkIDApcmV0dXJuIDA7aWYocj09PXZvaWQgMClyZXR1cm4gMTtpZihuPT09dm9pZCAwKXJldHVybi0xO2lmKG4hPT1yKXJldHVybiBuLXI7cmV0dXJuIHQuY3RyLWUuY3RyfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIGUuc2xpY2UoKS5zb3J0KChyLG4pPT52byh0KHIpLHQobikpKX12YXIgcXI9e3BoYXNlOiJpZGxlIn0sZ3Q9NTA7ZnVuY3Rpb24gRnIoZSx0LHIpe2lmKGU8PTB8fHQ8PTApcmV0dXJuITE7aWYoZT09PTF8fGU9PT10KXJldHVybiEwO3JldHVybiBlJXI9PT0wfWZ1bmN0aW9uIGJzKGUsdCl7aWYodHlwZW9mIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iPT09ImZ1bmN0aW9uIil7bmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoZSx0KTtyZXR1cm59bGV0IHI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtuLmhyZWY9cixuLmRvd25sb2FkPXQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSxuLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKSxVUkwucmV2b2tlT2JqZWN0VVJMKHIpfWZ1bmN0aW9uIHdzKGUsdCxyKXtsZXQgbj1bXSxzPVtdLGk9MDtmb3IobGV0IG8gb2YgZSl7bGV0IGE9dChvKTtpZihzLmxlbmd0aD4wJiZpK2E+ciluLnB1c2gocykscz1bXSxpPTA7aWYocy5wdXNoKG8pLGkrPWEsaT49ciluLnB1c2gocykscz1bXSxpPTB9aWYocy5sZW5ndGg+MCluLnB1c2gocyk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gV3IoZSx0LHIpe2xldCBuPWUubGVuZ3RoO2lmKG48MSlyZXR1cm5bXTtsZXQgcz1BcnJheShuKSxpPTAsbz1NYXRoLm1pbihNYXRoLm1heCgxLHQpLG4pLGE9YXN5bmMoKT0+e3doaWxlKCEwKXtsZXQgdT1pO2lmKGkrPTEsdT49bilyZXR1cm47c1t1XT1hd2FpdCByKGVbdV0sdSl9fSxkPVtdO2ZvcihsZXQgdT0wO3U8bzt1KyspZC5wdXNoKGEoKSk7cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGQpLHN9YXN5bmMgZnVuY3Rpb24genQoZSx0LHIsbil7bGV0IHM9bmV3IEwoZS5oZWFkQ3BoKSxbaSxvXT1zLnJlYWRTdHJ1Y3QoTXQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldHtzaWc6YSxrZG06ZCxoZWFkQ3BoOnV9PWk7aWYoIWF3YWl0IG4uY2hlY2tTaWdFZDI1NTE5KGEsdSx0KSlyZXR1cm4gYygzKTtsZXQgZj1yLmRlcml2ZUNpcGhlcihkLCJkZWNyeXB0IiksaDt0cnl7aD1hd2FpdCBmLmRlY3J5cHQodSl9Y2F0Y2h7cmV0dXJuIGMoMjApfXJldHVybiBwKHtrZG06ZCxoZWFkRW5jOmh9KX12YXIgc3Q9ImYiLFh0PSJ0IixudD0iZSI7ZnVuY3Rpb24gRG8oZSl7aWYoZT09PSEwfHxlPT09WHQpcmV0dXJuIFh0O2lmKGU9PT1udClyZXR1cm4gbnQ7cmV0dXJuIHN0fWZ1bmN0aW9uIElzKGUpe3JldHVybiBlIT09MCYmZSE9PTE1JiZlIT09MTgmJmUhPT0xN31mdW5jdGlvbiB6cihlLHQscil7aWYoZS5hcGxkPXQsdD09PW50JiZyIT09dm9pZCAwKWUuZXJyPXI7ZWxzZSBkZWxldGUgZS5lcnJ9YXN5bmMgZnVuY3Rpb24ganQoZSx0LHIsbil7bGV0IHM9bj8uYm9keSE9PSExLGk9RG8odC5hcGxkKSxvPXQuYm9keSxhPW8/Lmxlbmd0aD8/MCxkO2lmKHMmJm8mJmE+MClkPWF3YWl0IHIuYmxha2UzKG8pO2xldCB1PXtlaWQ6dC5laWQsb2ZmOnQub2ZmPz8wLGN0cjp0LmN0cj8/MCxsZW46YSxoc2g6ZH0sbD17aGFzaDplLGhlYWQ6dSxhcGxkOml9O2lmKHMmJm8hPT12b2lkIDApbC5ib2R5PW87aWYoaT09PW50JiZ0LmVyciE9PXZvaWQgMClsLmVycj10LmVycjtyZXR1cm4gbH12YXIgWHI9MTA0ODU3Nixqcj0xMDQ4NTc2LEVzPTY0O2Z1bmN0aW9uIENvKGUpe3JldHVybiBlLnNpZy5sZW5ndGgrZS5rZG0ubGVuZ3RoK2UuaGVhZENwaC5sZW5ndGgrZS5ib2R5Q3BoLmxlbmd0aH1hc3luYyBmdW5jdGlvbiBUbyhlLHQscixuLHMpe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIDA7bGV0W2ksb109YXdhaXQgZS5wdXNoKG4pO2lmKG8hPT0wKXJldHVybiBvO2lmKCFpKXJldHVybiAyNztmb3IobGV0IGQgb2YgaSl7aWYoZC5zdGF0dXMhPT0wKXtjb25zb2xlLmVycm9yKCJwdXNoIGVyciIsZCk7Y29udGludWV9bGV0IHU9c1tkLmlkeF07aWYoIXUpe2NvbnNvbGUuZXJyb3IoIm5vIGhhc2giLGQpO2NvbnRpbnVlfWF3YWl0IHQudXBsb2Fkcy5kZXEocixbdV0pfWxldCBhPWF3YWl0IHQuaG9zdHMuZ2V0KHIpO2lmKGEpe2xldCBkPWEubGFzdFNlcSx1PWQsbD1bXTtmb3IobGV0IGYgb2YgaSlpZihmLnN0YXR1cz09PTApbC5wdXNoKGYuc2VxKTtsLnNvcnQoKGYsaCk9PmYtaCk7Zm9yKGxldCBmIG9mIGwpaWYoZj09PWQrMSlkPWY7aWYoZD51KWF3YWl0IHQuaG9zdHMudG91Y2gocixkKX1yZXR1cm4gMH1hc3luYyBmdW5jdGlvbiB4cyhlLHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuIHAoW10pO2xldCByPW5ldyBNYXAsbj1bXTtmb3IobGV0IGEgb2YgdClyLnNldChhLnNlcSxhKSxuLnB1c2goYS5zZXEpO2xldFtzLGldPWF3YWl0IGUucHVsbChuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZighcylyZXR1cm4gYygyNyk7bGV0IG89W107Zm9yKGxldHtzZXE6YSxib2R5Q3BoOmR9b2Ygcyl7bGV0IHU9ci5nZXQoYSk7aWYoIXUpY29udGludWU7by5wdXNoKHtkbDp1LGJvZHlDcGg6ZH0pfXJldHVybiBwKG8pfWFzeW5jIGZ1bmN0aW9uIEhvKGUsdCxyLG4pe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIHAoe3BhcnRzOltdLGhhc2hlczpbXX0pO2xldCBzPVtdLGk9W10sbz1bXSxhPW5ldyBNYXA7Zm9yKGxldHtkbDp1LGJvZHlDcGg6bH1vZiBuKXtsZXR7aGVhZDpmLGtkbTpoLHNlcTp5LGhvc3Q6Z309dSxbbSxTXT1hd2FpdCBBcyh1LHIpO2lmKFMhPT0wfHwhbSl7bGV0IFQ9YS5nZXQoZyk/P1tdO1QucHVzaCh5KSxhLnNldChnLFQpO2NvbnRpbnVlfWxldHtoZWFkRW5jOngsaGVhZEVuY0hhc2g6Yn09bSxFPXQuZGVyaXZlQ2lwaGVyKGgsImRlY3J5cHQiKSxbdyxBXT1hd2FpdCBBcih4LGwsRSxyLGIpO2lmKEEhPT0wfHwhdyl7bGV0IFQ9YS5nZXQoZyk/P1tdO1QucHVzaCh5KSxhLnNldChnLFQpO2NvbnRpbnVlfWxldCBrPXtoZWFkOmYsYm9keTp3LmJvZH0sRD13LmhlYWRIYXNoO28ucHVzaCh7a2V5OkQsZGF0YTpCcyhrKX0pLHMucHVzaChrKSxpLnB1c2goRCk7bGV0IEg9YS5nZXQoZyk/P1tdO0gucHVzaCh5KSxhLnNldChnLEgpfWxldCBkPWF3YWl0IGUubWVzc2FnZXMuYWRkKG8pO2ZvcihsZXRbdSxsXW9mIGEpYXdhaXQgZS5kb3dubG9hZHMuZGVxKHUsbCk7Zm9yKGxldCB1PTA7dTxkLmxlbmd0aDt1Kyspe2xldCBsPWRbdV07aWYobCE9PTAmJmwhPT0xNSljb25zb2xlLmVycm9yKCJFUlIgc3RvcmluZyIsVVtsXSwiZm9yIG1lc3NhZ2UiLHUpfXJldHVybiBwKHtwYXJ0czpzLGhhc2hlczppfSl9YXN5bmMgZnVuY3Rpb24gQXMoZSx0KXtsZXQgcj1lLmhlYWRFbmM7aWYoIXIpe2xldCBzPW5ldyBLLGk9cy53cml0ZVN0cnVjdChkZSxlLmhlYWQpO2lmKGkhPT0wKXJldHVybiBjKGkpO3I9cy5yZXN1bHQoKX1pZihlLmhlYWRFbmNIYXNoKXJldHVybiBwKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6ZS5oZWFkRW5jSGFzaH0pO2xldCBuPWF3YWl0IHQuYmxha2UzKHIpO3JldHVybiBwKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6bn0pfWFzeW5jIGZ1bmN0aW9uIFBzKGUsdCxyKXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgbyBvZiB0KW4uYWRkKEMobykpO2lmKG4uc2l6ZTwxKXJldHVybjtsZXQgcz1BcnJheS5mcm9tKGF3YWl0IGUuZG93bmxvYWRzLmxpc3QoKSk7aWYocy5sZW5ndGg8MSlyZXR1cm47bGV0IGk9bmV3IE1hcDtmb3IobGV0IG8gb2Ygcyl7bGV0IGE7aWYoby5oZWFkRW5jSGFzaClhPUMoby5oZWFkRW5jSGFzaCk7ZWxzZXtsZXRbdSxsXT1hd2FpdCBBcyhvLHIpO2lmKGwhPT0wfHwhdSljb250aW51ZTthPUModS5oZWFkRW5jSGFzaCl9aWYoIW4uaGFzKGEpKWNvbnRpbnVlO2xldCBkPWkuZ2V0KG8uaG9zdCk/P1tdO2QucHVzaChvLnNlcSksaS5zZXQoby5ob3N0LGQpfWZvcihsZXRbbyxhXW9mIGkpYXdhaXQgZS5kb3dubG9hZHMuZGVxKG8sYSl9YXN5bmMgZnVuY3Rpb24gR3Ioe2Nvbm46ZSxzdG9yZTp0LGVuY2xhdmU6cixob3N0Om4sY3J5cHRvOnMsb25Qcm9ncmVzczppLHBlZWtQcm9ncmVzc0V2ZXJ5Om8scGVla0NvbmN1cnJlbmN5OmF9KXtsZXQgZD1hd2FpdCBlLmlkZW50aXR5KCksdT1bXSxbbCxmXT1hd2FpdCBlLnBlZWsobi5sYXN0U2VxKTtpZihmIT09MClyZXR1cm4gZjtsZXQgaD1sLmxlbmd0aCx5PW8/P2d0LGc9YT8/RXM7aWYoaSYmaD4wKWkoe3BoYXNlOiJwZWVrIixob3N0Om4ubGFiZWwsZG9uZTowLHRvdGFsOmh9KTtsZXQgbT0wLFM9YXdhaXQgV3IobCxnLGFzeW5jKGIpPT57bGV0W0Usd109YXdhaXQgenQoYixkLnB1YmxpY0tleSxyLHMpLEE7aWYodyE9PTB8fCFFKUE9e29rOiExLHNlcTpiLnNlcSxzdGF0Ond9O2Vsc2V7bGV0IGs9YXdhaXQgcy5ibGFrZTMoRS5oZWFkRW5jKTtBPXtvazohMCxzZXE6Yi5zZXEsa2RtOkUua2RtLGhlYWRFbmM6RS5oZWFkRW5jLGhlYWRFbmNIYXNoOmt9fWlmKG0rPTEsaSYmRnIobSxoLHkpKWkoe3BoYXNlOiJwZWVrIixob3N0Om4ubGFiZWwsZG9uZTptLHRvdGFsOmh9KTtyZXR1cm4gQX0pLHg9bmV3IFNldDtmb3IobGV0IGIgb2YgUyl7aWYoIWIub2spe2NvbnNvbGUuZXJyb3IoInBlZWs6IGRlY3J5cHRpbmcgaXRlbSBoZWFkIixiLnN0YXQpO2NvbnRpbnVlfWxldCBFPUMoYi5oZWFkRW5jSGFzaCk7aWYoYXdhaXQgdC5tZXNzYWdlcy5oYXMoYi5oZWFkRW5jSGFzaCkpe2NvbnNvbGUuaW5mbygicGVlazogbG9jYWwgbXNnOyBza2lwIGRvd25sb2FkLCBkZXEgdXBsb2FkIiksYXdhaXQgdC51cGxvYWRzLmRlcShuLmxhYmVsLFtiLmhlYWRFbmNIYXNoXSksYXdhaXQgdC5kb3dubG9hZHMuZGVxKG4ubGFiZWwsW2Iuc2VxXSk7Y29udGludWV9aWYoeC5oYXMoRSkpe2F3YWl0IHQuZG93bmxvYWRzLmRlcShuLmxhYmVsLFtiLnNlcV0pO2NvbnRpbnVlfWxldCBBPW5ldyBMKGIuaGVhZEVuYyksW2ssRF09QS5yZWFkU3RydWN0KGRlKTtpZihEIT09MCl7Y29uc29sZS5lcnJvcigicGVlazogcmVhZGluZyBpdGVtIGhlYWQiLEQpO2NvbnRpbnVlfXguYWRkKEUpLHUucHVzaCh7a2RtOmIua2RtLGhlYWQ6ayxzZXE6Yi5zZXEsaG9zdDpuLmxhYmVsLGhlYWRFbmM6Yi5oZWFkRW5jLGhlYWRFbmNIYXNoOmIuaGVhZEVuY0hhc2h9KX1pZihhd2FpdCB0LmRvd25sb2Fkcy5lbnEodSksbC5sZW5ndGg+MCl7bGV0IGI9TWF0aC5tYXgoLi4ubC5tYXAoKEUpPT5FLnNlcSkpO2F3YWl0IHQuaG9zdHMucmVjb3JkU3RhdHMobi5sYWJlbCx7bGFzdFNlcTpifSl9aWYoaSlpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6aCx0b3RhbDpofSk7cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gVXMoe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixtYXhQdXNoQnl0ZXM6bixvblByb2dyZXNzOnN9KXtsZXQgaT1uPz9YcixvPWF3YWl0IHQudXBsb2Fkcy5saXN0KHIubGFiZWwpLGE9by5sZW5ndGgsZD0wO2lmKHMmJmE+MClzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6MCx0b3RhbDphfSk7bGV0IHU9W10sbD1bXSxmPTAsaD1hc3luYygpPT57aWYodS5sZW5ndGg8MSlyZXR1cm4gMDtsZXQgeT11Lmxlbmd0aCxnPWF3YWl0IFRvKGUsdCxyLmxhYmVsLHUsbCk7aWYodT1bXSxsPVtdLGY9MCxnPT09MCl7aWYoZCs9eSxzKXMoe3BoYXNlOiJwdXNoIixob3N0OnIubGFiZWwsZG9uZTpkLHRvdGFsOmF9KX1yZXR1cm4gZ307Zm9yKGxldCB5IG9mIG8pe2xldCBnPWF3YWl0IHQubWVzc2FnZXMuZ2V0KHkpO2lmKCFnKXtkKz0xO2NvbnRpbnVlfWxldCBtPXsuLi5nLmhlYWQsYm9kOmcuYm9keX0sW1MseF09YXdhaXQgZS5zZWFsKG0pO2lmKHghPT0wKXJldHVybiB4O2lmKCFTKXJldHVybiAxMjtsZXQgYj1DbyhTKTtpZih1Lmxlbmd0aD4wJiZmK2I+aSl7bGV0IEU9YXdhaXQgaCgpO2lmKEUhPT0wKXJldHVybiBFfWlmKHUucHVzaChTKSxsLnB1c2goeSksZis9YixmPj1pKXtsZXQgRT1hd2FpdCBoKCk7aWYoRSE9PTApcmV0dXJuIEV9fXJldHVybiBoKCl9YXN5bmMgZnVuY3Rpb24gJHIoe2Nvbm46ZSxzdG9yZTp0LGVuY2xhdmU6cixob3N0Om4sY3J5cHRvOnMsbWF4UHVsbEJ5dGVzOmksb25Qcm9ncmVzczpvfSxhKXtsZXQgZD1pPz9qcix1PWF3YWl0IHQuZG93bmxvYWRzLmxpc3QoKSxsPUFycmF5LmZyb20odSkuZmlsdGVyKChTKT0+Uy5ob3N0PT09bi5sYWJlbCk7aWYobC5sZW5ndGg8MSlyZXR1cm4gMTU7bGV0IGY9cnQobCwoUyk9PlMuaGVhZCksaD13cyhmLChTKT0+Uy5oZWFkLmxlbixkKSx5PWYubGVuZ3RoLGc9MDtpZihvKW8oe3BoYXNlOiJwdWxsIixob3N0Om4ubGFiZWwsZG9uZTowLHRvdGFsOnl9KTtsZXQgbT14cyhlLGhbMF0pO2ZvcihsZXQgUz0wO1M8aC5sZW5ndGg7UysrKXtsZXRbeCxiXT1hd2FpdCBtO2lmKGIhPT0wfHwheClyZXR1cm4gYjtpZihnKz1oW1NdLmxlbmd0aCxvKW8oe3BoYXNlOiJwdWxsIixob3N0Om4ubGFiZWwsZG9uZTpnLHRvdGFsOnl9KTtsZXQgRT1oW1MrMV07aWYoRSltPXhzKGUsRSk7aWYobylvKHtwaGFzZToib3BlbiIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7bGV0IHc9cnQoeCwoayk9PmsuZGwuaGVhZCksWyxBXT1hd2FpdCBIbyh0LHIscyx3KTtpZihBIT09MClyZXR1cm4gQTtpZihhKXtpZihvKW8oe3BoYXNlOiJleGVjIixob3N0Om4ubGFiZWwsZG9uZTpnLHRvdGFsOnl9KTthd2FpdCBhKCl9fXJldHVybiAwfWZ1bmN0aW9uIEJzKHtoZWFkOmUsYm9keTp0fSl7bGV0IHI9e2VpZDplLmVpZCxib2R5OnQsYXBsZDpzdH07aWYoZS5vZmYhPT0wKXIub2ZmPWUub2ZmO2lmKGUuY3RyIT09MClyLmN0cj1lLmN0cjtyZXR1cm4gcn1hc3luYyBmdW5jdGlvbiBrcyhlLHtjb25uOnQsc3RvcmU6cixlbmNsYXZlOm4saG9zdDpzLGNyeXB0bzppLG9uUHJvZ3Jlc3M6b30sYSl7bGV0IGQ9cy5sYWJlbCx1PWF3YWl0IHQuaWRlbnRpdHkoKSxsPW5ldyBMKGUpLFtmLGhdPWwucmVhZFN0cnVjdHMoSHQpO2lmKGghPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgZGVjb2Rpbmcgbm90aWYiLFVbaF0pO3JldHVybn1sZXQgeT0hMSxtPShhd2FpdCByLmhvc3RzLmdldChkKSk/Lmxhc3RTZXEsUz1bXSx4PSExO2ZvcihsZXQgdyBvZiBmKXtsZXRbQSxrXT1hd2FpdCB6dCh7c2VxOncuc2VxLGhlYWRDcGg6dy5oZWFkQ3BofSx1LnB1YmxpY0tleSxuLGkpO2lmKGshPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgZGVjcnlwdGluZyBub3RpZiIsVVtrXSk7Y29udGludWV9bGV0IEQ9YXdhaXQgaS5ibGFrZTMoQS5oZWFkRW5jKTtpZihhd2FpdCByLm1lc3NhZ2VzLmhhcyhEKSljb250aW51ZTtsZXQgSD1uZXcgTChBLmhlYWRFbmMpLFtULE9dPUgucmVhZFN0cnVjdChkZSk7aWYoTyE9PTApe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBoZWFkIixVW09dKTtjb250aW51ZX1pZighdy5ib2R5Q3BoJiZULmxlbj4wKXg9ITAsYXdhaXQgci5kb3dubG9hZHMuZW5xKFt7c2VxOncuc2VxLGhvc3Q6ZCxrZG06QS5rZG0saGVhZDpULGhlYWRFbmM6QS5oZWFkRW5jLGhlYWRFbmNIYXNoOkR9XSk7ZWxzZSBTLnB1c2goey4uLkEsaGVhZDpULGJvZHlDcGg6dy5ib2R5Q3BoLGhlYWRFbmNIYXNoOkR9KTtpZihtPT09dm9pZCAwfHx3LnNlcSE9PW0rMSljb25zb2xlLmxvZygib3V0IG9mIHNlcSIsdy5zZXEsbSkseT0hMDtlbHNlIG09dy5zZXF9aWYobSE9PXZvaWQgMClhd2FpdCByLmhvc3RzLnRvdWNoKHMubGFiZWwsbSk7bGV0IGI9W107Zm9yKGxldCB3IG9mIFMpe2xldCBBPW4uZGVyaXZlQ2lwaGVyKHcua2RtLCJkZWNyeXB0IiksW2ssRF09YXdhaXQgQXIody5oZWFkRW5jLHcuYm9keUNwaCxBLGkpO2lmKEQhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gb3BlbiBib2R5IixVW0RdKTtjb250aW51ZX1iLnB1c2goe2tleTp3LmhlYWRFbmNIYXNoLGRhdGE6QnMoe2hlYWQ6dy5oZWFkLGJvZHk6ay5ib2R9KX0pfWxldCBFPWF3YWl0IHIubWVzc2FnZXMuYWRkKGIpO2ZvcihsZXQgdz0wO3c8RS5sZW5ndGg7dysrKXtsZXQgQT1FW3ddO2lmKEEhPT0wJiZBIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLFVbQV0sImZvciBtZXNzYWdlIix3KX1pZihvJiZiLmxlbmd0aD4wKW8oe3BoYXNlOiJvcGVuIixob3N0OnMubGFiZWwsZG9uZTpiLmxlbmd0aCx0b3RhbDpiLmxlbmd0aH0pO2lmKHl8fHh8fGIubGVuZ3RoPjApYSgpfWFzeW5jIGZ1bmN0aW9uIFFyKGUsdD17fSl7bGV0IHI9dC5wdWxsIT09ITEsbj10LnB1c2g9PT0hMCx7Y29ubjpzLHN0b3JlOmksZW5jbGF2ZTpvLGhvc3Q6YSxjcnlwdG86ZCxvblByb2dyZXNzOnUscGVla1Byb2dyZXNzRXZlcnk6bCxwZWVrQ29uY3VycmVuY3k6Zn09ZSxoPWF3YWl0IHMuaWRlbnRpdHkoKSxbeSxnXT1hd2FpdCBzLnBlZWsoMCk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0IG09eS5sZW5ndGgsUz1sPz9ndCx4PWY/P0VzO2lmKHUmJm0+MCl1KHtwaGFzZToicGVlayIsaG9zdDphLmxhYmVsLGRvbmU6MCx0b3RhbDptfSk7bGV0IGI9MCxFPWF3YWl0IFdyKHkseCxhc3luYyh2KT0+e2xldFtSLE1dPWF3YWl0IHp0KHYsaC5wdWJsaWNLZXksbyxkKSxxO2lmKE0hPT0wfHwhUilxPXtvazohMSxzZXE6di5zZXEsc3RhdDpNfTtlbHNle2xldCBCPWF3YWl0IGQuYmxha2UzKFIuaGVhZEVuYyk7cT17b2s6ITAsc2VxOnYuc2VxLGtkbTpSLmtkbSxoZWFkRW5jOlIuaGVhZEVuYyxoZWFkRW5jSGFzaDpCfX1pZihiKz0xLHUmJkZyKGIsbSxTKSl1KHtwaGFzZToicGVlayIsaG9zdDphLmxhYmVsLGRvbmU6Yix0b3RhbDptfSk7cmV0dXJuIHF9KSx3PW5ldyBNYXA7Zm9yKGxldCB2IG9mIEUpe2lmKCF2Lm9rKWNvbnRpbnVlO2xldCBSPUModi5oZWFkRW5jSGFzaCksTT13LmdldChSKTtpZihNKU0uY291bnQrPTE7ZWxzZSB3LnNldChSLHtoYXNoOnYuaGVhZEVuY0hhc2gsY291bnQ6MSxzYW1wbGU6dn0pfWxldCBBPTAsaz1bXTtmb3IobGV0IHYgb2Ygdy52YWx1ZXMoKSl7aWYodi5jb3VudD4xKUErPXYuY291bnQtMTtrLnB1c2godi5oYXNoKX1sZXQgRD15Lmxlbmd0aCxIPXcuc2l6ZSxUPWF3YWl0IGh0KGssZCksTz1bXSxOPTA7Zm9yKGxldCB2IG9mIHcudmFsdWVzKCkpe2lmKGF3YWl0IGkubWVzc2FnZXMuaGFzKHYuaGFzaCkpe2F3YWl0IGkudXBsb2Fkcy5kZXEoYS5sYWJlbCxbdi5oYXNoXSk7Y29udGludWV9aWYoTis9MSwhciljb250aW51ZTtsZXQgTT12LnNhbXBsZSxxPW5ldyBMKE0uaGVhZEVuYyksW0IsR109cS5yZWFkU3RydWN0KGRlKTtpZihHIT09MCl7Y29uc29sZS5lcnJvcigicmVjb25jaWxlOiByZWFkaW5nIG1zZyBoZWFkZXIiLEcpO2NvbnRpbnVlfU8ucHVzaCh7a2RtOk0ua2RtLGhlYWQ6QixzZXE6TS5zZXEsaG9zdDphLmxhYmVsLGhlYWRFbmM6TS5oZWFkRW5jLGhlYWRFbmNIYXNoOk0uaGVhZEVuY0hhc2h9KX1pZihPLmxlbmd0aD4wKWF3YWl0IGkuZG93bmxvYWRzLmVucShPKTtsZXQgXz0wO2lmKG4pe2xldCB2PWF3YWl0IGkubWVzc2FnZXMubGlzdEtleXMoKSxSPW5ldyBTZXQody5rZXlzKCkpLE09W107Zm9yKGxldCBxIG9mIHYpaWYoIVIuaGFzKEMocSkpKV8rPTEsTS5wdXNoKHEpO2lmKE0ubGVuZ3RoPjApYXdhaXQgaS51cGxvYWRzLmVucShhLmxhYmVsLE0pfWVsc2V7bGV0IHY9YXdhaXQgaS5tZXNzYWdlcy5saXN0S2V5cygpLFI9bmV3IFNldCh3LmtleXMoKSk7Zm9yKGxldCBNIG9mIHYpaWYoIVIuaGFzKEMoTSkpKV8rPTF9bGV0IEk9eS5sZW5ndGg+MD9NYXRoLm1heCguLi55Lm1hcCgodik9PnYuc2VxKSk6MDtpZihhd2FpdCBpLmhvc3RzLnJlY29yZFN0YXRzKGEubGFiZWwse3NldExhc3RTZXE6SX0pLHUpdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOm0sdG90YWw6bX0pO3JldHVybiBwKHttc2djaGVjazpULG51bUJhZ3M6RCx1bmlxdWVNc2dzOkgsbnVtRHVwZXM6QSxtaXNzaW5nTG9jYWw6TixtaXNzaW5nSG9zdDpffSl9Y2xhc3MgWXJ7Y2xvY2s7c3RhdGU7c3RvcmU7dHJhbnNwb3J0O2NyeXB0bztmb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdDtvblNjaGVkdWxlU3luYztjb25uZWN0aW9ucz1uZXcgTWFwO2FwcGx5Q2hhaW49UHJvbWlzZS5yZXNvbHZlKCk7c3luY1J1bnM9bmV3IFd0O2NsaWVudFN0YXRlO3hmZXJTdGF0ZTttYXhQdXNoQnl0ZXM7bWF4UHVsbEJ5dGVzO3BlZWtQcm9ncmVzc0V2ZXJ5PWd0O2xhc3RQcm9ncmVzcz1xcjtzY2hlZHVsZWRTeW5jO2NvbnN0cnVjdG9yKGUsdCxyLG4scyxpPSEwLG89WHIsYT1qcixkKXt0aGlzLmNsb2NrPWU7dGhpcy5zdGF0ZT10O3RoaXMuc3RvcmU9cjt0aGlzLnRyYW5zcG9ydD1uO3RoaXMuY3J5cHRvPXM7dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdD1pO3RoaXMub25TY2hlZHVsZVN5bmM9ZDt0aGlzLm1heFB1c2hCeXRlcz1vLHRoaXMubWF4UHVsbEJ5dGVzPWEsdGhpcy5jbGllbnRTdGF0ZT1uZXcgUmUoKCk9PnRoaXMuZ2V0Q2xpZW50U3RhdGUoKSksdGhpcy54ZmVyU3RhdGU9bmV3IFJlKCgpPT50aGlzLmdldFhmZXJTdGF0ZSgpKSx0aGlzLnNjaGVkdWxlZFN5bmM9bmV3IE5yKGdzLGFzeW5jKCk9Pnt0cnl7Y29uc29sZS5pbmZvKCJSdW5uaW5nIHNjaGVkdWxlZCBzeW5jIiksYXdhaXQgdGhpcy5zeW5jKCl9Y2F0Y2godSl7Y29uc29sZS5lcnJvcigiRGVib3VuY2VkIHN5bmMgZmFpbGVkOiIsdSl9fSl9ZW1pdFByb2dyZXNzPShlKT0+e3RoaXMubGFzdFByb2dyZXNzPWUsdGhpcy54ZmVyU3RhdGUuZW1pdCgpfTthc3luYyBzZXRTZWVkKGUsdCl7YXdhaXQgdGhpcy5zdG9yZS5zZWVkLnNhdmUoZSx0KSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKX1hc3luYyBnZXRDbGllbnRTdGF0ZSgpe2xldHtzdG9yZTplLGNvbm5lY3Rpb25zOnR9PXRoaXMscj1hd2FpdCBlLnNlZWQubG9hZCgpLG49YXdhaXQgZS5ob3N0cy5saXN0KCkscz0hMTtmb3IobGV0IGkgb2YgdC52YWx1ZXMoKSlpZihpLmlzQ29ubmVjdGVkKCkpe3M9ITA7YnJlYWt9cmV0dXJue2hhc1NlZWQ6ciE9PXZvaWQgMCxoYXNIb3N0OkFycmF5LmZyb20obikubGVuZ3RoPjAsY29ubmVjdGVkOnN9fWFzeW5jIGdldFhmZXJTdGF0ZSgpe2xldHt1cGxvYWRzOmUsZG93bmxvYWRzOnR9PXRoaXMuc3RvcmUscj1hd2FpdCBlLmNvdW50KCk7cmV0dXJue251bURvd25sb2Fkczphd2FpdCB0LmNvdW50KCksbnVtVXBsb2FkczpyLHByb2dyZXNzOnRoaXMubGFzdFByb2dyZXNzfX1hcHBseT0oZSx0KT0+dGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseShlLHQpKTthc3luYyBkb0FwcGx5KGUsdD17ZW5xdWV1ZVVwbG9hZDohMCx0cmlnZ2VyVXBsb2FkOiEwfSl7bGV0IHI9W10sbj1bXTtmb3IobGV0e2hlYWQ6aSxib2R5Om99b2YgZSl7bGV0IGE9bmV3IEs7YS53cml0ZVN0cnVjdChkZSxpKTtsZXQgZD1hLnJlc3VsdCgpLHU9YXdhaXQgdGhpcy5jcnlwdG8uYmxha2UzKGQpLGw9e2VpZDppLmVpZCxib2R5Om8sYXBsZDpzdH07aWYoaS5vZmYhPT0wKWwub2ZmPWkub2ZmO2lmKGkuY3RyIT09MClsLmN0cj1pLmN0cjtyLnB1c2godSksbi5wdXNoKHtrZXk6dSxkYXRhOmx9KX1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmFkZChuKSxhd2FpdCBQcyh0aGlzLnN0b3JlLHIsdGhpcy5jcnlwdG8pO2xldCBzPWF3YWl0IHRoaXMuZG9BcHBseUhhc2hlcyhyKTtpZih0LmVucXVldWVVcGxvYWQpe2xldCBpPVtdO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXtsZXQgYT1zW29dO2lmKGE9PT0wfHxhPT09MTUpaS5wdXNoKHJbb10pfWlmKGkubGVuZ3RoPjApe2xldCBvPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMubGlzdCgpO2ZvcihsZXQgYSBvZiBvKWF3YWl0IHRoaXMuc3RvcmUudXBsb2Fkcy5lbnEoYS5sYWJlbCxpKTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9fWlmKHQudHJpZ2dlclVwbG9hZCl0aGlzLnNjaGVkdWxlU3luYygpO3JldHVybiBzfWVucXVldWVBcHBseUpvYihlKXtsZXQgdD10aGlzLmFwcGx5Q2hhaW4udGhlbihlLGUpO3JldHVybiB0aGlzLmFwcGx5Q2hhaW49dC50aGVuKCgpPT57cmV0dXJufSwoKT0+e3JldHVybn0pLHR9ZHJhaW5BcHBseVF1ZXVlKCl7cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLmRvRHJhaW5BcHBseVF1ZXVlKCkpfWFzeW5jIGRvRHJhaW5BcHBseVF1ZXVlKCl7bGV0IGU9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5saXN0KHthcGxkOnN0fSk7aWYoZS5sZW5ndGg8MSlyZXR1cm5bXTtsZXQgdD1ydChlLChyKT0+ci5oZWFkKTtyZXR1cm4gdGhpcy5hcHBseVN0b3JlZCh0KX1hcHBseUhhc2hlcz0oZSk9PnRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLmRvQXBwbHlIYXNoZXMoZSkpO2FzeW5jIGRvQXBwbHlIYXNoZXMoZSl7bGV0IHQ9W107Zm9yKGxldCBzIG9mIGUpe2xldCBpPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMuZ2V0KHMpO2lmKGkpdC5wdXNoKGkpfWxldCByPWF3YWl0IHRoaXMuYXBwbHlTdG9yZWQodCksbj1uZXcgTWFwO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKW4uc2V0KEModFtzXS5oYXNoKSxyW3NdPz8xMik7cmV0dXJuIGUubWFwKChzKT0+bi5nZXQoQyhzKSk/PzEzKX1hc3luYyBhcHBseVN0b3JlZChlKXtpZihlLmxlbmd0aDwxKXJldHVybltdO2xldCB0PWUubWFwKChpKT0+KHsuLi5pLmhlYWQsYm9kOmkuYm9keX0pKSxyPWF3YWl0IHRoaXMuc3RhdGUuYXBwbHkodCksbj1bXSxzPVtdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgbz1yW2ldO2lmKG89PT0wfHxvPT09MTUpbi5wdXNoKGVbaV0uaGFzaCk7ZWxzZSBpZihvIT09dm9pZCAwJiZJcyhvKSlzLnB1c2goe2tleTplW2ldLmhhc2gsZXJyOm99KX1pZihuLmxlbmd0aD4wKWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubWFya0FwcGxpZWQobik7aWYocy5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtGYWlsZWQocyk7cmV0dXJuIHJ9YXN5bmMgaW5zZXJ0UmF3KGUpe2xldHtjbG9jazp0LGNyeXB0bzpyfT10aGlzLFtuLHNdPWF3YWl0IG9zKHtub3c6dC5ub3coKSxib2Q6ZSxjcnlwdG86cn0pO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBvPShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDpuLGJvZHk6ZX1dKSlbMF07aWYobyE9PTAmJm8hPT0xNSlyZXR1cm4gYyhvPz8xMik7cmV0dXJuIHAobil9YXN5bmMgbWFrZVVwZGF0ZShlLHQpe2xldHtjbG9jazpyLGNyeXB0bzpufT10aGlzLHM9ci5ub3coKTtpZihlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+cy5nZXRUaW1lKCkpcmV0dXJuIGMoNCk7bGV0IGk9ZS5jdHIrMSxbbyxhXT1hd2FpdCBWdCh7bm93OnMsZWlkOmUuZWlkLGN0cjppLGJvZDp0LGNyeXB0bzpufSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7cmV0dXJuIHAoe2hlYWQ6byxib2R5OnR9KX1hc3luYyB1cGRhdGVXaXRoU2tldyhlLHQscil7aWYocj09PSExKXJldHVybiBjKDQpO2xldHtjbG9jazpuLGNyeXB0bzpzfT10aGlzLGk9bi5ub3coKSxvPW5ldyBMKGUuZWlkKSxbYSxkXT1vLnJlYWRTdHJ1Y3QoYWUpO2lmKGQhPT0wKXJldHVybiBjKGQpO2xldCB1PWUudXBkYXRlZEF0LmdldFRpbWUoKS1hLnRzLmdldFRpbWUoKSxsPXtlaWQ6ZS5laWQsb2ZmOnUrMSxjdHI6ZS5jdHIrMSxsZW46MH0saD0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6bCxib2R5OnZvaWQgMH1dKSlbMF07aWYoaCE9PTAmJmghPT0xNSlyZXR1cm4gYyhoPz8xMik7aWYodD09PXZvaWQgMClyZXR1cm4gcChsKTtsZXRbeSxnXT1UdCh7aWQ6YS5pZCx0czppfSk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0W20sU109YXdhaXQgVnQoe25vdzppLGVpZDp5LGN0cjowLGJvZDp0LGNyeXB0bzpzfSk7aWYoUyE9PTApcmV0dXJuIGMoUyk7bGV0IGI9KGF3YWl0IHRoaXMuYXBwbHkoW3toZWFkOm0sYm9keTp0fV0pKVswXTtpZihiIT09MCYmYiE9PTE1KXJldHVybiBjKGI/PzEyKTtyZXR1cm4gcChtKX1hc3luYyB1cGRhdGVSYXcoZSx0LHI9dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdCl7aWYoZS51cGRhdGVkQXQuZ2V0VGltZSgpPnRoaXMuY2xvY2subm93KCkuZ2V0VGltZSgpKXJldHVybiB0aGlzLnVwZGF0ZVdpdGhTa2V3KGUsdCxyKTtyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoYXN5bmMoKT0+e2xldFtuLHNdPWF3YWl0IHRoaXMubWFrZVVwZGF0ZShlLHQpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBvPShhd2FpdCB0aGlzLmRvQXBwbHkoW25dKSlbMF07aWYobyE9PTAmJm8hPT0xNSlyZXR1cm4gYyhvPz8xMik7cmV0dXJuIHAobi5oZWFkKX0pfWFzeW5jIGluc2VydChlKXtsZXR7Ym9keTp0LHR5cGU6cixnaWQ6bixwaWQ6cyx0YWdzOml9PWUsYT1NZSh7Ym9keTp0LHR5cGU6cixnaWQ6bixwaWQ6cyx0YWdzOml9KTtyZXR1cm4gdGhpcy5pbnNlcnRSYXcoYSl9YXN5bmMgdXBkYXRlKGUpe2xldHtwcmlvcjp0LGJvZHk6cix0eXBlOm4sZ2lkOnMscGlkOmksdGFnczpvLGZvcmNlOmF9PWUsdT1NZSh7Ym9keTpyLHR5cGU6bixnaWQ6cyxwaWQ6aSx0YWdzOm99KTtyZXR1cm4gdGhpcy51cGRhdGVSYXcodCx1LGE/P3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQpfWFzeW5jIGRlbGV0ZShlKXtsZXQgdD1lLmZvcmNlPz8hMDtpZigicHJpb3IiaW4gZSlyZXR1cm4gdGhpcy51cGRhdGVSYXcoZS5wcmlvcix2b2lkIDAsdCk7bGV0W3Isbl09YXdhaXQgdGhpcy5yZXZGcm9tQXJjaGl2ZShlLmVpZCk7aWYobiE9PTApcmV0dXJuIGMobik7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHIsdm9pZCAwLHQpfWFzeW5jIHJldkZyb21BcmNoaXZlKGUpe2xldCB0PWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGFzdChlKTtpZih0KXJldHVybiBtcyh0LmhlYWQpO2xldCByPW5ldyBMKGUpLFtuLHNdPXIucmVhZFN0cnVjdChhZSk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2VpZDplLGN0cjotMSx1cGRhdGVkQXQ6bi50c30pfWFzeW5jIGdlbkVJRChlKXtsZXR7Y2xvY2s6dCxjcnlwdG86cn09dGhpcyxuPXQubm93KCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gVHQoe2lkOmUsdHM6bn0pO2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCk7cmV0dXJuIFR0KHtpZDpzLHRzOm59KX1zeW5jKCl7cmV0dXJuIHRoaXMuc3luY1J1bnMucnVuKCgpPT50aGlzLmRvU3luYygpKX1hc3luYyBkb1N5bmMoKXtsZXR7Y29ubmVjdGlvbnM6ZSxjcnlwdG86dCxzdG9yZTpyfT10aGlzLG49YXdhaXQgci5zZWVkLmxvYWQoKTtpZighbilyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKTtmb3IobGV0W3MsaV1vZiBlKXtsZXQgbz1hd2FpdCByLmhvc3RzLmdldChzKTtpZighbyljb250aW51ZTtsZXQgYT17Y29ubjppLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6byxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sZD1hd2FpdCBHcihhKTtpZihkIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBlZWs6ICR7ZH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IHU9YXdhaXQgVXMoYSk7aWYodSE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwdXNoOiAke3V9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHU7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBsPWF3YWl0ICRyKGEsYXN5bmMoKT0+e2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCl9KTtpZihsIT09MCYmbCE9PTE1KXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVsbDogJHtsfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxsO3RoaXMueGZlclN0YXRlLmVtaXQoKX1yZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDB9YXN5bmMgcmVidWlsZChlKXtpZih0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpLGU/LmNoZWNrSG9zdD8/ITApe2xldCByPWF3YWl0IHRoaXMucmVwdWxsKCk7aWYociE9PTApcmV0dXJuIHJ9cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLnJlcGxheSgpKX1hc3luYyBtc2djaGVjaygpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdEtleXMoKTtyZXR1cm4gaHQoZSx0aGlzLmNyeXB0byl9bGlzdE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdChlKX1jb3VudE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMuY291bnQoZSl9YXN5bmMgcmVjb25jaWxlKGUsdCl7dGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKTtsZXR7Y29ubmVjdGlvbnM6cixjcnlwdG86bixzdG9yZTpzfT10aGlzLGk9YXdhaXQgcy5zZWVkLmxvYWQoKTtpZighaSlyZXR1cm4gYygyMik7bGV0IG89YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIW8pcmV0dXJuIGMoMTMpO2xldCBhPXIuZ2V0KGUpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QobywhMSwhMSksbz1hd2FpdCBzLmhvc3RzLmdldChlKSwhbylyZXR1cm4gYygxMyk7YT1yLmdldChlKX1pZighYSlyZXR1cm4gYygxMik7bGV0IGQ9e2Nvbm46YSxzdG9yZTpzLGVuY2xhdmU6aSxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW3UsbF09YXdhaXQgUXIoey4uLmQsaG9zdDpvfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCksbCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxjKGwpO2lmKCF1KXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYygxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscCh1KTtsZXQgZj1hd2FpdCB0aGlzLnN5bmMoKTtpZihmIT09MClyZXR1cm4gYyhmKTtsZXQgaD1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighaClyZXR1cm4gYygxMyk7bGV0W3ksZ109YXdhaXQgUXIoey4uLmQsaG9zdDpofSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxnIT09MClyZXR1cm4gYyhnKTtpZigheSlyZXR1cm4gYygxMik7cmV0dXJuIHAoeSl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPWF3YWl0IHIuc2VlZC5sb2FkKCk7aWYoIW4pcmV0dXJuIDIyO2xldCBzPUFycmF5LmZyb20oYXdhaXQgci5ob3N0cy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuIDA7Zm9yKGxldCBpIG9mIHMpe2xldCBvPWUuZ2V0KGkubGFiZWwpO2lmKCFvfHwhby5pc0Nvbm5lY3RlZCgpKWF3YWl0IHRoaXMuY29ubmVjdFRvSG9zdChpLCExLCExKX1mb3IobGV0W2ksb11vZiBlKXtsZXQgYT1hd2FpdCByLmhvc3RzLmdldChpKTtpZighYSljb250aW51ZTtsZXQgZD17Y29ubjpvLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6ey4uLmEsbGFzdFNlcTowfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sdT1hd2FpdCBHcihkKTtpZih1IT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7dX1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksdTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IGw9YXdhaXQgJHIoZCk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPXJ0KHQsKGkpPT5pLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBpPTAsbz0wLGE9cztmb3IobGV0IHU9czt1PHIubGVuZ3RoJiZvPDEwMCYmaTwxMDI0MDA7dSsrKWkrPXJbdV0uaGVhZC5sZW4sbysrLGE9dSsxO2xldCBkPXIuc2xpY2UocyxhKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKGQpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTphLHRvdGFsOm59KSxzPWF9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOml9PXRoaXM7aWYobilhd2FpdCBpLmhvc3RzLndpcGUoKSxhd2FpdCBpLnVwbG9hZHMud2lwZSgpLGF3YWl0IGkuZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IGkubWVzc2FnZXMud2lwZSgpO2lmKHMpYXdhaXQgaS5zZWVkLndpcGUoKTtpZihyKWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTt0aGlzLmxhc3RQcm9ncmVzcz1xcix0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSx0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9aW1wb3J0PWFzeW5jKGUsdCk9PntsZXR7Y3J5cHRvOnIsc3RvcmU6bn09dGhpcyxzPXQ/Lm9uUHJvZ3Jlc3MsaT1hd2FpdCBuLnNlZWQubG9hZCgpO2lmKCFpKXJldHVybiAyMjtjb25zb2xlLnRpbWUoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCBvPWF3YWl0IGUuYnl0ZXMoKSxbYSxkXT1hd2FpdCBPdC5kZWNvZGVGaWxlKG8scixpKTtpZihkIT09MClyZXR1cm4gZDtjb25zb2xlLnRpbWVFbmQoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCB1PTA7d2hpbGUodTxhLmxlbmd0aCl7bGV0IGw9MCxmPTAsaD11O2ZvcihsZXQgbT11O208YS5sZW5ndGgmJmY8MTAwJiZsPDEwMjQwMDttKyspbCs9YVttXS5oZWFkLmxlbixmKyssaD1tKzE7bGV0IHk9YS5zbGljZSh1LGgpO2NvbnNvbGUudGltZShgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtsZXQgZz1hd2FpdCB0aGlzLmFwcGx5KHkse2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMX0pO2NvbnNvbGUudGltZUVuZChgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtmb3IobGV0IG09MDttPHkubGVuZ3RoO20rKyl7bGV0IFM9Z1ttXTtpZihTIT09MCYmUyE9PTE1KWNvbnNvbGUud2FybihgZmFpbGVkIHRvIGltcG9ydCBtc2cgJHt1K219OiAke1VbU119YCl9aWYocylxdWV1ZU1pY3JvdGFzaygoKT0+cyhoLGEubGVuZ3RoLDApKTt0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImltcG9ydCIsZG9uZTpoLHRvdGFsOmEubGVuZ3RofSksdT1ofXJldHVybiB0aGlzLnNjaGVkdWxlU3luYygpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfTtzY2hlZHVsZVN5bmM9KCk9PntpZih0aGlzLm9uU2NoZWR1bGVTeW5jKXt0aGlzLm9uU2NoZWR1bGVTeW5jKCk7cmV0dXJufXRoaXMuc2NoZWR1bGVkU3luYy5zY2hlZHVsZSgpfTthc3luYyBleHBvcnRCeXRlcygpe2xldHtjcnlwdG86ZSxzdG9yZTp0fT10aGlzLHI9YXdhaXQgdC5zZWVkLmxvYWQoKTtpZighcilyZXR1cm4gYygyMik7bGV0IG49YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIE90LmVuY29kZUZpbGUoImV4cG9ydCIsMCxuLGUscil9YXN5bmMgZXhwb3J0KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihyIT09MClyZXR1cm4gcjtpZighdClyZXR1cm4gMTI7bGV0IG49bmV3IEJsb2IoW3Quc2xpY2UoKV0pO3JldHVybiBicyhuLGUpLDB9YXN5bmMgbGluayhlLHQ9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKGUpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KGUubGFiZWwpO2lmKHIpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KHIpfX1hc3luYyB1bmxpbmsoZSl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoZSksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgaG9zdHMoKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9Y29ubmVjdFRvSG9zdD1hc3luYyhlLHQ9ITAscj0hMCk9PntsZXR7Y2xvY2s6bixjb25uZWN0aW9uczpzLGNyeXB0bzppLHN0b3JlOm8sdHJhbnNwb3J0OmF9PXRoaXMsZD1zLmdldChlLmxhYmVsKTtpZihkKXtpZihkLmlzQ29ubmVjdGVkKCkpcmV0dXJuO3RyeXtkLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9cy5kZWxldGUoZS5sYWJlbCl9bGV0IHU9YXdhaXQgby5zZWVkLmxvYWQoKTtpZighdSlyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7ZS5oYW5kbGV9ICgke2UubGFiZWx9KWApO2xldCBsPW5ldyBMdCh1LGksZSxuLGEoZSksKGYpPT5vLmhvc3RzLnNldChlLmxhYmVsLGYpKTtpZihhd2FpdCBsLnJlZ2lzdGVyKCksdClhd2FpdCBsLmxpc3Rlbihhc3luYyhmKT0+e2xldCBoPXtjb25uOmwsc3RvcmU6byxlbmNsYXZlOnUsaG9zdDplLGNyeXB0bzppLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4ga3MoZixoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoZT0hMCx0PSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpyLHNjaGVkdWxlU3luYzpuLHN0b3JlOnN9PXRoaXM7aWYoIWF3YWl0IHMuc2VlZC5sb2FkKCkpcmV0dXJuO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7bGV0IG89YXdhaXQgcy5ob3N0cy5saXN0KCk7Zm9yKGxldCBhIG9mIG8pYXdhaXQgcihhLGUsITEpO2lmKHQpbigpfWRpc2Nvbm5lY3Q9YXN5bmMoKT0+e2ZvcihsZXQgZSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKXRyeXtlLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9dGhpcy5jb25uZWN0aW9ucy5jbGVhcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfX12YXIgT2U9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMDtmdW5jdGlvbiBHdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gSnIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBRKGUsLi4udCl7aWYoIUpyKGUpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGg+MCYmIXQuaW5jbHVkZXMoZS5sZW5ndGgpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIG9mIGxlbmd0aCAiK3QrIiwgZ290IGxlbmd0aD0iK2UubGVuZ3RoKX1mdW5jdGlvbiBacihlLHQ9ITApe2lmKGUuZGVzdHJveWVkKXRocm93IEVycm9yKCJIYXNoIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCIpO2lmKHQmJmUuZmluaXNoZWQpdGhyb3cgRXJyb3IoIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKX1mdW5jdGlvbiB2cyhlLHQpe1EoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBlbihlKXtpZih0eXBlb2YgZSE9PSJib29sZWFuIil0aHJvdyBFcnJvcihgYm9vbGVhbiBleHBlY3RlZCwgbm90ICR7ZX1gKX0vKiEgbm9ibGUtY2lwaGVycyAtIE1JVCBMaWNlbnNlIChjKSAyMDIzIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL3ZhciBJZT0oZSk9Pm5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpO3ZhciBNbz1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pLmJ1ZmZlcilbMF09PT02ODtpZighTW8pdGhyb3cgRXJyb3IoIk5vbiBsaXR0bGUtZW5kaWFuIGhhcmR3YXJlIGlzIG5vdCBzdXBwb3J0ZWQiKTtmdW5jdGlvbiBSbyhlKXtpZih0eXBlb2YgZSE9PSJzdHJpbmciKXRocm93IEVycm9yKCJzdHJpbmcgZXhwZWN0ZWQiKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpKX1mdW5jdGlvbiAkdChlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKWU9Um8oZSk7ZWxzZSBpZihKcihlKSllPVF0KGUpO2Vsc2UgdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQsIGdvdCAiK3R5cGVvZiBlKTtyZXR1cm4gZX1mdW5jdGlvbiBEcyhlLHQpe2lmKHQ9PW51bGx8fHR5cGVvZiB0IT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBkZWZpbmVkIik7cmV0dXJuIE9iamVjdC5hc3NpZ24oZSx0KX1mdW5jdGlvbiBDcyhlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylyfD1lW25dXnRbbl07cmV0dXJuIHI9PT0wfXZhciBUcz0oZSx0KT0+e2Z1bmN0aW9uIHIobiwuLi5zKXtpZihRKG4pLGUubm9uY2VMZW5ndGghPT12b2lkIDApe2xldCBsPXNbMF07aWYoIWwpdGhyb3cgRXJyb3IoIm5vbmNlIC8gaXYgcmVxdWlyZWQiKTtpZihlLnZhclNpemVOb25jZSlRKGwpO2Vsc2UgUShsLGUubm9uY2VMZW5ndGgpfWxldCBpPWUudGFnTGVuZ3RoO2lmKGkmJnNbMV0hPT12b2lkIDApUShzWzFdKTtsZXQgbz10KG4sLi4ucyksYT0obCxmKT0+e2lmKGYhPT12b2lkIDApe2lmKGwhPT0yKXRocm93IEVycm9yKCJjaXBoZXIgb3V0cHV0IG5vdCBzdXBwb3J0ZWQiKTtRKGYpfX0sZD0hMTtyZXR1cm57ZW5jcnlwdChsLGYpe2lmKGQpdGhyb3cgRXJyb3IoImNhbm5vdCBlbmNyeXB0KCkgdHdpY2Ugd2l0aCBzYW1lIGtleSArIG5vbmNlIik7cmV0dXJuIGQ9ITAsUShsKSxhKG8uZW5jcnlwdC5sZW5ndGgsZiksby5lbmNyeXB0KGwsZil9LGRlY3J5cHQobCxmKXtpZihRKGwpLGkmJmwubGVuZ3RoPGkpdGhyb3cgRXJyb3IoImludmFsaWQgY2lwaGVydGV4dCBsZW5ndGg6IHNtYWxsZXIgdGhhbiB0YWdMZW5ndGg9IitpKTtyZXR1cm4gYShvLmRlY3J5cHQubGVuZ3RoLGYpLG8uZGVjcnlwdChsLGYpfX19cmV0dXJuIE9iamVjdC5hc3NpZ24ocixlKSxyfTtmdW5jdGlvbiB0bihlLHQscj0hMCl7aWYodD09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodC5sZW5ndGghPT1lKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC5sZW5ndGgpO2lmKHImJiFMbyh0KSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiB0fWZ1bmN0aW9uIExvKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShlKX1mdW5jdGlvbiBnZSguLi5lKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmZpbGwoMCl9ZnVuY3Rpb24gU3QoZT0zMil7aWYoT2UmJnR5cGVvZiBPZS5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBPZS5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZSkpO2lmKE9lJiZ0eXBlb2YgT2UucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBPZS5yYW5kb21CeXRlcyhlKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgTXM9KGUpPT5VaW50OEFycmF5LmZyb20oZS5zcGxpdCgiIikubWFwKCh0KT0+dC5jaGFyQ29kZUF0KDApKSksS289TXMoImV4cGFuZCAxNi1ieXRlIGsiKSxPbz1NcygiZXhwYW5kIDMyLWJ5dGUgayIpLFZvPUllKEtvKSxfbz1JZShPbyk7ZnVuY3Rpb24gUChlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fWZ1bmN0aW9uIHJuKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9dmFyIFl0PTY0LE5vPTE2LFJzPTQyOTQ5NjcyOTUsSHM9bmV3IFVpbnQzMkFycmF5O2Z1bmN0aW9uIHFvKGUsdCxyLG4scyxpLG8sYSl7bGV0IGQ9cy5sZW5ndGgsdT1uZXcgVWludDhBcnJheShZdCksbD1JZSh1KSxmPXJuKHMpJiZybihpKSxoPWY/SWUocyk6SHMseT1mP0llKGkpOkhzO2ZvcihsZXQgZz0wO2c8ZDtvKyspe2lmKGUodCxyLG4sbCxvLGEpLG8+PVJzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgbT1NYXRoLm1pbihZdCxkLWcpO2lmKGYmJm09PT1ZdCl7bGV0IFM9Zy80O2lmKGclNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgeD0wLGI7eDxObzt4KyspYj1TK3gseVtiXT1oW2JdXmxbeF07Zys9WXQ7Y29udGludWV9Zm9yKGxldCBTPTAseDtTPG07UysrKXg9ZytTLGlbeF09c1t4XV51W1NdO2crPW19fWZ1bmN0aW9uIExzKGUsdCl7bGV0e2FsbG93U2hvcnRLZXlzOnIsZXh0ZW5kTm9uY2VGbjpuLGNvdW50ZXJMZW5ndGg6cyxjb3VudGVyUmlnaHQ6aSxyb3VuZHM6b309RHMoe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSx0KTtpZih0eXBlb2YgZSE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIEd0KHMpLEd0KG8pLGVuKGkpLGVuKHIpLChhLGQsdSxsLGY9MCk9PntRKGEpLFEoZCksUSh1KTtsZXQgaD11Lmxlbmd0aDtpZihsPT09dm9pZCAwKWw9bmV3IFVpbnQ4QXJyYXkoaCk7aWYoUShsKSxHdChmKSxmPDB8fGY+PVJzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtpZihsLmxlbmd0aDxoKXRocm93IEVycm9yKGBhcng6IG91dHB1dCAoJHtsLmxlbmd0aH0pIGlzIHNob3J0ZXIgdGhhbiBkYXRhICgke2h9KWApO2xldCB5PVtdLGc9YS5sZW5ndGgsbSxTO2lmKGc9PT0zMil5LnB1c2gobT1RdChhKSksUz1fbztlbHNlIGlmKGc9PT0xNiYmciltPW5ldyBVaW50OEFycmF5KDMyKSxtLnNldChhKSxtLnNldChhLDE2KSxTPVZvLHkucHVzaChtKTtlbHNlIHRocm93IEVycm9yKGBhcng6IGludmFsaWQgMzItYnl0ZSBrZXksIGdvdCBsZW5ndGg9JHtnfWApO2lmKCFybihkKSl5LnB1c2goZD1RdChkKSk7bGV0IHg9SWUobSk7aWYobil7aWYoZC5sZW5ndGghPT0yNCl0aHJvdyBFcnJvcigiYXJ4OiBleHRlbmRlZCBub25jZSBtdXN0IGJlIDI0IGJ5dGVzIik7bihTLHgsSWUoZC5zdWJhcnJheSgwLDE2KSkseCksZD1kLnN1YmFycmF5KDE2KX1sZXQgYj0xNi1zO2lmKGIhPT1kLmxlbmd0aCl0aHJvdyBFcnJvcihgYXJ4OiBub25jZSBtdXN0IGJlICR7Yn0gb3IgMTYgYnl0ZXNgKTtpZihiIT09MTIpe2xldCB3PW5ldyBVaW50OEFycmF5KDEyKTt3LnNldChkLGk/MDoxMi1kLmxlbmd0aCksZD13LHkucHVzaChkKX1sZXQgRT1JZShkKTtyZXR1cm4gcW8oZSxTLHgsRSx1LGwsZixvKSxnZSguLi55KSxsfX12YXIgSj0oZSx0KT0+ZVt0KytdJjI1NXwoZVt0KytdJjI1NSk8PDg7Y2xhc3MgS3N7Y29uc3RydWN0b3IoZSl7dGhpcy5ibG9ja0xlbj0xNix0aGlzLm91dHB1dExlbj0xNix0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5yPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5oPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5wYWQ9bmV3IFVpbnQxNkFycmF5KDgpLHRoaXMucG9zPTAsdGhpcy5maW5pc2hlZD0hMSxlPSR0KGUpLFEoZSwzMik7bGV0IHQ9SihlLDApLHI9SihlLDIpLG49SihlLDQpLHM9SihlLDYpLGk9SihlLDgpLG89SihlLDEwKSxhPUooZSwxMiksZD1KKGUsMTQpO3RoaXMuclswXT10JjgxOTEsdGhpcy5yWzFdPSh0Pj4+MTN8cjw8MykmODE5MSx0aGlzLnJbMl09KHI+Pj4xMHxuPDw2KSY3OTM5LHRoaXMuclszXT0obj4+Pjd8czw8OSkmODE5MSx0aGlzLnJbNF09KHM+Pj40fGk8PDEyKSYyNTUsdGhpcy5yWzVdPWk+Pj4xJjgxOTAsdGhpcy5yWzZdPShpPj4+MTR8bzw8MikmODE5MSx0aGlzLnJbN109KG8+Pj4xMXxhPDw1KSY4MDY1LHRoaXMucls4XT0oYT4+Pjh8ZDw8OCkmODE5MSx0aGlzLnJbOV09ZD4+PjUmMTI3O2ZvcihsZXQgdT0wO3U8ODt1KyspdGhpcy5wYWRbdV09SihlLDE2KzIqdSl9cHJvY2VzcyhlLHQscj0hMSl7bGV0IG49cj8wOjIwNDgse2g6cyxyOml9PXRoaXMsbz1pWzBdLGE9aVsxXSxkPWlbMl0sdT1pWzNdLGw9aVs0XSxmPWlbNV0saD1pWzZdLHk9aVs3XSxnPWlbOF0sbT1pWzldLFM9SihlLHQrMCkseD1KKGUsdCsyKSxiPUooZSx0KzQpLEU9SihlLHQrNiksdz1KKGUsdCs4KSxBPUooZSx0KzEwKSxrPUooZSx0KzEyKSxEPUooZSx0KzE0KSxIPXNbMF0rKFMmODE5MSksVD1zWzFdKygoUz4+PjEzfHg8PDMpJjgxOTEpLE89c1syXSsoKHg+Pj4xMHxiPDw2KSY4MTkxKSxOPXNbM10rKChiPj4+N3xFPDw5KSY4MTkxKSxfPXNbNF0rKChFPj4+NHx3PDwxMikmODE5MSksST1zWzVdKyh3Pj4+MSY4MTkxKSx2PXNbNl0rKCh3Pj4+MTR8QTw8MikmODE5MSksUj1zWzddKygoQT4+PjExfGs8PDUpJjgxOTEpLE09c1s4XSsoKGs+Pj44fEQ8PDgpJjgxOTEpLHE9c1s5XSsoRD4+PjV8biksQj0wLEc9QitIKm8rVCooNSptKStPKig1KmcpK04qKDUqeSkrXyooNSpoKTtCPUc+Pj4xMyxHJj04MTkxLEcrPUkqKDUqZikrdiooNSpsKStSKig1KnUpK00qKDUqZCkrcSooNSphKSxCKz1HPj4+MTMsRyY9ODE5MTtsZXQgWj1CK0gqYStUKm8rTyooNSptKStOKig1KmcpK18qKDUqeSk7Qj1aPj4+MTMsWiY9ODE5MSxaKz1JKig1KmgpK3YqKDUqZikrUiooNSpsKStNKig1KnUpK3EqKDUqZCksQis9Wj4+PjEzLFomPTgxOTE7bGV0IG9lPUIrSCpkK1QqYStPKm8rTiooNSptKStfKig1KmcpO0I9b2U+Pj4xMyxvZSY9ODE5MSxvZSs9SSooNSp5KSt2Kig1KmgpK1IqKDUqZikrTSooNSpsKStxKig1KnUpLEIrPW9lPj4+MTMsb2UmPTgxOTE7bGV0IHo9QitIKnUrVCpkK08qYStOKm8rXyooNSptKTtCPXo+Pj4xMyx6Jj04MTkxLHorPUkqKDUqZykrdiooNSp5KStSKig1KmgpK00qKDUqZikrcSooNSpsKSxCKz16Pj4+MTMseiY9ODE5MTtsZXQgd2U9QitIKmwrVCp1K08qZCtOKmErXypvO0I9d2U+Pj4xMyx3ZSY9ODE5MSx3ZSs9SSooNSptKSt2Kig1KmcpK1IqKDUqeSkrTSooNSpoKStxKig1KmYpLEIrPXdlPj4+MTMsd2UmPTgxOTE7bGV0IHplPUIrSCpmK1QqbCtPKnUrTipkK18qYTtCPXplPj4+MTMsemUmPTgxOTEsemUrPUkqbyt2Kig1Km0pK1IqKDUqZykrTSooNSp5KStxKig1KmgpLEIrPXplPj4+MTMsemUmPTgxOTE7bGV0IFhlPUIrSCpoK1QqZitPKmwrTip1K18qZDtCPVhlPj4+MTMsWGUmPTgxOTEsWGUrPUkqYSt2Km8rUiooNSptKStNKig1KmcpK3EqKDUqeSksQis9WGU+Pj4xMyxYZSY9ODE5MTtsZXQgamU9QitIKnkrVCpoK08qZitOKmwrXyp1O0I9amU+Pj4xMyxqZSY9ODE5MSxqZSs9SSpkK3YqYStSKm8rTSooNSptKStxKig1KmcpLEIrPWplPj4+MTMsamUmPTgxOTE7bGV0IEdlPUIrSCpnK1QqeStPKmgrTipmK18qbDtCPUdlPj4+MTMsR2UmPTgxOTEsR2UrPUkqdSt2KmQrUiphK00qbytxKig1Km0pLEIrPUdlPj4+MTMsR2UmPTgxOTE7bGV0ICRlPUIrSCptK1QqZytPKnkrTipoK18qZjtCPSRlPj4+MTMsJGUmPTgxOTEsJGUrPUkqbCt2KnUrUipkK00qYStxKm8sQis9JGU+Pj4xMywkZSY9ODE5MSxCPShCPDwyKStCfDAsQj1CK0d8MCxHPUImODE5MSxCPUI+Pj4xMyxaKz1CLHNbMF09RyxzWzFdPVosc1syXT1vZSxzWzNdPXosc1s0XT13ZSxzWzVdPXplLHNbNl09WGUsc1s3XT1qZSxzWzhdPUdlLHNbOV09JGV9ZmluYWxpemUoKXtsZXR7aDplLHBhZDp0fT10aGlzLHI9bmV3IFVpbnQxNkFycmF5KDEwKSxuPWVbMV0+Pj4xMztlWzFdJj04MTkxO2ZvcihsZXQgbz0yO288MTA7bysrKWVbb10rPW4sbj1lW29dPj4+MTMsZVtvXSY9ODE5MTtlWzBdKz1uKjUsbj1lWzBdPj4+MTMsZVswXSY9ODE5MSxlWzFdKz1uLG49ZVsxXT4+PjEzLGVbMV0mPTgxOTEsZVsyXSs9bixyWzBdPWVbMF0rNSxuPXJbMF0+Pj4xMyxyWzBdJj04MTkxO2ZvcihsZXQgbz0xO288MTA7bysrKXJbb109ZVtvXStuLG49cltvXT4+PjEzLHJbb10mPTgxOTE7cls5XS09ODE5MjtsZXQgcz0obl4xKS0xO2ZvcihsZXQgbz0wO288MTA7bysrKXJbb10mPXM7cz1+cztmb3IobGV0IG89MDtvPDEwO28rKyllW29dPWVbb10mc3xyW29dO2VbMF09KGVbMF18ZVsxXTw8MTMpJjY1NTM1LGVbMV09KGVbMV0+Pj4zfGVbMl08PDEwKSY2NTUzNSxlWzJdPShlWzJdPj4+NnxlWzNdPDw3KSY2NTUzNSxlWzNdPShlWzNdPj4+OXxlWzRdPDw0KSY2NTUzNSxlWzRdPShlWzRdPj4+MTJ8ZVs1XTw8MXxlWzZdPDwxNCkmNjU1MzUsZVs1XT0oZVs2XT4+PjJ8ZVs3XTw8MTEpJjY1NTM1LGVbNl09KGVbN10+Pj41fGVbOF08PDgpJjY1NTM1LGVbN109KGVbOF0+Pj44fGVbOV08PDUpJjY1NTM1O2xldCBpPWVbMF0rdFswXTtlWzBdPWkmNjU1MzU7Zm9yKGxldCBvPTE7bzw4O28rKylpPShlW29dK3Rbb118MCkrKGk+Pj4xNil8MCxlW29dPWkmNjU1MzU7Z2Uocil9dXBkYXRlKGUpe1pyKHRoaXMpO2xldHtidWZmZXI6dCxibG9ja0xlbjpyfT10aGlzO2U9JHQoZSk7bGV0IG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOyl7bGV0IGk9TWF0aC5taW4oci10aGlzLnBvcyxuLXMpO2lmKGk9PT1yKXtmb3IoO3I8PW4tcztzKz1yKXRoaXMucHJvY2VzcyhlLHMpO2NvbnRpbnVlfWlmKHQuc2V0KGUuc3ViYXJyYXkocyxzK2kpLHRoaXMucG9zKSx0aGlzLnBvcys9aSxzKz1pLHRoaXMucG9zPT09cil0aGlzLnByb2Nlc3ModCwwLCExKSx0aGlzLnBvcz0wfXJldHVybiB0aGlzfWRlc3Ryb3koKXtnZSh0aGlzLmgsdGhpcy5yLHRoaXMuYnVmZmVyLHRoaXMucGFkKX1kaWdlc3RJbnRvKGUpe1pyKHRoaXMpLHZzKGUsdGhpcyksdGhpcy5maW5pc2hlZD0hMDtsZXR7YnVmZmVyOnQsaDpyfT10aGlzLHtwb3M6bn09dGhpcztpZihuKXt0W24rK109MTtmb3IoO248MTY7bisrKXRbbl09MDt0aGlzLnByb2Nlc3ModCwwLCEwKX10aGlzLmZpbmFsaXplKCk7bGV0IHM9MDtmb3IobGV0IGk9MDtpPDg7aSsrKWVbcysrXT1yW2ldPj4+MCxlW3MrK109cltpXT4+Pjg7cmV0dXJuIGV9ZGlnZXN0KCl7bGV0e2J1ZmZlcjplLG91dHB1dExlbjp0fT10aGlzO3RoaXMuZGlnZXN0SW50byhlKTtsZXQgcj1lLnNsaWNlKDAsdCk7cmV0dXJuIHRoaXMuZGVzdHJveSgpLHJ9fWZ1bmN0aW9uIEZvKGUpe2xldCB0PShuLHMpPT5lKHMpLnVwZGF0ZSgkdChuKSkuZGlnZXN0KCkscj1lKG5ldyBVaW50OEFycmF5KDMyKSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgbm49Rm8oKGUpPT5uZXcgS3MoZSkpO2Z1bmN0aW9uIFdvKGUsdCxyLG4scyxpPTIwKXtsZXQgbz1lWzBdLGE9dFswXSxkPXRbMV0sdT10WzJdLGw9dFszXSxmPWVbMV0saD1yWzBdLHk9clsxXSxnPXMsbT0wLFM9ZVsyXSx4PXRbNF0sYj10WzVdLEU9dFs2XSx3PXRbN10sQT1lWzNdLGs9byxEPWEsSD1kLFQ9dSxPPWwsTj1mLF89aCxJPXksdj1nLFI9bSxNPVMscT14LEI9YixHPUUsWj13LG9lPUE7Zm9yKGxldCB3ZT0wO3dlPGk7d2UrPTIpT149UChrK0J8MCw3KSx2Xj1QKE8ra3wwLDkpLEJePVAoditPfDAsMTMpLGtePVAoQit2fDAsMTgpLFJePVAoTitEfDAsNyksR149UChSK058MCw5KSxEXj1QKEcrUnwwLDEzKSxOXj1QKEQrR3wwLDE4KSxaXj1QKE0rX3wwLDcpLEhePVAoWitNfDAsOSksX149UChIK1p8MCwxMyksTV49UChfK0h8MCwxOCksVF49UChvZStxfDAsNyksSV49UChUK29lfDAsOSkscV49UChJK1R8MCwxMyksb2VePVAocStJfDAsMTgpLERePVAoaytUfDAsNyksSF49UChEK2t8MCw5KSxUXj1QKEgrRHwwLDEzKSxrXj1QKFQrSHwwLDE4KSxfXj1QKE4rT3wwLDcpLElePVAoXytOfDAsOSksT149UChJK198MCwxMyksTl49UChPK0l8MCwxOCkscV49UChNK1J8MCw3KSx2Xj1QKHErTXwwLDkpLFJePVAoditxfDAsMTMpLE1ePVAoUit2fDAsMTgpLEJePVAob2UrWnwwLDcpLEdePVAoQitvZXwwLDkpLFpePVAoRytCfDAsMTMpLG9lXj1QKForR3wwLDE4KTtsZXQgej0wO25beisrXT1vK2t8MCxuW3orK109YStEfDAsblt6KytdPWQrSHwwLG5beisrXT11K1R8MCxuW3orK109bCtPfDAsblt6KytdPWYrTnwwLG5beisrXT1oK198MCxuW3orK109eStJfDAsblt6KytdPWcrdnwwLG5beisrXT1tK1J8MCxuW3orK109UytNfDAsblt6KytdPXgrcXwwLG5beisrXT1iK0J8MCxuW3orK109RStHfDAsblt6KytdPXcrWnwwLG5beisrXT1BK29lfDB9ZnVuY3Rpb24gem8oZSx0LHIsbil7bGV0IHM9ZVswXSxpPXRbMF0sbz10WzFdLGE9dFsyXSxkPXRbM10sdT1lWzFdLGw9clswXSxmPXJbMV0saD1yWzJdLHk9clszXSxnPWVbMl0sbT10WzRdLFM9dFs1XSx4PXRbNl0sYj10WzddLEU9ZVszXTtmb3IobGV0IEE9MDtBPDIwO0ErPTIpZF49UChzK1N8MCw3KSxoXj1QKGQrc3wwLDkpLFNePVAoaCtkfDAsMTMpLHNePVAoUytofDAsMTgpLHlePVAodStpfDAsNykseF49UCh5K3V8MCw5KSxpXj1QKHgreXwwLDEzKSx1Xj1QKGkreHwwLDE4KSxiXj1QKGcrbHwwLDcpLG9ePVAoYitnfDAsOSksbF49UChvK2J8MCwxMyksZ149UChsK298MCwxOCksYV49UChFK218MCw3KSxmXj1QKGErRXwwLDkpLG1ePVAoZithfDAsMTMpLEVePVAobStmfDAsMTgpLGlePVAocythfDAsNyksb149UChpK3N8MCw5KSxhXj1QKG8raXwwLDEzKSxzXj1QKGErb3wwLDE4KSxsXj1QKHUrZHwwLDcpLGZePVAobCt1fDAsOSksZF49UChmK2x8MCwxMyksdV49UChkK2Z8MCwxOCksbV49UChnK3l8MCw3KSxoXj1QKG0rZ3wwLDkpLHlePVAoaCttfDAsMTMpLGdePVAoeStofDAsMTgpLFNePVAoRStifDAsNykseF49UChTK0V8MCw5KSxiXj1QKHgrU3wwLDEzKSxFXj1QKGIreHwwLDE4KTtsZXQgdz0wO25bdysrXT1zLG5bdysrXT11LG5bdysrXT1nLG5bdysrXT1FLG5bdysrXT1sLG5bdysrXT1mLG5bdysrXT1oLG5bdysrXT15fXZhciBzbj1McyhXbyx7Y291bnRlclJpZ2h0OiEwLGV4dGVuZE5vbmNlRm46em99KSxvbj1Ucyh7YmxvY2tTaXplOjY0LG5vbmNlTGVuZ3RoOjI0LHRhZ0xlbmd0aDoxNn0sKGUsdCk9Pih7ZW5jcnlwdChyLG4pe249dG4oci5sZW5ndGgrMzIsbiwhMSk7bGV0IHM9bi5zdWJhcnJheSgwLDMyKSxpPW4uc3ViYXJyYXkoMzIpO24uc2V0KHIsMzIpLGdlKHMpLHNuKGUsdCxuLG4pO2xldCBvPW5uKGkscyk7cmV0dXJuIG4uc2V0KG8sMTYpLGdlKG4uc3ViYXJyYXkoMCwxNiksbyksbi5zdWJhcnJheSgxNil9LGRlY3J5cHQocixuKXtRKHIpLG49dG4oci5sZW5ndGgrMzIsbiwhMSk7bGV0IHM9bi5zdWJhcnJheSgwLDMyKSxpPW4uc3ViYXJyYXkoMzIsNDgpLG89bi5zdWJhcnJheSg0OCk7bi5zZXQociwzMiksZ2Uocyk7bGV0IGE9c24oZSx0LHMscyksZD1ubihvLGEpO2lmKCFDcyhpLGQpKXRocm93IEVycm9yKCJpbnZhbGlkIHRhZyIpO3JldHVybiBzbihlLHQsbi5zdWJhcnJheSgxNiksbi5zdWJhcnJheSgxNikpLGdlKHMsaSxkKSxvfX0pKTsvKiEgbm9ibGUtaGFzaGVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovZnVuY3Rpb24gWG8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBidChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gVmUoZSwuLi50KXtpZighWG8oZSkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aD4wJiYhdC5pbmNsdWRlcyhlLmxlbmd0aCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoICIrdCsiLCBnb3QgbGVuZ3RoPSIrZS5sZW5ndGgpfWZ1bmN0aW9uIHd0KGUsdD0hMCl7aWYoZS5kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkIik7aWYodCYmZS5maW5pc2hlZCl0aHJvdyBFcnJvcigiSGFzaCNkaWdlc3QoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpfWZ1bmN0aW9uIEp0KGUsdCl7VmUoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBPcyhlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIG5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpfWZ1bmN0aW9uIG90KC4uLmUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmlsbCgwKX1mdW5jdGlvbiBJdChlLHQpe3JldHVybiBlPDwzMi10fGU+Pj50fXZhciBWcz0oKCk9Pm5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4KSgpO2Z1bmN0aW9uIF9zKGUpe3JldHVybiBlPDwyNCY0Mjc4MTkwMDgwfGU8PDgmMTY3MTE2ODB8ZT4+PjgmNjUyODB8ZT4+PjI0JjI1NX12YXIgTnM9VnM/KGUpPT5lOihlKT0+X3MoZSk7ZnVuY3Rpb24gam8oZSl7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XT1fcyhlW3RdKTtyZXR1cm4gZX12YXIgdGU9VnM/KGUpPT5lOmpvO2Z1bmN0aW9uIEdvKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIGF0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1HbyhlKTtyZXR1cm4gVmUoZSksZX1jbGFzcyBhbnt9ZnVuY3Rpb24gcXMoZSl7bGV0IHQ9KG4scyk9PmUocykudXBkYXRlKGF0KG4pKS5kaWdlc3QoKSxyPWUoe30pO3JldHVybiB0Lm91dHB1dExlbj1yLm91dHB1dExlbix0LmJsb2NrTGVuPXIuYmxvY2tMZW4sdC5jcmVhdGU9KG4pPT5lKG4pLHR9dmFyIEZzPVVpbnQzMkFycmF5LmZyb20oWzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSk7dmFyIFp0PUJpZ0ludCg0Mjk0OTY3Mjk1KSxXcz1CaWdJbnQoMzIpO2Z1bmN0aW9uIGNuKGUsdD0hMSl7aWYodClyZXR1cm57aDpOdW1iZXIoZSZadCksbDpOdW1iZXIoZT4+V3MmWnQpfTtyZXR1cm57aDpOdW1iZXIoZT4+V3MmWnQpfDAsbDpOdW1iZXIoZSZadCl8MH19ZnVuY3Rpb24geGUoZSx0LHIsbixzKXtyZXR1cm4gZT1lK3Qrc3wwLG49SXQobl5lLDE2KSxyPXIrbnwwLHQ9SXQodF5yLDEyKSx7YTplLGI6dCxjOnIsZDpufX1mdW5jdGlvbiBFZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj1JdChuXmUsOCkscj1yK258MCx0PUl0KHReciw3KSx7YTplLGI6dCxjOnIsZDpufX1jbGFzcyBkbiBleHRlbmRzIGFue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKTt0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMubGVuZ3RoPTAsdGhpcy5wb3M9MCxidChlKSxidCh0KSx0aGlzLmJsb2NrTGVuPWUsdGhpcy5vdXRwdXRMZW49dCx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheShlKSx0aGlzLmJ1ZmZlcjMyPWl0KHRoaXMuYnVmZmVyKX11cGRhdGUoZSl7d3QodGhpcyksZT1hdChlKSxWZShlKTtsZXR7YmxvY2tMZW46dCxidWZmZXI6cixidWZmZXIzMjpufT10aGlzLHM9ZS5sZW5ndGgsaT1lLmJ5dGVPZmZzZXQsbz1lLmJ1ZmZlcjtmb3IobGV0IGE9MDthPHM7KXtpZih0aGlzLnBvcz09PXQpdGUobiksdGhpcy5jb21wcmVzcyhuLDAsITEpLHRlKG4pLHRoaXMucG9zPTA7bGV0IGQ9TWF0aC5taW4odC10aGlzLnBvcyxzLWEpLHU9aSthO2lmKGQ9PT10JiYhKHUlNCkmJmErZDxzKXtsZXQgbD1uZXcgVWludDMyQXJyYXkobyx1LE1hdGguZmxvb3IoKHMtYSkvNCkpO3RlKGwpO2ZvcihsZXQgZj0wO2ErdDxzO2YrPW4ubGVuZ3RoLGErPXQpdGhpcy5sZW5ndGgrPXQsdGhpcy5jb21wcmVzcyhsLGYsITEpO3RlKGwpO2NvbnRpbnVlfXIuc2V0KGUuc3ViYXJyYXkoYSxhK2QpLHRoaXMucG9zKSx0aGlzLnBvcys9ZCx0aGlzLmxlbmd0aCs9ZCxhKz1kfXJldHVybiB0aGlzfWRpZ2VzdEludG8oZSl7d3QodGhpcyksSnQoZSx0aGlzKTtsZXR7cG9zOnQsYnVmZmVyMzI6cn09dGhpczt0aGlzLmZpbmlzaGVkPSEwLG90KHRoaXMuYnVmZmVyLnN1YmFycmF5KHQpKSx0ZShyKSx0aGlzLmNvbXByZXNzKHIsMCwhMCksdGUocik7bGV0IG49aXQoZSk7dGhpcy5nZXQoKS5mb3JFYWNoKChzLGkpPT5uW2ldPU5zKHMpKX1kaWdlc3QoKXtsZXR7YnVmZmVyOmUsb3V0cHV0TGVuOnR9PXRoaXM7dGhpcy5kaWdlc3RJbnRvKGUpO2xldCByPWUuc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5kZXN0cm95KCkscn1fY2xvbmVJbnRvKGUpe2xldHtidWZmZXI6dCxsZW5ndGg6cixmaW5pc2hlZDpuLGRlc3Ryb3llZDpzLG91dHB1dExlbjppLHBvczpvfT10aGlzO3JldHVybiBlfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGtMZW46aX0pKSxlLnNldCguLi50aGlzLmdldCgpKSxlLmJ1ZmZlci5zZXQodCksZS5kZXN0cm95ZWQ9cyxlLmZpbmlzaGVkPW4sZS5sZW5ndGg9cixlLnBvcz1vLGUub3V0cHV0TGVuPWksZX1jbG9uZSgpe3JldHVybiB0aGlzLl9jbG9uZUludG8oKX19ZnVuY3Rpb24gdW4oZSx0LHIsbixzLGksbyxhLGQsdSxsLGYsaCx5LGcsbSxTLHgsYixFKXtsZXQgdz0wO2ZvcihsZXQgQT0wO0E8bjtBKyspKHthOnMsYjpkLGM6aCxkOlN9PXhlKHMsZCxoLFMsclt0K2VbdysrXV0pKSx7YTpzLGI6ZCxjOmgsZDpTfT1FZShzLGQsaCxTLHJbdCtlW3crK11dKSx7YTppLGI6dSxjOnksZDp4fT14ZShpLHUseSx4LHJbdCtlW3crK11dKSx7YTppLGI6dSxjOnksZDp4fT1FZShpLHUseSx4LHJbdCtlW3crK11dKSx7YTpvLGI6bCxjOmcsZDpifT14ZShvLGwsZyxiLHJbdCtlW3crK11dKSx7YTpvLGI6bCxjOmcsZDpifT1FZShvLGwsZyxiLHJbdCtlW3crK11dKSx7YSxiOmYsYzptLGQ6RX09eGUoYSxmLG0sRSxyW3QrZVt3KytdXSkse2EsYjpmLGM6bSxkOkV9PUVlKGEsZixtLEUsclt0K2VbdysrXV0pLHthOnMsYjp1LGM6ZyxkOkV9PXhlKHMsdSxnLEUsclt0K2VbdysrXV0pLHthOnMsYjp1LGM6ZyxkOkV9PUVlKHMsdSxnLEUsclt0K2VbdysrXV0pLHthOmksYjpsLGM6bSxkOlN9PXhlKGksbCxtLFMsclt0K2VbdysrXV0pLHthOmksYjpsLGM6bSxkOlN9PUVlKGksbCxtLFMsclt0K2VbdysrXV0pLHthOm8sYjpmLGM6aCxkOnh9PXhlKG8sZixoLHgsclt0K2VbdysrXV0pLHthOm8sYjpmLGM6aCxkOnh9PUVlKG8sZixoLHgsclt0K2VbdysrXV0pLHthLGI6ZCxjOnksZDpifT14ZShhLGQseSxiLHJbdCtlW3crK11dKSx7YSxiOmQsYzp5LGQ6Yn09RWUoYSxkLHksYixyW3QrZVt3KytdXSk7cmV0dXJue3YwOnMsdjE6aSx2MjpvLHYzOmEsdjQ6ZCx2NTp1LHY2Omwsdjc6Zix2ODpoLHY5OnksdjEwOmcsdjExOm0sdjEyOlMsdjEzOngsdjE0OmIsdjE1OkV9fXZhciBTZT17Q0hVTktfU1RBUlQ6MSxDSFVOS19FTkQ6MixQQVJFTlQ6NCxST09UOjgsS0VZRURfSEFTSDoxNixERVJJVkVfS0VZX0NPTlRFWFQ6MzIsREVSSVZFX0tFWV9NQVRFUklBTDo2NH0sQWU9RnMuc2xpY2UoKSx6cz0oKCk9PntsZXQgZT1BcnJheS5mcm9tKHtsZW5ndGg6MTZ9LChuLHMpPT5zKSx0PShuKT0+WzIsNiwzLDEwLDcsMCw0LDEzLDEsMTEsMTIsNSw5LDE0LDE1LDhdLm1hcCgocyk9Pm5bc10pLHI9W107Zm9yKGxldCBuPTAscz1lO248NztuKysscz10KHMpKXIucHVzaCguLi5zKTtyZXR1cm4gVWludDhBcnJheS5mcm9tKHIpfSkoKTtjbGFzcyBsbiBleHRlbmRzIGRue2NvbnN0cnVjdG9yKGU9e30sdD0wKXtzdXBlcig2NCxlLmRrTGVuPT09dm9pZCAwPzMyOmUuZGtMZW4pO3RoaXMuY2h1bmtQb3M9MCx0aGlzLmNodW5rc0RvbmU9MCx0aGlzLmZsYWdzPTAsdGhpcy5zdGFjaz1bXSx0aGlzLnBvc091dD0wLHRoaXMuYnVmZmVyT3V0MzI9bmV3IFVpbnQzMkFycmF5KDE2KSx0aGlzLmNodW5rT3V0PTAsdGhpcy5lbmFibGVYT0Y9ITA7bGV0e2tleTpyLGNvbnRleHQ6bn09ZSxzPW4hPT12b2lkIDA7aWYociE9PXZvaWQgMCl7aWYocyl0aHJvdyBFcnJvcignT25seSAia2V5IiBvciAiY29udGV4dCIgY2FuIGJlIHNwZWNpZmllZCBhdCBzYW1lIHRpbWUnKTtsZXQgaT1hdChyKS5zbGljZSgpO1ZlKGksMzIpLHRoaXMuSVY9aXQoaSksdGUodGhpcy5JViksdGhpcy5mbGFncz10fFNlLktFWUVEX0hBU0h9ZWxzZSBpZihzKXtsZXQgaT1hdChuKSxvPW5ldyBsbih7ZGtMZW46MzJ9LFNlLkRFUklWRV9LRVlfQ09OVEVYVCkudXBkYXRlKGkpLmRpZ2VzdCgpO3RoaXMuSVY9aXQobyksdGUodGhpcy5JViksdGhpcy5mbGFncz10fFNlLkRFUklWRV9LRVlfTUFURVJJQUx9ZWxzZSB0aGlzLklWPUFlLnNsaWNlKCksdGhpcy5mbGFncz10O3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpLHRoaXMuYnVmZmVyT3V0PU9zKHRoaXMuYnVmZmVyT3V0MzIpfWdldCgpe3JldHVybltdfXNldCgpe31iMkNvbXByZXNzKGUsdCxyLG49MCl7bGV0e3N0YXRlOnMscG9zOml9PXRoaXMse2g6byxsOmF9PWNuKEJpZ0ludChlKSwhMCkse3YwOmQsdjE6dSx2MjpsLHYzOmYsdjQ6aCx2NTp5LHY2Omcsdjc6bSx2ODpTLHY5OngsdjEwOmIsdjExOkUsdjEyOncsdjEzOkEsdjE0OmssdjE1OkR9PXVuKHpzLG4sciw3LHNbMF0sc1sxXSxzWzJdLHNbM10sc1s0XSxzWzVdLHNbNl0sc1s3XSxBZVswXSxBZVsxXSxBZVsyXSxBZVszXSxvLGEsaSx0KTtzWzBdPWReUyxzWzFdPXVeeCxzWzJdPWxeYixzWzNdPWZeRSxzWzRdPWhedyxzWzVdPXleQSxzWzZdPWdeayxzWzddPW1eRH1jb21wcmVzcyhlLHQ9MCxyPSExKXtsZXQgbj10aGlzLmZsYWdzO2lmKCF0aGlzLmNodW5rUG9zKW58PVNlLkNIVU5LX1NUQVJUO2lmKHRoaXMuY2h1bmtQb3M9PT0xNXx8cilufD1TZS5DSFVOS19FTkQ7aWYoIXIpdGhpcy5wb3M9dGhpcy5ibG9ja0xlbjtpZih0aGlzLmIyQ29tcHJlc3ModGhpcy5jaHVua3NEb25lLG4sZSx0KSx0aGlzLmNodW5rUG9zKz0xLHRoaXMuY2h1bmtQb3M9PT0xNnx8cil7bGV0IHM9dGhpcy5zdGF0ZTt0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKTtmb3IobGV0IGksbz10aGlzLmNodW5rc0RvbmUrMTtyfHwhKG8mMSk7bz4+PTEpe2lmKCEoaT10aGlzLnN0YWNrLnBvcCgpKSlicmVhazt0aGlzLmJ1ZmZlcjMyLnNldChpLDApLHRoaXMuYnVmZmVyMzIuc2V0KHMsOCksdGhpcy5wb3M9dGhpcy5ibG9ja0xlbix0aGlzLmIyQ29tcHJlc3MoMCx0aGlzLmZsYWdzfFNlLlBBUkVOVCx0aGlzLmJ1ZmZlcjMyLDApLHM9dGhpcy5zdGF0ZSx0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKX10aGlzLmNodW5rc0RvbmUrKyx0aGlzLmNodW5rUG9zPTAsdGhpcy5zdGFjay5wdXNoKHMpfXRoaXMucG9zPTB9X2Nsb25lSW50byhlKXtlPXN1cGVyLl9jbG9uZUludG8oZSk7bGV0e0lWOnQsZmxhZ3M6cixzdGF0ZTpuLGNodW5rUG9zOnMscG9zT3V0OmksY2h1bmtPdXQ6byxzdGFjazphLGNodW5rc0RvbmU6ZH09dGhpcztyZXR1cm4gZS5zdGF0ZS5zZXQobi5zbGljZSgpKSxlLnN0YWNrPWEubWFwKCh1KT0+VWludDMyQXJyYXkuZnJvbSh1KSksZS5JVi5zZXQodCksZS5mbGFncz1yLGUuY2h1bmtQb3M9cyxlLmNodW5rc0RvbmU9ZCxlLnBvc091dD1pLGUuY2h1bmtPdXQ9byxlLmVuYWJsZVhPRj10aGlzLmVuYWJsZVhPRixlLmJ1ZmZlck91dDMyLnNldCh0aGlzLmJ1ZmZlck91dDMyKSxlfWRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMCxvdCh0aGlzLnN0YXRlLHRoaXMuYnVmZmVyMzIsdGhpcy5JVix0aGlzLmJ1ZmZlck91dDMyKSxvdCguLi50aGlzLnN0YWNrKX1iMkNvbXByZXNzT3V0KCl7bGV0e3N0YXRlOmUscG9zOnQsZmxhZ3M6cixidWZmZXIzMjpuLGJ1ZmZlck91dDMyOnN9PXRoaXMse2g6aSxsOm99PWNuKEJpZ0ludCh0aGlzLmNodW5rT3V0KyspKTt0ZShuKTtsZXR7djA6YSx2MTpkLHYyOnUsdjM6bCx2NDpmLHY1OmgsdjY6eSx2NzpnLHY4Om0sdjk6Uyx2MTA6eCx2MTE6Yix2MTI6RSx2MTM6dyx2MTQ6QSx2MTU6a309dW4oenMsMCxuLDcsZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLEFlWzBdLEFlWzFdLEFlWzJdLEFlWzNdLG8saSx0LHIpO3NbMF09YV5tLHNbMV09ZF5TLHNbMl09dV54LHNbM109bF5iLHNbNF09Zl5FLHNbNV09aF53LHNbNl09eV5BLHNbN109Z15rLHNbOF09ZVswXV5tLHNbOV09ZVsxXV5TLHNbMTBdPWVbMl1eeCxzWzExXT1lWzNdXmIsc1sxMl09ZVs0XV5FLHNbMTNdPWVbNV1edyxzWzE0XT1lWzZdXkEsc1sxNV09ZVs3XV5rLHRlKG4pLHRlKHMpLHRoaXMucG9zT3V0PTB9ZmluaXNoKCl7aWYodGhpcy5maW5pc2hlZClyZXR1cm47dGhpcy5maW5pc2hlZD0hMCxvdCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcykpO2xldCBlPXRoaXMuZmxhZ3N8U2UuUk9PVDtpZih0aGlzLnN0YWNrLmxlbmd0aCllfD1TZS5QQVJFTlQsdGUodGhpcy5idWZmZXIzMiksdGhpcy5jb21wcmVzcyh0aGlzLmJ1ZmZlcjMyLDAsITApLHRlKHRoaXMuYnVmZmVyMzIpLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMucG9zPXRoaXMuYmxvY2tMZW47ZWxzZSBlfD0oIXRoaXMuY2h1bmtQb3M/U2UuQ0hVTktfU1RBUlQ6MCl8U2UuQ0hVTktfRU5EO3RoaXMuZmxhZ3M9ZSx0aGlzLmIyQ29tcHJlc3NPdXQoKX13cml0ZUludG8oZSl7d3QodGhpcywhMSksVmUoZSksdGhpcy5maW5pc2goKTtsZXR7YmxvY2tMZW46dCxidWZmZXJPdXQ6cn09dGhpcztmb3IobGV0IG49MCxzPWUubGVuZ3RoO248czspe2lmKHRoaXMucG9zT3V0Pj10KXRoaXMuYjJDb21wcmVzc091dCgpO2xldCBpPU1hdGgubWluKHQtdGhpcy5wb3NPdXQscy1uKTtlLnNldChyLnN1YmFycmF5KHRoaXMucG9zT3V0LHRoaXMucG9zT3V0K2kpLG4pLHRoaXMucG9zT3V0Kz1pLG4rPWl9cmV0dXJuIGV9eG9mSW50byhlKXtpZighdGhpcy5lbmFibGVYT0YpdGhyb3cgRXJyb3IoIlhPRiBpcyBub3QgcG9zc2libGUgYWZ0ZXIgZGlnZXN0IGNhbGwiKTtyZXR1cm4gdGhpcy53cml0ZUludG8oZSl9eG9mKGUpe3JldHVybiBidChlKSx0aGlzLnhvZkludG8obmV3IFVpbnQ4QXJyYXkoZSkpfWRpZ2VzdEludG8oZSl7aWYoSnQoZSx0aGlzKSx0aGlzLmZpbmlzaGVkKXRocm93IEVycm9yKCJkaWdlc3QoKSB3YXMgYWxyZWFkeSBjYWxsZWQiKTtyZXR1cm4gdGhpcy5lbmFibGVYT0Y9ITEsdGhpcy53cml0ZUludG8oZSksdGhpcy5kZXN0cm95KCksZX1kaWdlc3QoKXtyZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSl9fXZhciBYcz1xcygoZSk9Pm5ldyBsbihlKSk7dmFyICRvPTMyLGR5PVN5bWJvbCgiWDI1NTE5U2siKTtmdW5jdGlvbiBqcyhlKXtpZihlLmJ5dGVMZW5ndGghPT0kbylyZXR1cm4gYygxMCk7cmV0dXJuIHAoZSl9dmFyIFY9KDFuPDwyNTVuKS0xOW4sUW89MTIxNjY1bixHcz1uZXcgVWludDhBcnJheSgzMik7R3NbMF09OTtmdW5jdGlvbiAkcyhlKXtsZXQgdD0wbjtmb3IobGV0IHI9ZS5sZW5ndGgtMTtyPj0wO3ItLSl0PXQ8PDhufEJpZ0ludChlW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiBZbyhlKXtsZXQgdD1uZXcgVWludDhBcnJheSgzMikscj0oZSVWK1YpJVY7Zm9yKGxldCBuPTA7bjwzMjtuKyspdFtuXT1OdW1iZXIociYweGZmbikscj4+PThuO3JldHVybiB0fWZ1bmN0aW9uIEpvKGUpe2xldCB0PWUuc2xpY2UoKTtyZXR1cm4gdFszMV0mPTEyNywkcyh0KX1mdW5jdGlvbiBabyhlKXtsZXQgdD1lLnNsaWNlKCk7cmV0dXJuIHRbMF0mPTI0OCx0WzMxXSY9MTI3LHRbMzFdfD02NCx0fWZ1bmN0aW9uIGVyKGUsdCxyKXtsZXQgbj0tZSxzPSh0XnIpJm47cmV0dXJuW3RecyxyXnNdfWZ1bmN0aW9uIGVhKGUpe2xldCB0PVYtMm4scj0oZSVWK1YpJVYsbj0xbjt3aGlsZSh0PjBuKXtpZih0JjFuKW49bipyJVY7cj1yKnIlVix0Pj49MW59cmV0dXJuIG59ZnVuY3Rpb24gZm4oZSx0KXtsZXQgcj1abyhlKSxuPUpvKHQpLHM9MW4saT0wbixvPW4sYT0xbixkPTBuLHU9JHMocik7Zm9yKGxldCBsPTI1NDtsPj0wO2wtLSl7bGV0IGY9dT4+QmlnSW50KGwpJjFuO2RePWYsW3Msb109ZXIoZCxzLG8pLFtpLGFdPWVyKGQsaSxhKSxkPWY7bGV0IGg9KHMraSklVix5PWgqaCVWLGc9KHMtaStWKSVWLG09ZypnJVYsUz0oeS1tK1YpJVYseD0obythKSVWLEU9KG8tYStWKSVWKmglVix3PXgqZyVWLEE9KEUrdyklVixrPShFLXcrViklVjtvPUEqQSVWLGE9biprKmslVixzPXkqbSVWLGk9UyooeStRbypTKSVWfXJldHVybltzLG9dPWVyKGQscyxvKSxbaSxhXT1lcihkLGksYSksci5maWxsKDApLFlvKHMqZWEoaSklVil9ZnVuY3Rpb24gUXMoZSl7cmV0dXJuIGZuKGUsR3MpfXZhciBwbj1uZXcgVWludDhBcnJheShbNDgsNDYsMiwxLDAsNDgsNSw2LDMsNDMsMTAxLDExMiw0LDM0LDQsMzJdKTtmdW5jdGlvbiBZcyhlKXtsZXQgdD1uZXcgVWludDhBcnJheShwbi5sZW5ndGgrMzIpO3JldHVybiB0LnNldChwbiksdC5zZXQoZS5zdWJhcnJheSgwLDMyKSxwbi5sZW5ndGgpLHR9dmFyIGhuPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEwLDQsMzQsNCwzMl0pO2Z1bmN0aW9uIEpzKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGhuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KGhuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLGhuLmxlbmd0aCksdH1mdW5jdGlvbiBacyhlKXtyZXR1cm4gdHlwZW9mIGU9PT0ic3RyaW5nIj9uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSk6ZX1mdW5jdGlvbiBQZShlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodCkuc2V0KGUpLHR9Y2xhc3MgX2V7dmVyaWZ5S2V5cz1uZXcgTWFwO2FzeW5jIGdlblJhbmRvbUJ5dGVzKGUpe3JldHVybiBTdChlKX1hc3luYyBnZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCl7cmV0dXJuIFN0KDMyKX1hc3luYyBlbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGUsdCl7bGV0IHI9U3QoMjQpLHM9b24odCxyKS5lbmNyeXB0KGUpO3JldHVybiBuZXcgVWludDhBcnJheShbLi4uciwuLi5zXSl9YXN5bmMgZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChlLHQpe2xldCByPWUuc2xpY2UoMCwyNCksbj1lLnNsaWNlKDI0KTtyZXR1cm4gb24odCxyKS5kZWNyeXB0KG4pfWFzeW5jIGRlcml2ZUVkMjU1MTlLZXlQYWlyKGUpe2xldCB0PWUscj1Zcyh0KSxuPVBlKHIpLHM7dHJ5e2xldCB1PWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITAsWyJzaWduIl0pO3M9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIix1KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfWlmKHR5cGVvZiBzLnghPT0ic3RyaW5nIil0aHJvdyBFcnJvcigiRWQyNTUxOSBKV0sgbWlzc2luZyB4Iik7bGV0IGk9cy54O3MuZD12b2lkIDA7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgiandrIix7a3R5OiJPS1AiLGNydjoiRWQyNTUxOSIseDppfSx7bmFtZToiRWQyNTUxOSJ9LCEwLFsidmVyaWZ5Il0pLGE9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgicmF3IixvKSk7dGhpcy52ZXJpZnlLZXlzLnNldChoZShhKSxvKTtsZXQgZD1uZXcgVWludDhBcnJheSg2NCk7cmV0dXJuIGQuc2V0KHQsMCksZC5zZXQoYSwzMikse2tleVR5cGU6ImVkMjU1MTkiLHByaXZhdGVLZXk6ZCxwdWJsaWNLZXk6YX19YXN5bmMgaW1wb3J0U2lnbktleShlKXtsZXQgdD1lLnN1YmFycmF5KDAsMzIpLHI9WXModCksbj1QZShyKTt0cnl7cmV0dXJuIGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITEsWyJzaWduIl0pfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9fWFzeW5jIGltcG9ydFZlcmlmeUtleShlKXtsZXQgdD1oZShlKSxyPXRoaXMudmVyaWZ5S2V5cy5nZXQodCk7aWYocilyZXR1cm4gcjtsZXQgbj1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLFBlKGUpLHtuYW1lOiJFZDI1NTE5In0sITEsWyJ2ZXJpZnkiXSk7cmV0dXJuIHRoaXMudmVyaWZ5S2V5cy5zZXQodCxuKSxufWFzeW5jIHNpZ25FZDI1NTE5KGUsdCl7bGV0IHI9WnMoZSksbj1hd2FpdCB0aGlzLmltcG9ydFNpZ25LZXkodCkscz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuc2lnbih7bmFtZToiRWQyNTUxOSJ9LG4sUGUocikpO3JldHVybiBuZXcgVWludDhBcnJheShzKX1hc3luYyBjaGVja1NpZ0VkMjU1MTkoZSx0LHIpe2xldCBuPVpzKHQpO3RyeXtsZXQgcz1hd2FpdCB0aGlzLmltcG9ydFZlcmlmeUtleShyKTtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLnZlcmlmeSh7bmFtZToiRWQyNTUxOSJ9LHMsUGUoZSksUGUobikpfWNhdGNoe3JldHVybiExfX1hc3luYyBibGFrZTMoZSl7cmV0dXJuIFhzKGUpfWFzeW5jIGdlblgyNTUxOSgpe2xldCBlPWF3YWl0IFN0KDMyKTtlWzBdJj0yNDgsZVszMV0mPTEyNyxlWzMxXXw9NjQ7bGV0W3Qscl09anMoZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgZS5maWxsKDApLEVycm9yKCJYMjU1MTkgc2NhbGFyIGJyYW5kIGZhaWxlZCIpO2xldCBuPVFzKHQpLHM9SnModCksaT1QZShzKTt0cnl7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLGkse25hbWU6IlgyNTUxOSJ9LCEwLFsiZGVyaXZlQml0cyJdKSxhPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsbyk7aWYodHlwZW9mIGEueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJYMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCBkPSRuKGEueCk7aWYoYS5kPXZvaWQgMCwhWChkLG4pKXRocm93IEVycm9yKCJYMjU1MTkgV2ViQ3J5cHRvIHB1YiAhPSBSRkMgNzc0OCIpO3JldHVybntwcml2OnQscHViOm59fWNhdGNoKG8pe3Rocm93IHQuZmlsbCgwKSxvfWZpbmFsbHl7cy5maWxsKDApLG5ldyBVaW50OEFycmF5KGkpLmZpbGwoMCl9fWFzeW5jIHgyNTUxOVNoYXJlZChlLHQpe2xldCByPUpzKGUpLG49UGUocik7dHJ5e2xldCBzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJYMjU1MTkifSwhMSxbImRlcml2ZUJpdHMiXSksaT1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLFBlKHQpLHtuYW1lOiJYMjU1MTkifSwhMSxbXSksbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyh7bmFtZToiWDI1NTE5IixwdWJsaWM6aX0scywyNTYpO3JldHVybiBuZXcgVWludDhBcnJheShvKX1jYXRjaHtyZXR1cm4gZm4oZSx0KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfX19dmFyIHRhPW5ldyBfZSx0cj10YTt2YXIgcnI9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJTdHJpbmcodC5oYW5kbGUpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJTdHJpbmcodC5sYWJlbCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIGUud3JpdGVWYXJJbnQodC5pZHg/PzApfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyU3RyaW5nKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFyU3RyaW5nKCk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFySW50KCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe2hhbmRsZTp0LGxhYmVsOm4saWR4Oml9KX19O3ZhciB5bj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckludCh0Lmhvc3RzLmxlbmd0aCk7aWYociE9PTApcmV0dXJuIHI7Zm9yKGxldCBuIG9mIHQuaG9zdHMpe2xldCBzPWUud3JpdGVTdHJ1Y3QocnIsbik7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHx0PDApcmV0dXJuIGMoMTApO2xldCBuPVtdO2ZvcihsZXQgcz0wO3M8dDtzKyspe2xldFtpLG9dPWUucmVhZFN0cnVjdChycik7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7bi5wdXNoKGkpfXJldHVybiBwKHtob3N0czpufSl9fTt2YXIgcmE9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLnFycGFpci52MSIpLHh0PTMyLG5hPXh0KzI0KzE2LHNhPTMyLEh5PVN5bWJvbCgiREhLRVJlcSIpLE15PVN5bWJvbCgiREhLRVJlc3AiKTtmdW5jdGlvbiBlaShlKXtpZihlLmJ5dGVMZW5ndGghPT14dClyZXR1cm4gYygxMCk7cmV0dXJuIHAoZSl9ZnVuY3Rpb24gdGkoZSl7aWYoZS5ieXRlTGVuZ3RoPG5hKXJldHVybiBjKDEwKTtyZXR1cm4gcChlKX12YXIgbnI9bmV3IF9lO2FzeW5jIGZ1bmN0aW9uIG1uKGUsdCxyLG4pe2xldCBzO3RyeXtzPWF3YWl0IG5yLngyNTUxOVNoYXJlZChlLHQpfWNhdGNoe3JldHVybiBjKDI5KX10cnl7aWYocy5ieXRlTGVuZ3RoIT09eHR8fHMuZXZlcnkoKGEpPT5hPT09MCkpcmV0dXJuIGMoMTApO2xldCBpPXllKHMscmEpLG89eWUoaSx5ZShyLG4pKTt0cnl7bGV0IGE9YXdhaXQgbnIuYmxha2UzKG8pO3JldHVybiBwKGEuc2xpY2UoMCxzYSkpfWZpbmFsbHl7aS5maWxsKDApLG8uZmlsbCgwKX19ZmluYWxseXtzLmZpbGwoMCl9fWNsYXNzIHNyeyNlOyN0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy4jZT1lLHRoaXMuI3Q9dH1zdGF0aWMgYXN5bmMgY3JlYXRlKCl7bGV0IGU7dHJ5e2xldCB0PWF3YWl0IG5yLmdlblgyNTUxOSgpO2U9dC5wcml2O2xldFtyLG5dPWVpKHQucHViKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyPT09dm9pZCAwKXJldHVybiBjKDEwKTtsZXQgcz1uZXcgc3IoZSxyKTtyZXR1cm4gZT12b2lkIDAscChzKX1jYXRjaHtyZXR1cm4gYygyOSl9ZmluYWxseXtlPy5maWxsKDApfX13aXBlKCl7dGhpcy4jZS5maWxsKDApfWdldCBkaGtlUmVxKCl7bGV0W2UsdF09ZWkodGhpcy4jdC5zbGljZSgpKTtpZihlPT09dm9pZCAwKXRocm93IEVycm9yKGBkaGtlUmVxICR7dH1gKTtyZXR1cm4gZX1hc3luYyBmaW5pc2goZSl7bGV0IHQ9ZS5zdWJhcnJheSgwLHh0KSxyPWUuc3ViYXJyYXkoeHQpLFtuLHNdPWF3YWl0IG1uKHRoaXMuI2UsdCx0aGlzLiN0LHQpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO2xldCBpO3RyeXt0cnl7aT1hd2FpdCBuci5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHIsbil9Y2F0Y2h7cmV0dXJuIGMoMjApfWxldFtvLGFdPXJlLmZyb21QYWlyUGxhaW4oaSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gYygxMik7cmV0dXJuIHRoaXMud2lwZSgpLHAobyl9ZmluYWxseXtuLmZpbGwoMCksaT8uZmlsbCgwKX19fWZ1bmN0aW9uIFVlKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGUpO2lmKGU+MCljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO3JldHVybiB0fXZhciBOZT0zMixpcj0iRElQTE9NQVRJQyIsYmU9InB1YmxpYy1rZXkiLGlhPS03LG9hPS04LGFhPS0yNTcsb3I9W3t0eXBlOmJlLGFsZzppYX0se3R5cGU6YmUsYWxnOm9hfSx7dHlwZTpiZSxhbGc6YWF9XTtmdW5jdGlvbiBjYShlKXtyZXR1cm4gZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLiQvLCIiKXx8ImxvY2FsaG9zdCJ9ZnVuY3Rpb24gQ2UoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gdC5zZXQoZSksdC5idWZmZXJ9ZnVuY3Rpb24gYXIoZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXJldHVybiBuZXcgVWludDhBcnJheShlKS5zbGljZSgpO3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zbGljZSgpfWZ1bmN0aW9uIHFlKGUpe2lmKGU/LnJwSWQhPT12b2lkIDApcmV0dXJuIHAoZS5ycElkKTtpZih0eXBlb2YgbG9jYXRpb24+InUiKXJldHVybiBjKDkpO3JldHVybiBwKGNhKGxvY2F0aW9uLmhvc3RuYW1lKSl9dmFyIHJpPSIiO2Z1bmN0aW9uIFRlKGUpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil7cmk9ZS5tZXNzYWdlPT09IiI/ZS5uYW1lOmAke2UubmFtZX06ICR7ZS5tZXNzYWdlfWA7cmV0dXJufXJpPVN0cmluZyhlKX1mdW5jdGlvbiBjcihlKXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpcmV0dXJuITE7cmV0dXJuIGUubmFtZT09PSJOb3RBbGxvd2VkRXJyb3IiJiZlLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygiZG9lcyBub3QgaGF2ZSBmb2N1cyIpfWZ1bmN0aW9uIG5pKCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4hMDtyZXR1cm4gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlIT09ImhpZGRlbiJ9ZnVuY3Rpb24gY3QoKXtpZih0eXBlb2YgZ2xvYmFsVGhpcy5mb2N1cyE9PSJmdW5jdGlvbiIpcmV0dXJuO3RyeXtnbG9iYWxUaGlzLmZvY3VzKCl9Y2F0Y2h7fX1mdW5jdGlvbiBkcihlPTI1MDApe2lmKG5pKCkpcmV0dXJuIGN0KCksUHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIG5ldyBQcm9taXNlKCh0KT0+e2xldCByPSgpPT57Y2xlYXJUaW1lb3V0KHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pLGN0KCksdCgpfSxuPSgpPT57aWYobmkoKSlyKCl9LHM9c2V0VGltZW91dChyLGUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pLG4oKX0pfWFzeW5jIGZ1bmN0aW9uIHVyKGUpe2F3YWl0IGRyKCk7dHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKGUpfWNhdGNoKHQpe2lmKCFjcih0KSl0aHJvdyB0O3JldHVybiBjdCgpLGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoZSl9fWFzeW5jIGZ1bmN0aW9uIGxyKGUpe2F3YWl0IGRyKCk7dHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KGUpfWNhdGNoKHQpe2lmKCFjcih0KSl0aHJvdyB0O3JldHVybiBjdCgpLGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoZSl9fWZ1bmN0aW9uIEZlKCl7aWYodHlwZW9mIG5hdmlnYXRvcj4idSJ8fCFuYXZpZ2F0b3IuY3JlZGVudGlhbHN8fHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsPiJ1IilyZXR1cm4gMjQ7cmV0dXJuIDB9ZnVuY3Rpb24gV2UoZSl7aWYoZT09PW51bGx8fGUudHlwZSE9PWJlfHwhKCJyYXdJZCJpbiBlKXx8dHlwZW9mIGUuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cyE9PSJmdW5jdGlvbiIpcmV0dXJuIGMoMjcpO3JldHVybiBwKGUpfWZ1bmN0aW9uIFNuKGUpe2lmKGU9PT0icGxhdGZvcm0ifHxlPT09ImNyb3NzLXBsYXRmb3JtIilyZXR1cm4gZTtyZXR1cm59ZnVuY3Rpb24gaWkoZSl7aWYoL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KGUpKXJldHVybiJpb3MiO2lmKC9BbmRyb2lkL2kudGVzdChlKSlyZXR1cm4iYW5kcm9pZCI7aWYoL01hYyBPUyBYfE1hY2ludG9zaC9pLnRlc3QoZSkpcmV0dXJuIm1hY29zIjtpZigvV2luZG93cy9pLnRlc3QoZSkpcmV0dXJuIndpbmRvd3MiO2lmKC9MaW51eC9pLnRlc3QoZSkpcmV0dXJuImxpbnV4IjtyZXR1cm4ib3RoZXIifWZ1bmN0aW9uIGJuKGUpe2xldCB0PWUucmVzcG9uc2U7aWYoISgiZ2V0VHJhbnNwb3J0cyJpbiB0KSlyZXR1cm47bGV0IHI9dC5nZXRUcmFuc3BvcnRzO2lmKHR5cGVvZiByIT09ImZ1bmN0aW9uIilyZXR1cm47bGV0IG49ci5jYWxsKHQpO2lmKCFBcnJheS5pc0FycmF5KG4pKXJldHVybjtsZXQgcz1bXTtmb3IobGV0IGkgb2YgbilpZih0eXBlb2YgaT09PSJzdHJpbmciJiZpLmxlbmd0aD4wKXMucHVzaChpKTtyZXR1cm4gcy5sZW5ndGg9PT0wP3ZvaWQgMDpzfXZhciBkYT0zMix1YT02NCxnbj0zNyxzaT0xNjtmdW5jdGlvbiBvaShlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldEF1dGhlbnRpY2F0b3JEYXRhImluIHQpKXJldHVybjtsZXQgcj10LmdldEF1dGhlbnRpY2F0b3JEYXRhO2lmKHR5cGVvZiByIT09ImZ1bmN0aW9uIilyZXR1cm47bGV0IG49ci5jYWxsKHQpO2lmKCEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm47bGV0IHM9bmV3IFVpbnQ4QXJyYXkobik7aWYocy5ieXRlTGVuZ3RoPGduK3NpKXJldHVybjtsZXQgaT1zW2RhXTtpZihpPT09dm9pZCAwfHwoaSZ1YSk9PT0wKXJldHVybjtyZXR1cm4gcy5zbGljZShnbixnbitzaSl9YXN5bmMgZnVuY3Rpb24gYWkoZSl7bGV0IHQ9RmUoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT1xZShlKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyPT09dm9pZCAwKXJldHVybiBjKDkpO2xldCBzPWU/LnVzZXJOYW1lPz9lPy5ycE5hbWU/P3IsaT17cmVzaWRlbnRLZXk6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6ITAsdXNlclZlcmlmaWNhdGlvbjoicmVxdWlyZWQifTtpZihlPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCE9PXZvaWQgMClpLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PWUuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ7bGV0IG89e2xhcmdlQmxvYjp7c3VwcG9ydDoicmVxdWlyZWQifX0sYTt0cnl7YT1hd2FpdCB1cih7cHVibGljS2V5OntjaGFsbGVuZ2U6VWUoTmUpLHJwOntpZDpyLG5hbWU6ZT8ucnBOYW1lPz9pcn0sdXNlcjp7aWQ6VWUoMTYpLG5hbWU6cyxkaXNwbGF5TmFtZTpzfSxwdWJLZXlDcmVkUGFyYW1zOm9yLGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246aSxleHRlbnNpb25zOm8sLi4uZT8uaGludHMhPT12b2lkIDA/e2hpbnRzOmUuaGludHN9Ont9fX0pfWNhdGNoKGYpe3JldHVybiBUZShmKSxjKDMwKX1sZXRbZCx1XT1XZShhKTtpZih1IT09MClyZXR1cm4gYyh1KTtpZihkPT09dm9pZCAwKXJldHVybiBjKDI3KTtpZihkLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I/LnN1cHBvcnRlZCE9PSEwKXJldHVybiBjKDMwKTtyZXR1cm4gcChuZXcgVWludDhBcnJheShkLnJhd0lkKSl9YXN5bmMgZnVuY3Rpb24gd24oZSx0LHIsbil7bGV0IHM9e2NoYWxsZW5nZTpVZShOZSkscnBJZDplLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCJ9O2lmKHQ/LmhpbnRzIT09dm9pZCAwKXMuaGludHM9dC5oaW50cztpZihyIT09dm9pZCAwKXMuYWxsb3dDcmVkZW50aWFscz1be3R5cGU6YmUsaWQ6Q2Uocil9XTtpZihuIT09dm9pZCAwKXMuZXh0ZW5zaW9ucz1uO2xldCBpO3RyeXtpPWF3YWl0IGxyKHtwdWJsaWNLZXk6c30pfWNhdGNoKGQpe3JldHVybiBUZShkKSxjKDMwKX1sZXRbbyxhXT1XZShpKTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDI3KTtyZXR1cm4gcChvKX1hc3luYyBmdW5jdGlvbiBjaShlLHQpe2xldCByPUZlKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109cWUodCk7aWYocyE9PTApcmV0dXJuIGMocyk7aWYobj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgaT1lO2lmKGk9PT12b2lkIDApe2xldFtmLGhdPWF3YWl0IHduKG4sdCk7aWYoaCE9PTAmJnQ/LmhpbnRzIT09dm9pZCAwKVtmLGhdPWF3YWl0IHduKG4se3JwSWQ6dC5ycElkLHJwTmFtZTp0LnJwTmFtZX0pO2lmKGghPT0wKXJldHVybiBjKGgpO2lmKGY9PT12b2lkIDApcmV0dXJuIGMoMjcpO2k9bmV3IFVpbnQ4QXJyYXkoZi5yYXdJZCl9bGV0W28sYV09YXdhaXQgd24obix0LGkse2xhcmdlQmxvYjp7cmVhZDohMH19KTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDI3KTtsZXQgdT1vLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I7aWYodT09PXZvaWQgMHx8dS5ibG9iPT09dm9pZCAwKXJldHVybiBjKDcpO2xldCBsPWFyKHUuYmxvYik7aWYobC5ieXRlTGVuZ3RoPT09MClyZXR1cm4gYyg3KTtyZXR1cm4gcCh7YmxvYjpsLGNyZWRJZDpuZXcgVWludDhBcnJheShvLnJhd0lkKX0pfXZhciBJbj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMucHJmLnYxIiksRXQ9ImRpcGxvbWF0aWMtcHJmIjt2YXIgZnI9IiI7dmFyIGhyPXR5cGVvZiBnbG9iYWxUaGlzLldvcmtlcj09PSJmdW5jdGlvbiI/Z2xvYmFsVGhpcy5Xb3JrZXI6dm9pZCAwLHhuPWhyPT09dm9pZCAwP3ZvaWQgMDpoci5wcm90b3R5cGUucG9zdE1lc3NhZ2UscHI7ZnVuY3Rpb24gZmEoKXtpZih0eXBlb2YgZnIhPT0ic3RyaW5nInx8ZnIubGVuZ3RoPT09MCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIHdvcmtlciBzb3VyY2Ugbm90IGVtYmVkZGVkOyBydW4gcGtnIGJ1aWxkIGJlZm9yZSBzcGF3biIpO3JldHVybiBhdG9iKGZyKX1mdW5jdGlvbiBwYSgpe2lmKHByIT09dm9pZCAwKXJldHVybiBwcjtsZXQgZT1uZXcgQmxvYihbZmEoKV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTtyZXR1cm4gcHI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxwcn1mdW5jdGlvbiBkaSgpe2lmKGhyPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHNwYXduIHN5bmMgd29ya2VyIik7cmV0dXJuIG5ldyBocihwYSgpLHt0eXBlOiJtb2R1bGUifSl9ZnVuY3Rpb24gdWkoZSx0LHIpe2lmKHhuPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHBvc3QgdG8gc3luYyB3b3JrZXIiKTtpZihyIT09dm9pZCAwJiZyLmxlbmd0aD4wKXhuLmNhbGwoZSx0LHt0cmFuc2ZlcjpyfSk7ZWxzZSB4bi5jYWxsKGUsdCl9dmFyIGhhPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5iaW5kLnYxIiksRW49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLmJpbmR0YWcudjEiKSx5YT0zMixtYT0zMixnYT0xNixTYT0zMixuZT1uZXcgX2U7ZnVuY3Rpb24gYmEoZSl7cmV0dXJuIGUubWFwKCh0KT0+KHtoYW5kbGU6dC5oYW5kbGUsbGFiZWw6dC5sYWJlbCxpZHg6dC5pZHg/PzB9KSl9ZnVuY3Rpb24gbGkoZSl7aWYoZS5ieXRlTGVuZ3RoPT09MHx8ZS5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gYygyMik7aWYoZS5ieXRlTGVuZ3RoPG1lKzEpcmV0dXJuIGMoMTQpO2xldCB0PWUuc3ViYXJyYXkoMCxtZSk7aWYodC5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gYygyMik7bGV0IHI9bmV3IEwoZS5zdWJhcnJheShtZSkpLFtuLHNdPXIucmVhZFN0cnVjdCh5bik7aWYocyE9PTApcmV0dXJuIGMocyk7aWYobj09PXZvaWQgMClyZXR1cm4gYygxNCk7aWYoIXIuZG9uZSgpKXJldHVybiBjKDE0KTtsZXRbaSxvXT1yZS5mcm9tQnl0ZXModCk7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYygxMik7cmV0dXJuIHAoe2VuY2xhdmU6aSxob3N0czpuLmhvc3RzLm1hcCgoYSk9Pih7Li4uYX0pKX0pfWFzeW5jIGZ1bmN0aW9uIGZpKGUsdCxyKXtsZXQgbj1GZSgpO2lmKG4hPT0wKXJldHVybiBuO2xldFtzLGldPXFlKHIpO2lmKGkhPT0wKXJldHVybiBpO2lmKHM9PT12b2lkIDApcmV0dXJuIDk7YXdhaXQgZHIoKTtsZXQgbz1uZXcgVWludDhBcnJheSh0LmJ5dGVMZW5ndGgpO28uc2V0KHQpO2xldCBhPXtsYXJnZUJsb2I6e3dyaXRlOm8uYnVmZmVyfX0sZD17cHVibGljS2V5OntjaGFsbGVuZ2U6VWUoTmUpLHJwSWQ6cyxhbGxvd0NyZWRlbnRpYWxzOlt7dHlwZTpiZSxpZDpDZShlKX1dLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOmEsLi4ucj8uaGludHMhPT12b2lkIDA/e2hpbnRzOnIuaGludHN9Ont9fX0sdTt0cnl7dHJ5e3U9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChkKX1jYXRjaCh5KXtpZighY3IoeSkpdGhyb3cgeTtjdCgpLHU9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChkKX19Y2F0Y2goeSl7cmV0dXJuIFRlKHkpLDMwfWZpbmFsbHl7by5maWxsKDApfWxldFtsLGZdPVdlKHUpO2lmKGYhPT0wKXJldHVybiBmO2lmKGw9PT12b2lkIDApcmV0dXJuIDI3O2lmKGwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8ud3JpdHRlbiE9PSEwKXJldHVybiAzMDtyZXR1cm4gMH12YXIgQW49MzI7ZnVuY3Rpb24gd2EoZSl7aWYoZT09PXZvaWQgMClyZXR1cm5bXTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm5bZV07cmV0dXJuIGUuZmlsdGVyKCh0KT0+dC5ieXRlTGVuZ3RoPjApfWZ1bmN0aW9uIElhKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEVycm9yKSlyZXR1cm4hMTtyZXR1cm4gZS5uYW1lPT09Ik5vdFN1cHBvcnRlZEVycm9yInx8ZS5uYW1lPT09IlR5cGVFcnJvciJ9ZnVuY3Rpb24geWkoZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9YXIoZSk7aWYodC5ieXRlTGVuZ3RoPEFuKXt0LmZpbGwoMCk7cmV0dXJufWlmKHQuYnl0ZUxlbmd0aD09PUFuKXJldHVybiB0O2xldCByPXQuc2xpY2UoMCxBbik7cmV0dXJuIHQuZmlsbCgwKSxyfWFzeW5jIGZ1bmN0aW9uIHhhKGUpe2xldCB0PUZlKCk7aWYodCE9PTApcmV0dXJuIGModCk7bGV0W3Isbl09cWUoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgcz1lPy51c2VyTmFtZT8/RXQsaT1lPy5kaXNwbGF5TmFtZT8/cyxvPVVlKDE2KSxhPWU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PT09ImNyb3NzLXBsYXRmb3JtIixkPXtyZXNpZGVudEtleTphPyJkaXNjb3VyYWdlZCI6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6IWEsdXNlclZlcmlmaWNhdGlvbjphPyJwcmVmZXJyZWQiOiJyZXF1aXJlZCJ9O2lmKGU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50IT09dm9pZCAwKWQuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9ZS5hdXRoZW50aWNhdG9yQXR0YWNobWVudDtsZXQgdT17Y2hhbGxlbmdlOlVlKE5lKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/aXJ9LHVzZXI6e2lkOm8sbmFtZTpzLGRpc3BsYXlOYW1lOml9LHB1YktleUNyZWRQYXJhbXM6b3IsYXV0aGVudGljYXRvclNlbGVjdGlvbjpkLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fSwuLi5lPy5leGNsdWRlQ3JlZGVudGlhbHMhPT12b2lkIDAmJmUuZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aD4wP3tleGNsdWRlQ3JlZGVudGlhbHM6ZS5leGNsdWRlQ3JlZGVudGlhbHMubWFwKChiKT0+KHt0eXBlOmJlLGlkOkNlKGIpfSkpfTp7fX0sbD1lPy5zYWx0IT09dm9pZCAwP0NlKGUuc2FsdCk6dm9pZCAwLGY9KGIpPT51cih7cHVibGljS2V5OnsuLi51LGV4dGVuc2lvbnM6YiYmbCE9PXZvaWQgMD97cHJmOntldmFsOntmaXJzdDpsfX19OntwcmY6e319fX0pLGg7dHJ5e2g9YXdhaXQgZihsIT09dm9pZCAwKX1jYXRjaChiKXtpZihsPT09dm9pZCAwfHwhSWEoYikpcmV0dXJuIFRlKGIpLGMoMzApO3RyeXtoPWF3YWl0IGYoITEpfWNhdGNoKEUpe3JldHVybiBUZShFKSxjKDMwKX19bGV0W3ksZ109V2UoaCk7aWYoZyE9PTApcmV0dXJuIGMoZyk7aWYoeT09PXZvaWQgMClyZXR1cm4gYygyNyk7bGV0IG09eS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksUz15aShtLnByZj8ucmVzdWx0cz8uZmlyc3QpLHg9bS5wcmY/LmVuYWJsZWQ9PT0hMHx8UyE9PXZvaWQgMDtpZihhJiZTIT09dm9pZCAwKVMuZmlsbCgwKTtyZXR1cm4gcCh7Y3JlZElkOm5ldyBVaW50OEFycmF5KHkucmF3SWQpLHVzZXJJZDpuZXcgVWludDhBcnJheShvKSxwcmZFbmFibGVkOngscHJmOmE/dm9pZCAwOlMsYXR0YWNobWVudDpTbih5LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOmJuKHkpLGFhZ3VpZDpvaSh5KX0pfWFzeW5jIGZ1bmN0aW9uIHBpKGUpe2xldCB0PUZlKCk7aWYodCE9PTApcmV0dXJuIGModCk7bGV0W3Isbl09cWUoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgcz1lPy5zYWx0Pz9JbixpPUNlKHMpLG89e2NoYWxsZW5nZTpVZShOZSkscnBJZDpyLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCIsZXh0ZW5zaW9uczp7cHJmOntldmFsOntmaXJzdDppfX19fTtpZihlPy5oaW50cyE9PXZvaWQgMClvLmhpbnRzPWUuaGludHM7bGV0IGE9d2EoZT8uY3JlZElkKTtpZihhLmxlbmd0aD4wKW8uYWxsb3dDcmVkZW50aWFscz1hLm1hcCgoeSk9Pih7dHlwZTpiZSxpZDpDZSh5KX0pKTtsZXQgZDt0cnl7ZD1hd2FpdCBscih7cHVibGljS2V5Om99KX1jYXRjaCh5KXtyZXR1cm4gVGUoeSksYygzMCl9bGV0W3UsbF09V2UoZCk7aWYobCE9PTApcmV0dXJuIGMobCk7aWYodT09PXZvaWQgMClyZXR1cm4gYygyNyk7bGV0IGY9dS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkucHJmPy5yZXN1bHRzO2lmKGY/LmZpcnN0PT09dm9pZCAwKXJldHVybiBjKDcpO2xldCBoPXlpKGYuZmlyc3QpO2lmKGg9PT12b2lkIDApcmV0dXJuIGMoMjcpO3JldHVybiBwKHtwcmY6aCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkodS5yYXdJZCksYXR0YWNobWVudDpTbih1LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOmJuKHUpfSl9ZnVuY3Rpb24gUG4oZSl7aWYoZS5ieXRlTGVuZ3RoIT09bWUpcmV0dXJuIGMoMTApO3JldHVybltlLDBdfWNsYXNzIHJleyNlO2NvbnN0cnVjdG9yKGUpe3RoaXMuI2U9ZX1zdGF0aWMgYXN5bmMgZnJvbVJhbmRvbShlKXtpZihlLmJ5dGVMZW5ndGg8U2EpcmV0dXJuIGMoMTApO2xldCB0PWF3YWl0IG5lLmdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKSxyPXllKHQsZSk7dHJ5e2xldCBuPWF3YWl0IG5lLmJsYWtlMyhyKSxbcyxpXT1QbihuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZihzPT09dm9pZCAwKXJldHVybiBjKDEyKTtyZXR1cm4gcChuZXcgcmUocykpfWZpbmFsbHl7dC5maWxsKDApLHIuZmlsbCgwKSxlLmZpbGwoMCl9fXN0YXRpYyBmcm9tQnl0ZXMoZSl7bGV0W3Qscl09UG4oZSk7aWYociE9PTApcmV0dXJuIGMocik7aWYodD09PXZvaWQgMClyZXR1cm4gYygxMCk7bGV0W24sc109UG4odC5zbGljZSgpKTtpZihzIT09MClyZXR1cm4gYyhzKTtpZihuPT09dm9pZCAwKXJldHVybiBjKDEwKTtyZXR1cm4gcChuZXcgcmUobikpfWFzeW5jIHNlYWxXaXRoUGFzc2tleShlKXtsZXQgdD1lPy5zYWx0Pz9JbixyPWU/LmNyZWRJZCxuPXIscz1lPy5jcmVhdGVDcmVkSWZOZWVkZWQ9PT0hMCYmKHI9PT12b2lkIDB8fCEociBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpJiZyLmxlbmd0aD09PTApLGksbztpZihzKXtsZXRbbCxmXT1hd2FpdCB4YSh7cnBJZDplPy5ycElkLHJwTmFtZTplPy5ycE5hbWUsdXNlck5hbWU6ZT8udXNlck5hbWU/P0V0LGRpc3BsYXlOYW1lOmU/LmRpc3BsYXlOYW1lLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OmU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50LGhpbnRzOmU/LmhpbnRzLGV4Y2x1ZGVDcmVkZW50aWFsczplPy5leGNsdWRlQ3JlZGVudGlhbHMsc2FsdDp0fSk7aWYoZiE9PTApcmV0dXJuIGMoZik7aWYobD09PXZvaWQgMClyZXR1cm4gYygzMCk7aWYoIWwucHJmRW5hYmxlZClyZXR1cm4gYygzMCk7bj1sLmNyZWRJZCxpPWwsbz1sLnByZn1sZXQgYT1hc3luYyhsLGYsaCx5KT0+e3RyeXtsZXRbZyxtXT1hd2FpdCB0aGlzLiNzKGwpO2lmKG0hPT0wKXJldHVybiBjKG0pO2lmKGc9PT12b2lkIDApcmV0dXJuIGMoMTIpO3JldHVybiBwKHtzZWFsZWRNYXN0ZXI6ZyxzYWx0OnQuc2xpY2UoKSxjcmVkSWQ6Zi5zbGljZSgpLHVzZXJJZDppPy51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmkudXNlcklkLnNsaWNlKCksYXR0YWNobWVudDpoPz9pPy5hdHRhY2htZW50LHRyYW5zcG9ydHM6eT8/aT8udHJhbnNwb3J0cyxhYWd1aWQ6aT8uYWFndWlkPT09dm9pZCAwP3ZvaWQgMDppLmFhZ3VpZC5zbGljZSgpfSl9ZmluYWxseXtsLmZpbGwoMCl9fTtpZihvIT09dm9pZCAwJiZpIT09dm9pZCAwKXJldHVybiBhKG8saS5jcmVkSWQsaS5hdHRhY2htZW50LGkudHJhbnNwb3J0cyk7bGV0W2QsdV09YXdhaXQgcGkoe3JwSWQ6ZT8ucnBJZCxycE5hbWU6ZT8ucnBOYW1lLGNyZWRJZDpuLHNhbHQ6dCxoaW50czplPy5oaW50c30pO2lmKHUhPT0wKXJldHVybiBjKHUpO2lmKGQ9PT12b2lkIDApcmV0dXJuIGMoNyk7cmV0dXJuIGEoZC5wcmYsZC5jcmVkSWQsZC5hdHRhY2htZW50LGQudHJhbnNwb3J0cyl9YXN5bmMgYmluZChlLHQpe2lmKHQhPT12b2lkIDApe2ZvcihsZXQgaSBvZiB0KWlmKCFhd2FpdCB0aGlzLiNuKGkuY3JlZElkLGkudGFnKSlyZXR1cm4gYygxMCl9bGV0W3Isbl09YXdhaXQgdGhpcy5zZWFsV2l0aFBhc3NrZXkoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYygxMik7bGV0IHM9YXdhaXQgdGhpcy4jdChyLmNyZWRJZCk7cmV0dXJuIHAoey4uLnIsdGFnOnN9KX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aFBhc3NrZXkoZSx0KXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGMoMjIpO2xldCByPVtdO2ZvcihsZXQgYSBvZiBlKWlmKGEuY3JlZElkLmJ5dGVMZW5ndGg+MClyLnB1c2goYS5jcmVkSWQpO2xldFtuLHNdPWF3YWl0IHBpKHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWUsaGludHM6dC5oaW50cyxjcmVkSWQ6ci5sZW5ndGg+MD9yOnZvaWQgMCxzYWx0OnQuc2FsdH0pO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoNyk7bGV0IGk9ZS5maW5kKChhKT0+WChhLmNyZWRJZCxuLmNyZWRJZCkpLG89aT09PXZvaWQgMD9lOltpLC4uLmUuZmlsdGVyKChhKT0+YSE9PWkpXTt0cnl7Zm9yKGxldCBhIG9mIG8pe2xldFtkXT1hd2FpdCByZS4jcihhLnNlYWxlZE1hc3RlcixuLnByZik7aWYoZCE9PXZvaWQgMClyZXR1cm4gcCh7ZW5jbGF2ZTpkLGNyZWRJZDpuLmNyZWRJZC5zbGljZSgpfSl9cmV0dXJuIGMoMjApfWZpbmFsbHl7bi5wcmYuZmlsbCgwKX19YXN5bmMgc2VhbFdpdGhJa20oZSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLiNzKGUpfWZpbmFsbHl7ZS5maWxsKDApfX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aElrbShlLHQpe3RyeXtyZXR1cm4gYXdhaXQgcmUuI3IoZSx0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGU9W10sdCl7bGV0IHI9dD8uY3JlZElkO2lmKHI9PT12b2lkIDApe2xldFtpLG9dPWF3YWl0IGFpKHQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGMoMzApO3I9aX1sZXRbbixzXT10aGlzLiNpKGUpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXQgaT1hd2FpdCBmaShyLG4sdCk7aWYoaSE9PTApcmV0dXJuIGMoaSk7cmV0dXJuIHAocil9ZmluYWxseXtuLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBmcm9tTGFyZ2VCbG9iKGUpe2xldFt0LHJdPWF3YWl0IGNpKGU/LmNyZWRJZCxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwKXJldHVybiBjKDcpO3RyeXtsZXRbbixzXT1saSh0LmJsb2IpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3JldHVybiBwKHsuLi5uLGNyZWRJZDp0LmNyZWRJZH0pfWZpbmFsbHl7dC5ibG9iLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBjbGVhckxhcmdlQmxvYihlLHQpe3JldHVybiBmaShlLG5ldyBVaW50OEFycmF5KG1lKSx0KX1zdGF0aWMgZnJvbVBhaXJQbGFpbihlKXtyZXR1cm4gbGkoZSl9c3RhdGljIHBhaXJSZXF1ZXN0KCl7cmV0dXJuIHNyLmNyZWF0ZSgpfWFzeW5jIHBhaXJBY2NlcHQoZSx0KXtsZXQgcjt0cnl7cj1hd2FpdCBuZS5nZW5YMjU1MTkoKX1jYXRjaHtyZXR1cm4gYygyOSl9dHJ5e2xldFtuLHNdPWF3YWl0IG1uKHIucHJpdixlLGUsci5wdWIpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXRbaSxvXT10aGlzLiNpKHQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXQgYT1hd2FpdCBuZS5lbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGksbik7cmV0dXJuIHRpKHllKHIucHViLGEpKX1jYXRjaHtyZXR1cm4gYygxMil9ZmluYWxseXtpLmZpbGwoMCl9fWZpbmFsbHl7bi5maWxsKDApfX1maW5hbGx5e3IucHJpdi5maWxsKDApfX1zcGF3blN5bmNXb3JrZXIoZSl7bGV0IHQ9ZGkoKSxyPXRoaXMuI2Uuc2xpY2UoKTtyZXR1cm4gdWkodCx7aWQ6ZS5pZCxvcDoic2V0U2VlZCIsc2VlZDpyLHBlcnNpc3Q6ZS5wZXJzaXN0fSxbci5idWZmZXJdKSx0fWRlcml2ZUNpcGhlcihlLHQpe2xldCByPWUuc2xpY2UoKSxuPShvKT0+dGhpcy4jYyhyLG8pLHM9KG8pPT50aGlzLiNkKHIsbyk7cmV0dXJue2VuY3J5cHQ6T2JqZWN0LmZyZWV6ZSh7ZW5jcnlwdDpufSksZGVjcnlwdDpPYmplY3QuZnJlZXplKHtkZWNyeXB0OnN9KSxib3RoOk9iamVjdC5mcmVlemUoe2VuY3J5cHQ6bixkZWNyeXB0OnN9KX1bdF19YXN5bmMgZGVyaXZlSWRlbnRpdHkoZSx0PTApe2xldCByPWUsbj10LHM9YXdhaXQgdGhpcy4jYShyLG4pLGk9cy5wdWJsaWNLZXk7cmV0dXJuIHMucHJpdmF0ZUtleS5maWxsKDApLE9iamVjdC5mcmVlemUoe3B1YmxpY0tleTppLHNpZ246KG8pPT50aGlzLiNsKHIsbixvKSxrZG1Gb3I6KG8pPT50aGlzLiNmKHIsbixvKX0pfWFzeW5jI3QoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy4jZS5ieXRlTGVuZ3RoK0VuLmJ5dGVMZW5ndGgrZS5ieXRlTGVuZ3RoKTt0LnNldCh0aGlzLiNlLDApLHQuc2V0KEVuLHRoaXMuI2UuYnl0ZUxlbmd0aCksdC5zZXQoZSx0aGlzLiNlLmJ5dGVMZW5ndGgrRW4uYnl0ZUxlbmd0aCk7dHJ5e3JldHVybiBhd2FpdCBuZS5ibGFrZTModCl9ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jI24oZSx0KXtpZih0LmJ5dGVMZW5ndGghPT15YSlyZXR1cm4hMTtsZXQgcj1hd2FpdCB0aGlzLiN0KGUpO3RyeXtpZihyLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7bGV0IG49MDtmb3IobGV0IHM9MDtzPHIuYnl0ZUxlbmd0aDtzKyspe2xldCBpPXJbc10sbz10W3NdO2lmKGk9PT12b2lkIDB8fG89PT12b2lkIDApcmV0dXJuITE7bnw9aV5vfXJldHVybiBuPT09MH1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjcyhlKXtsZXRbdCxyXT1hd2FpdCBoaShuZSxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwKXJldHVybiBjKDEyKTt0cnl7bGV0IG49YXdhaXQgbmUuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZCh0aGlzLiNlLHQpO3JldHVybiBMZShuKX1jYXRjaHtyZXR1cm4gYygxMil9ZmluYWxseXt0LmZpbGwoMCl9fXN0YXRpYyBhc3luYyNyKGUsdCl7bGV0WyxyXT1MZShlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1hd2FpdCBoaShuZSx0KTtpZihzIT09MClyZXR1cm4gYyhzKTtpZihuPT09dm9pZCAwKXJldHVybiBjKDEyKTtsZXQgaTt0cnl7dHJ5e2k9YXdhaXQgbmUuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChlLG4pfWNhdGNoe3JldHVybiBjKDIwKX1yZXR1cm4gcmUuZnJvbUJ5dGVzKGkpfWZpbmFsbHl7bi5maWxsKDApLGk/LmZpbGwoMCl9fSNpKGUpe2xldCB0PW5ldyBLLHI9dC53cml0ZVN0cnVjdCh5bix7aG9zdHM6YmEoZSl9KTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXQgbj10LnJlc3VsdCgpLHM9bmV3IFVpbnQ4QXJyYXkobWUrbi5ieXRlTGVuZ3RoKTtyZXR1cm4gcy5zZXQodGhpcy4jZSwwKSxzLnNldChuLG1lKSxbcywwXX1hc3luYyNjKGUsdCl7bGV0IHI9YXdhaXQgdGhpcy4jbyhlKTt0cnl7cmV0dXJuIGF3YWl0IG5lLmVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQodCxyKX1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjZChlLHQpe2xldCByPWF3YWl0IHRoaXMuI28oZSk7dHJ5e3JldHVybiBhd2FpdCBuZS5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHQscil9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI28oZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy4jZS5ieXRlTGVuZ3RoK2UuYnl0ZUxlbmd0aCk7dC5zZXQodGhpcy4jZSwwKSx0LnNldChlLHRoaXMuI2UuYnl0ZUxlbmd0aCk7dHJ5e3JldHVybiBhd2FpdCBuZS5ibGFrZTModCl9ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jI3UoZSx0KXtsZXQgcj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSksbj1uZXcgVWludDhBcnJheSg4KTtyZXR1cm4gbmV3IERhdGFWaWV3KG4uYnVmZmVyKS5zZXRCaWdVaW50NjQoMCxCaWdJbnQodCksITEpLGF3YWl0IHRoaXMuI28oeWUocixuKSl9YXN5bmMjYShlLHQpe2xldCByPWF3YWl0IHRoaXMuI3UoZSx0KTt0cnl7cmV0dXJuIGF3YWl0IG5lLmRlcml2ZUVkMjU1MTlLZXlQYWlyKHIpfWZpbmFsbHl7ci5maWxsKDApfX1hc3luYyNsKGUsdCxyKXtsZXQgbj1hd2FpdCB0aGlzLiNhKGUsdCk7dHJ5e3JldHVybiBhd2FpdCBuZS5zaWduRWQyNTUxOShyLG4ucHJpdmF0ZUtleSl9ZmluYWxseXtuLnByaXZhdGVLZXkuZmlsbCgwKX19YXN5bmMjZihlLHQscil7bGV0IG49YXdhaXQgdGhpcy4jYShlLHQpLHM9eWUobi5wcml2YXRlS2V5LHIpO24ucHJpdmF0ZUtleS5maWxsKDApO3RyeXtyZXR1cm4oYXdhaXQgbmUuYmxha2UzKHMpKS5zbGljZSgwLHZlKX1maW5hbGx5e3MuZmlsbCgwKX19fWFzeW5jIGZ1bmN0aW9uIGhpKGUsdCxyPWhhKXtpZih0LmJ5dGVMZW5ndGg8Z2EpcmV0dXJuIGMoMTApO2xldCBuPWF3YWl0IGUuYmxha2UzKHllKHQscikpO3JldHVybiBwKG4uc2xpY2UoMCxtYSkpfXZhciBFYT1uZXcgU2V0KFsiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJsZW5ndGgiLCJuYW1lIl0pO2Z1bmN0aW9uIG1pKGUpe2ZvcihsZXQgdCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSl7aWYoRWEuaGFzKHQpKWNvbnRpbnVlO2xldCByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZihyPT09dm9pZCAwfHx0eXBlb2Ygci52YWx1ZSE9PSJmdW5jdGlvbiIpY29udGludWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6ci52YWx1ZSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITF9KX19bWkocmUpO21pKHJlLnByb3RvdHlwZSk7Y2xhc3MgVW57ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGVucShlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHVlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9YCR7by5ob3N0fToke28uc2VxfWA7bi5wdXQobyxhKX19KX1hc3luYyBkZXEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKHVlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9YCR7ZX06JHthfWA7cy5kZWxldGUoZCl9fSl9YXN5bmMgbGlzdCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24odWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PnIocy5yZXN1bHQpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbih1ZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh1ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbih1ZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKHVlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fWZ1bmN0aW9uIGdpKGUpe3JldHVybntsYWJlbDplLmxhYmVsLGhhbmRsZTpuZXcgVVJMKGUuaGFuZGxlKSxpZHg6ZS5pZHgsbGFzdFNlcTplLmxhc3RTZXF8fDAsY2xvY2tPZmZzZXQ6ZS5jbG9ja09mZnNldCxzdWJzY3JpcHRpb246ZS5zdWJzY3JpcHRpb259fWZ1bmN0aW9uIEFhKGUsdCl7bGV0IHI9ey4uLmV9O2lmKHQuc2V0TGFzdFNlcSE9PXZvaWQgMClyLmxhc3RTZXE9dC5zZXRMYXN0U2VxO2Vsc2UgaWYodC5sYXN0U2VxIT09dm9pZCAwKXtsZXQgbj1yLmxhc3RTZXF8fDA7aWYodC5sYXN0U2VxPm4pci5sYXN0U2VxPXQubGFzdFNlcX1yZXR1cm4gZGVsZXRlIHIubnVtQmFncyxkZWxldGUgci5udW1EdXBlcyxyfWNsYXNzIEJue2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBhZGQoZSl7bGV0IHQ9YXdhaXQgdGhpcy5nZXQoZS5sYWJlbCkscj10IT09dm9pZCAwJiZ0LmhhbmRsZS5ocmVmPT09ZS5oYW5kbGUuaHJlZiYmKHQuaWR4Pz8wKT09PShlLmlkeD8/MCk7cmV0dXJuIHRoaXMucHV0KHsuLi5lLGxhc3RTZXE6cj90Lmxhc3RTZXE6MCxjbG9ja09mZnNldDpyP3QuY2xvY2tPZmZzZXQ6dm9pZCAwLHN1YnNjcmlwdGlvbjpyP3Quc3Vic2NyaXB0aW9uOnZvaWQgMH0pfWFzeW5jIHB1dChlKXtsZXQgdD17Li4uZSxoYW5kbGU6ZS5oYW5kbGUudG9TdHJpbmcoKSxsYXN0U2VxOmUubGFzdFNlcT8/MH0scj10aGlzLmRiLnRyYW5zYWN0aW9uKHNlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoc2UpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKSxuLnB1dCh0KX0pfWFzeW5jIHRvdWNoKGUsdCl7cmV0dXJuIHRoaXMucmVjb3JkU3RhdHMoZSx7bGFzdFNlcTp0fSl9YXN5bmMgcmVjb3JkU3RhdHMoZSx0KXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHNlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoc2UpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtsZXQgbz1uLmdldChlKTtvLm9uc3VjY2Vzcz0oKT0+e2xldCBhPW8ucmVzdWx0O2lmKCFhKXJldHVybjtuLnB1dChBYShhLHQpKX19KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ci5nZXQoZSk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgbz1pLnJlc3VsdDtpZighbyluKHZvaWQgMCk7ZWxzZSBuKGdpKG8pKX0saS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgc2V0KGUsdCl7bGV0IHI9YXdhaXQgdGhpcy5nZXQoZSk7aWYoIXIpcmV0dXJuIDEzO3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5wdXQoey4uLnIsLi4udH0pLDB9Y2F0Y2h7cmV0dXJuIDE4fX1hc3luYyBkZWwoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKHNlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5kZWxldGUoZSl9KX1hc3luYyBsaXN0KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXRBbGwoKTtzLm9uc3VjY2Vzcz0oKT0+e2xldCBpPXMucmVzdWx0O3IoaS5tYXAoZ2kpKX0scy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oc2UsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1jbGFzcyBrbntjcnlwdG87ZGI7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNyeXB0bz10O3RoaXMuZGI9ZX1hc3luYyBhZGQoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e2lmKGUubGVuZ3RoPT09MCl7bihbXSk7cmV0dXJufWxldCBzPUFycmF5KGUubGVuZ3RoKS5maWxsKDApO3Qub25jb21wbGV0ZT0oKT0+bihzKSx0Lm9uZXJyb3I9KCk9Pntmb3IobGV0IGk9MDtpPHMubGVuZ3RoO2krKylzW2ldPTE4O24ocyl9O2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXR7a2V5Om8sZGF0YTphfT1lW2ldLGQ9QyhvKSx1PXIucHV0KGEsZCk7dS5vbmVycm9yPShsKT0+e2wucHJldmVudERlZmF1bHQoKSxzW2ldPTE4fX19KX1hc3luYyBkZWwoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXQgbyBvZiB0KXtsZXQgYT1DKG8pO24uZGVsZXRlKGEpfX0pfWFzeW5jIGdldChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFcsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9QyhlKSxvPXIuZ2V0KGkpO28ub25zdWNjZXNzPWFzeW5jKCk9PntsZXQgYT1vLnJlc3VsdDtpZihhKW4oYXdhaXQganQoZSxhLHRoaXMuY3J5cHRvKSk7ZWxzZSBuKHZvaWQgMCl9LG8ub25lcnJvcj0oKT0+cyhvLmVycm9yKX0pfWFzeW5jIGhhcyhlKXtyZXR1cm4gYXdhaXQgdGhpcy5nZXQoZSkhPT12b2lkIDB9YXN5bmMgbGlzdChlKXtsZXQgdD1lPy5hcGxkLHI9ZT8uYm9keSE9PSExLHM9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e2xldCBhPVtdLGQ9dD09PXZvaWQgMD9zLm9wZW5DdXJzb3IoKTpzLmluZGV4KEF0KS5vcGVuQ3Vyc29yKElEQktleVJhbmdlLm9ubHkodCkpO2Qub25zdWNjZXNzPSh1KT0+e2xldCBsPXUudGFyZ2V0LnJlc3VsdDtpZihsKXtsZXQgZj10PT09dm9pZCAwP2wua2V5OmwucHJpbWFyeUtleSxoPWwudmFsdWU7YS5wdXNoKHtoYXNoOmZlKGYpLGRhdGE6aH0pLGwuY29udGludWUoKX1lbHNlIFByb21pc2UuYWxsKGEubWFwKCh7aGFzaDpmLGRhdGE6aH0pPT5qdChmLGgsdGhpcy5jcnlwdG8se2JvZHk6cn0pKSkudGhlbihpKS5jYXRjaChvKX0sZC5vbmVycm9yPSgpPT5vKGQuZXJyb3IpfSl9YXN5bmMgY291bnQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPWU9PT12b2lkIDA/ci5jb3VudCgpOnIuaW5kZXgoQXQpLmNvdW50KElEQktleVJhbmdlLm9ubHkoZSkpO2kub25zdWNjZXNzPSgpPT5uKGkucmVzdWx0KSxpLm9uZXJyb3I9KCk9PnMoaS5lcnJvcil9KX1hc3luYyBsaXN0S2V5cygpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZG9ubHkiKS5vYmplY3RTdG9yZShXKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz1bXSxpPXQub3BlbktleUN1cnNvcigpO2kub25zdWNjZXNzPShvKT0+e2xldCBhPW8udGFyZ2V0LnJlc3VsdDtpZihhKXMucHVzaChmZShhLmtleSkpLGEuY29udGludWUoKTtlbHNlIHIocyl9LGkub25lcnJvcj0oKT0+bihpLmVycm9yKX0pfWFzeW5jIGxhc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpLG89ci5vcGVuQ3Vyc29yKCk7by5vbnN1Y2Nlc3M9YXN5bmMoYSk9PntsZXQgZD1hLnRhcmdldC5yZXN1bHQ7aWYoZCl7bGV0e2tleTp1LHZhbHVlOmx9PWQ7aWYoWChlLGwuZWlkKSl7aWYoIWl8fChsLmN0cj8/MCk+KGkuZGF0YS5jdHI/PzApfHwobC5jdHI/PzApPT09KGkuZGF0YS5jdHI/PzApJiYobC5vZmY/PzApPihpLmRhdGEub2ZmPz8wKSlpPXtrZXk6dSxkYXRhOmx9fWQuY29udGludWUoKX1lbHNlIGlmKGkpe2xldCB1PWZlKGkua2V5KTtuKGF3YWl0IGp0KHUsaS5kYXRhLHRoaXMuY3J5cHRvKSl9ZWxzZSBuKHZvaWQgMCl9LG8ub25lcnJvcj0oKT0+cyhvLmVycm9yKX0pfWFzeW5jIG1hcmtBcHBsaWVkKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9QyhvKSxkPW4uZ2V0KGEpO2Qub25zdWNjZXNzPSgpPT57bGV0IHU9ZC5yZXN1bHQ7aWYoIXUpcmV0dXJuO3pyKHUsWHQpLG4ucHV0KHUsYSl9LGQub25lcnJvcj0odSk9Pnt1LnByZXZlbnREZWZhdWx0KCl9fX0pfWFzeW5jIG1hcmtGYWlsZWQoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXR7a2V5Om8sZXJyOmF9b2YgdCl7bGV0IGQ9QyhvKSx1PW4uZ2V0KGQpO3Uub25zdWNjZXNzPSgpPT57bGV0IGw9dS5yZXN1bHQ7aWYoIWwpcmV0dXJuO3pyKGwsbnQsYSksbi5wdXQobCxkKX0sdS5vbmVycm9yPShsKT0+e2wucHJldmVudERlZmF1bHQoKX19fSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19dmFyIFBhPTg7Y2xhc3Mgdm57I2U7I3Q7I247I3M7I3I7Y29uc3RydWN0b3IoZSl7aWYodGhpcy4jcj1lLnBlcnNpc3RLZXlyaW5nLHRoaXMuI249e3JwSWQ6ZS5ycElkLHJwTmFtZTplLnJwTmFtZX0sdGhpcy4jcz1lLnVzZXJOYW1lPz9lLnJwSWQ/P2UucnBOYW1lPz9FdCxlLmtleXJpbmchPT12b2lkIDApdGhpcy4jdD1CZShlLmtleXJpbmcpfWdldCBrZXlyaW5nKCl7cmV0dXJuIHRoaXMuI3Q9PT12b2lkIDA/dm9pZCAwOkJlKHRoaXMuI3QpfWxpc3QoKXtpZih0aGlzLiN0PT09dm9pZCAwKXJldHVybltdO3JldHVybiB0aGlzLiN0LmVudHJpZXMubWFwKGthKX1hc3luYyBzYXZlKGUsdCl7aWYodD8ucGVyc2lzdD09PSEwKXJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcigicHJmLXN0b3JlOiB1c2UgYmluZEFuZFNhdmUoZW5jbGF2ZSkgdG8gcGVyc2lzdCBhIGJpbmRpbmciKSk7cmV0dXJuIHRoaXMuI2U9ZSx0aGlzLiNlfWFzeW5jIGJpbmRBbmRTYXZlKGUsdCl7bGV0IHI9dGhpcy4jdCxuPXQ/LmNyZWRJZCxzPW4gaW5zdGFuY2VvZiBVaW50OEFycmF5P24uYnl0ZUxlbmd0aD4wOm4hPT12b2lkIDAmJm4ubGVuZ3RoPjA7aWYoIXMmJnIhPT12b2lkIDAmJnIuZW50cmllcy5sZW5ndGg+PVBhKXJldHVybiBjKDI2KTtsZXQgaT1TaSh0Py5uaWNrKSxvPXQ/LmV4Y2x1ZGVDcmVkZW50aWFscz8/KHM/dm9pZCAwOnZhKHIpKSxhPXQ/LnNhbHQ/P3I/LnNhbHQsZD1yPT09dm9pZCAwP3ZvaWQgMDpyLmVudHJpZXMubWFwKChnKT0+KHtjcmVkSWQ6Zy5jcmVkSWQsdGFnOmcudGFnfSkpLFt1LGxdPWF3YWl0IGUuYmluZCh7Li4udGhpcy4jbixzYWx0OmEsY3JlZElkOm4sY3JlYXRlQ3JlZElmTmVlZGVkOnQ/LmNyZWF0ZUNyZWRJZk5lZWRlZD8/IXMsZXhjbHVkZUNyZWRlbnRpYWxzOm8sdXNlck5hbWU6dGhpcy4jcyxkaXNwbGF5TmFtZTppPz90aGlzLiNuLnJwTmFtZT8/dGhpcy4jcyxhdXRoZW50aWNhdG9yQXR0YWNobWVudDp0Py5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxoaW50czp0Py5oaW50c30sZCk7aWYobCE9PTApcmV0dXJuIGMobCk7aWYodT09PXZvaWQgMClyZXR1cm4gYygxMik7bGV0IGY9RGF0ZS5ub3coKSxoPXt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp1LnNlYWxlZE1hc3RlcixjcmVkSWQ6dS5jcmVkSWQsdGFnOnUudGFnLHVzZXJJZDp1LnVzZXJJZCxuaWNrOmksZW5yb2xsZWRBdDpmLGxhc3RVc2VkQXQ6ZixhdHRhY2htZW50OnUuYXR0YWNobWVudCx0cmFuc3BvcnRzOnUudHJhbnNwb3J0cyxhYWd1aWQ6dS5hYWd1aWQsZW5yb2xsZWRPczpVYSgpfSx5PXI9PT12b2lkIDA/e3NhbHQ6dS5zYWx0LnNsaWNlKCksZW50cmllczpbXX06QmUocik7cmV0dXJuIHRoaXMuI3Q9RGEoeSxoKSx0aGlzLiNlPWUsYXdhaXQgdGhpcy4jcihCZSh0aGlzLiN0KSkscCh0aGlzLiNlKX1hc3luYyBsb2FkKCl7cmV0dXJuIHRoaXMuI2V9YXN5bmMgdW5sb2NrKCl7bGV0IGU9dGhpcy4jdDtpZihlPT09dm9pZCAwfHxlLmVudHJpZXMubGVuZ3RoPT09MClyZXR1cm4gYygyMik7bGV0W3Qscl09YXdhaXQgcmUudW5zZWFsV2l0aFBhc3NrZXkoZS5lbnRyaWVzLm1hcCgocyk9Pih7c2VhbGVkTWFzdGVyOnMuc2VhbGVkTWFzdGVyLGNyZWRJZDpzLmNyZWRJZH0pKSx7Li4udGhpcy4jbixzYWx0OmUuc2FsdH0pO2lmKHIhPT0wKXJldHVybiBjKHIpO3RoaXMuI2U9dC5lbmNsYXZlO2xldCBuPUNhKGUsdC5jcmVkSWQpO2lmKG4hPT12b2lkIDApdGhpcy4jdD1uLGF3YWl0IHRoaXMuI3IoQmUobikpO3JldHVybiBwKHQuZW5jbGF2ZSl9YXN5bmMgcmVuYW1lKGUsdCl7bGV0IHI9dGhpcy4jdDtpZihyPT09dm9pZCAwKXJldHVybiBjKDIyKTtsZXQgbj1yLmVudHJpZXMuZmluZEluZGV4KChkKT0+WChkLmNyZWRJZCxlKSk7aWYobjwwKXJldHVybiBjKDEzKTtsZXQgcz1yLmVudHJpZXMubWFwKFB0KSxpPXNbbl07aWYoaT09PXZvaWQgMClyZXR1cm4gYygxMyk7bGV0IG89U2kodCk7c1tuXT17Li4uaSxuaWNrOm99O2xldCBhPXtzYWx0OnIuc2FsdC5zbGljZSgpLGVudHJpZXM6c307cmV0dXJuIHRoaXMuI3Q9YSxhd2FpdCB0aGlzLiNyKEJlKGEpKSxwKHZvaWQgMCl9YXN5bmMgcmVtb3ZlKGUpe2xldCB0PXRoaXMuI3Q7aWYodD09PXZvaWQgMClyZXR1cm4gYygyMik7bGV0IHI9dC5lbnRyaWVzLmZpbHRlcigocyk9PiFYKHMuY3JlZElkLGUpKTtpZihyLmxlbmd0aD09PXQuZW50cmllcy5sZW5ndGgpcmV0dXJuIGMoMTMpO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gdGhpcy4jdD12b2lkIDAsYXdhaXQgdGhpcy4jcih2b2lkIDApLHAodm9pZCAwKTtsZXQgbj17c2FsdDp0LnNhbHQuc2xpY2UoKSxlbnRyaWVzOnIubWFwKFB0KX07cmV0dXJuIHRoaXMuI3Q9bixhd2FpdCB0aGlzLiNyKEJlKG4pKSxwKHZvaWQgMCl9YXN5bmMgd2lwZSgpe3RoaXMuI2U9dm9pZCAwLHRoaXMuI3Q9dm9pZCAwLGF3YWl0IHRoaXMuI3Iodm9pZCAwKX19ZnVuY3Rpb24gU2koZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9ZS50cmltKCk7cmV0dXJuIHQ9PT0iIj92b2lkIDA6dH1mdW5jdGlvbiBVYSgpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUiKXJldHVybjtyZXR1cm4gaWkobmF2aWdhdG9yLnVzZXJBZ2VudCl9ZnVuY3Rpb24gUHQoZSl7bGV0W3Qscl09TGUoZS5zZWFsZWRNYXN0ZXIuc2xpY2UoKSk7cmV0dXJue3R5cGU6InByZiIsc2VhbGVkTWFzdGVyOnI9PT0wJiZ0IT09dm9pZCAwP3Q6ZS5zZWFsZWRNYXN0ZXIsY3JlZElkOmUuY3JlZElkLnNsaWNlKCksdGFnOmUudGFnLnNsaWNlKCksdXNlcklkOmUudXNlcklkPT09dm9pZCAwP3ZvaWQgMDplLnVzZXJJZC5zbGljZSgpLG5pY2s6ZS5uaWNrLGVucm9sbGVkQXQ6ZS5lbnJvbGxlZEF0LGxhc3RVc2VkQXQ6ZS5sYXN0VXNlZEF0LGF0dGFjaG1lbnQ6ZS5hdHRhY2htZW50LHRyYW5zcG9ydHM6ZS50cmFuc3BvcnRzPT09dm9pZCAwP3ZvaWQgMDpbLi4uZS50cmFuc3BvcnRzXSxhYWd1aWQ6ZS5hYWd1aWQ9PT12b2lkIDA/dm9pZCAwOmUuYWFndWlkLnNsaWNlKCksZW5yb2xsZWRPczplLmVucm9sbGVkT3N9fWZ1bmN0aW9uIEJlKGUpe3JldHVybntzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6ZS5lbnRyaWVzLm1hcChQdCl9fWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiBCYShlKXtpZighYmkoZSl8fGUudHlwZSE9PSJwcmYiKXJldHVybjtpZighKGUuc2VhbGVkTWFzdGVyIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEoZS5jcmVkSWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShlLnRhZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHxlLnRhZy5ieXRlTGVuZ3RoIT09MzJ8fHR5cGVvZiBlLmVucm9sbGVkQXQhPT0ibnVtYmVyInx8IU51bWJlci5pc0Zpbml0ZShlLmVucm9sbGVkQXQpKXJldHVybjtsZXRbdCxyXT1MZShlLnNlYWxlZE1hc3Rlcik7aWYociE9PTB8fHQ9PT12b2lkIDApcmV0dXJuO2xldCBuPWUuYXR0YWNobWVudD09PSJwbGF0Zm9ybSJ8fGUuYXR0YWNobWVudD09PSJjcm9zcy1wbGF0Zm9ybSI/ZS5hdHRhY2htZW50OnZvaWQgMCxzPWUuZW5yb2xsZWRPcyxpPXM9PT0iaW9zInx8cz09PSJtYWNvcyJ8fHM9PT0iYW5kcm9pZCJ8fHM9PT0id2luZG93cyJ8fHM9PT0ibGludXgifHxzPT09Im90aGVyIj9zOnZvaWQgMCxvPUFycmF5LmlzQXJyYXkoZS50cmFuc3BvcnRzKT9lLnRyYW5zcG9ydHMuZmlsdGVyKChhKT0+dHlwZW9mIGE9PT0ic3RyaW5nIik6dm9pZCAwO3JldHVybnt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp0LGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzplLnRhZy5zbGljZSgpLHVzZXJJZDplLnVzZXJJZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZS51c2VySWQuc2xpY2UoKTp2b2lkIDAsbmljazp0eXBlb2YgZS5uaWNrPT09InN0cmluZyI/ZS5uaWNrOnZvaWQgMCxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OnR5cGVvZiBlLmxhc3RVc2VkQXQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKGUubGFzdFVzZWRBdCk/ZS5sYXN0VXNlZEF0OnZvaWQgMCxhdHRhY2htZW50Om4sdHJhbnNwb3J0czpvPT09dm9pZCAwfHxvLmxlbmd0aD09PTA/dm9pZCAwOm8sYWFndWlkOmUuYWFndWlkIGluc3RhbmNlb2YgVWludDhBcnJheT9lLmFhZ3VpZC5zbGljZSgpOnZvaWQgMCxlbnJvbGxlZE9zOml9fWZ1bmN0aW9uIHdpKGUpe2lmKCFiaShlKSlyZXR1cm47aWYoIShlLnNhbHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IUFycmF5LmlzQXJyYXkoZS5lbnRyaWVzKSlyZXR1cm47bGV0IHQ9W107Zm9yKGxldCByIG9mIGUuZW50cmllcyl7bGV0IG49QmEocik7aWYobiE9PXZvaWQgMCl0LnB1c2gobil9aWYodC5sZW5ndGg9PT0wKXJldHVybjtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnR9fWZ1bmN0aW9uIGthKGUpe3JldHVybnt0eXBlOiJwcmYiLGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfX1mdW5jdGlvbiB2YShlKXtpZihlPT09dm9pZCAwKXJldHVybltdO3JldHVybiBlLmVudHJpZXMuZmlsdGVyKCh0KT0+dC5jcmVkSWQuYnl0ZUxlbmd0aD4wKS5tYXAoKHQpPT50LmNyZWRJZC5zbGljZSgpKX1mdW5jdGlvbiBEYShlLHQpe2xldCByPWUuZW50cmllcy5tYXAoUHQpLG49ci5maW5kSW5kZXgoKHMpPT5YKHMuY3JlZElkLHQuY3JlZElkKSk7aWYobj49MCl7bGV0IHM9cltuXTtyW25dPXsuLi50LGVucm9sbGVkQXQ6cz8uZW5yb2xsZWRBdD8/dC5lbnJvbGxlZEF0LG5pY2s6dC5uaWNrPz9zPy5uaWNrfX1lbHNlIHIucHVzaCh0KTtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnJ9fWZ1bmN0aW9uIENhKGUsdCl7aWYodC5ieXRlTGVuZ3RoPT09MClyZXR1cm47bGV0IHI9ZS5lbnRyaWVzLmZpbmRJbmRleCgoaSk9PlgoaS5jcmVkSWQsdCkpO2lmKHI8MClyZXR1cm47bGV0IG49ZS5lbnRyaWVzLm1hcChQdCkscz1uW3JdO2lmKHM9PT12b2lkIDApcmV0dXJuO3JldHVybiBuW3JdPXsuLi5zLGxhc3RVc2VkQXQ6RGF0ZS5ub3coKX0se3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczpufX12YXIgSG09eXIoImZiZmMzMDA3MTU0ZTRlY2M4YzBiNmUwMjA1NTdkN2JkIiksTW09eXIoImVhOWI4ZDY2NGQwMTFkMjEzY2U0YjZiNDhjYjU3NWQ0IiksUm09eXIoIjA4OTg3MDU4Y2FkYzRiODFiNmUxMzBkZTUwZGNiZTk2IiksTG09eXIoIjJmYzA1NzlmODExMzQ3ZWFiMTE2YmI1YThkYjkyMDJhIik7ZnVuY3Rpb24geXIoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoMTYpO2ZvcihsZXQgcj0wO3I8MTY7cisrKXRbcl09TnVtYmVyLnBhcnNlSW50KGUuc2xpY2UocioyLHIqMisyKSwxNik7cmV0dXJuIHR9dmFyIFRhPSJkaXBsb21hdGljLnBpbi8iO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBUYStoZShlKX1hc3luYyBmdW5jdGlvbiBJaShlLHQscil7bGV0IG49YXdhaXQgdC5kZXJpdmVJZGVudGl0eShIYShyKSwwKTtyZXR1cm4gZS5ibGFrZTMobi5wdWJsaWNLZXkpfWFzeW5jIGZ1bmN0aW9uIHhpKGUsdCl7bGV0IHI9YXdhaXQgZS5nZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCksbj1hd2FpdCBJaShlLHQscik7cmV0dXJue246cixoOm59fWFzeW5jIGZ1bmN0aW9uIEVpKGUsdCxyKXtsZXQgbj1hd2FpdCBJaShlLHQsci5uKTtyZXR1cm4gTWEobixyLmgpfWZ1bmN0aW9uIEFpKGUpe2lmKGU9PT12b2lkIDB8fGU9PT1udWxsfHx0eXBlb2YgZSE9PSJvYmplY3QiKXJldHVybjtsZXQgdD1lO2lmKCEodC5uIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEodC5oIGluc3RhbmNlb2YgVWludDhBcnJheSkpcmV0dXJuO2lmKHQubi5ieXRlTGVuZ3RoPDF8fHQuaC5ieXRlTGVuZ3RoPDEpcmV0dXJuO3JldHVybntuOnQubi5zbGljZSgpLGg6dC5oLnNsaWNlKCl9fWZ1bmN0aW9uIFBpKGUpe3JldHVybntuOmUubi5zbGljZSgpLGg6ZS5oLnNsaWNlKCl9fWZ1bmN0aW9uIE1hKGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmJ5dGVMZW5ndGg7bisrKXJ8PWVbbl1edFtuXTtyZXR1cm4gcj09PTB9dmFyIG1yPSJrZXlyaW5nIixVaT0icHJmTWV0YSIsRG49ImlkUGluIixCaT0iaWRQdWIiO2NsYXNzIENueyNlO2RiOyN0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kYj1lLHRoaXMuI3Q9dH1hc3luYyBzYXZlKGUsdCl7cmV0dXJuIGF3YWl0IHRoaXMuI24oZSksdGhpcy4jZT1lLHRoaXMuI2V9YXN5bmMgbG9hZCgpe3JldHVybiB0aGlzLiNlfWFzeW5jIGNsZWFyU2Vzc2lvbigpe3RoaXMuI2U9dm9pZCAwfWFzeW5jIHdpcGUoKXt0aGlzLiNlPXZvaWQgMDtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKGllLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmRlbGV0ZShtciksdC5kZWxldGUoVWkpLHQuZGVsZXRlKERuKSx0LmRlbGV0ZShCaSl9KX1hc3luYyBsb2FkS2V5cmluZygpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oaWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0KG1yKTtzLm9uc3VjY2Vzcz0oKT0+e3Iod2kocy5yZXN1bHQpKX0scy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgcGVyc2lzdEtleXJpbmcoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihpZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKGllKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntpZih0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5kZWxldGUoVWkpLGU9PT12b2lkIDApe3IuZGVsZXRlKG1yKTtyZXR1cm59ci5wdXQoQmUoZSksbXIpfSl9YXN5bmMgaGFzS2V5cmluZygpe2xldCBlPWF3YWl0IHRoaXMubG9hZEtleXJpbmcoKTtyZXR1cm4gZSE9PXZvaWQgMCYmZS5lbnRyaWVzLmxlbmd0aD4wfWFzeW5jIG9wZW5QcmZTdG9yZShlKXtsZXQgdD1hd2FpdCB0aGlzLmxvYWRLZXlyaW5nKCk7cmV0dXJuIG5ldyB2bih7cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lLHVzZXJOYW1lOmUudXNlck5hbWUsa2V5cmluZzp0LHBlcnNpc3RLZXlyaW5nOihyKT0+dGhpcy5wZXJzaXN0S2V5cmluZyhyKX0pfWFzeW5jI24oZSl7YXdhaXQgdGhpcy4jaShCaSk7bGV0IHQ9YXdhaXQgdGhpcy4jcygpO2lmKHQhPT12b2lkIDApe2lmKCFhd2FpdCBFaSh0aGlzLiN0LGUsdCkpdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBzZWVkIGRvZXMgbm90IG1hdGNoIHRoaXMgZGV2aWNlJ3MgaWRlbnRpdHkgKGxvY2FsIGRhdGEgd2FzIGNyZWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBtYXN0ZXIgc2VlZCkiKTtyZXR1cm59bGV0IHI9YXdhaXQgeGkodGhpcy4jdCxlKTthd2FpdCB0aGlzLiNyKHIpfSNzKCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihpZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShpZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXQoRG4pO3Mub25zdWNjZXNzPSgpPT5yKEFpKHMucmVzdWx0KSkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9I3IoZSl7bGV0IHQ9UGkoZSkscj10aGlzLmRiLnRyYW5zYWN0aW9uKGllLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKSxuLnB1dCh0LERuKX0pfSNpKGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oaWUsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShpZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57dC5vbmNvbXBsZXRlPSgpPT5uKCksdC5vbmVycm9yPSgpPT5zKHQuZXJyb3IpLHIuZGVsZXRlKGUpfSl9fWNsYXNzIFRue2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBlbnEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGxlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUobGUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9aGUoYSk7cy5wdXQoe2hvc3Q6ZSxoYXNoOmR9KX19KX1hc3luYyBkZXEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGxlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUobGUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9aGUoYSk7cy5kZWxldGUoW2UsZF0pfX0pfWFzeW5jIGxpc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShsZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ci5nZXRBbGwoKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBhPWkucmVzdWx0LmZpbHRlcigoZCk9PmQuaG9zdD09PWUpLm1hcCgoZCk9PmQuaGFzaCk7bihhLm1hcCgoZCk9PkduKGQpKSl9LGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShsZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKGxlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fXZhciBpZT0ic2VlZE1ldGEiLHNlPSJob3N0cyIsbGU9InVwbG9hZFF1ZXVlIix1ZT0iZG93bmxvYWRRdWV1ZSIsVz0ibWVzc2FnZXMiLEF0PSJhcGxkIixraT0zLHZpPSJkaXBsb21hdGljLXN0b3JlLWRiIjtjbGFzcyBEaXtzZWVkO2hvc3RzO3VwbG9hZHM7ZG93bmxvYWRzO21lc3NhZ2VzO2RiO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kYj1lLHRoaXMuc2VlZD1uZXcgQ24oZSx0KSx0aGlzLmhvc3RzPW5ldyBCbihlKSx0aGlzLnVwbG9hZHM9bmV3IFRuKGUpLHRoaXMuZG93bmxvYWRzPW5ldyBVbihlKSx0aGlzLm1lc3NhZ2VzPW5ldyBrbihlLHQpfWFzeW5jIHdpcGUoKXthd2FpdCB0aGlzLmhvc3RzLndpcGUoKSxhd2FpdCB0aGlzLnVwbG9hZHMud2lwZSgpLGF3YWl0IHRoaXMuZG93bmxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLm1lc3NhZ2VzLndpcGUoKX19YXN5bmMgZnVuY3Rpb24gUmEoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgcj1pbmRleGVkREIub3Blbih2aSxraSk7ci5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0Om4sdHJhbnNhY3Rpb246c309cjtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGllKSluLmNyZWF0ZU9iamVjdFN0b3JlKGllKTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHNlKSluLmNyZWF0ZU9iamVjdFN0b3JlKHNlLHtrZXlQYXRoOiJsYWJlbCJ9KTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGxlKSluLmNyZWF0ZU9iamVjdFN0b3JlKGxlLHtrZXlQYXRoOlsiaG9zdCIsImhhc2giXX0pO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModWUpKW4uY3JlYXRlT2JqZWN0U3RvcmUodWUpO2xldCBpO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoVykpaT1uLmNyZWF0ZU9iamVjdFN0b3JlKFcpO2Vsc2V7aWYoIXMpdGhyb3cgRXJyb3IoIm1pc3NpbmcgdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgbWVzc2FnZXMgc3RvcmUiKTtpPXMub2JqZWN0U3RvcmUoVyl9aWYoIWkuaW5kZXhOYW1lcy5jb250YWlucyhBdCkpaS5jcmVhdGVJbmRleChBdCwiYXBsZCIse3VuaXF1ZTohMX0pfSxyLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIHByb3RvY29sIHN0b3JlIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7dml9IOKGkiB2JHtraX0pOyB3YWl0aW5nIGZvciBvdGhlciBjb25uZWN0aW9ucyB0byBjbG9zZWApfSxyLm9uc3VjY2Vzcz0oKT0+e2xldCBuPXIucmVzdWx0O24ub252ZXJzaW9uY2hhbmdlPSgpPT57bi5jbG9zZSgpfSxlKG4pfSxyLm9uZXJyb3I9KCk9PnQoci5lcnJvcj8/RXJyb3IoInByb3RvY29sIHN0b3JlIEluZGV4ZWREQiBvcGVuIGZhaWxlZCIpKX0pfWFzeW5jIGZ1bmN0aW9uIENpKGUpe2xldCB0PWF3YWl0IFJhKCk7aWYodHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zdG9yYWdlPy5wZXJzaXN0KXRyeXthd2FpdCBQcm9taXNlLnJhY2UoW25hdmlnYXRvci5zdG9yYWdlLnBlcnNpc3QoKSxuZXcgUHJvbWlzZSgocik9PntzZXRUaW1lb3V0KCgpPT5yKCExKSwyMDAwKX0pXSl9Y2F0Y2h7fXJldHVybiBuZXcgRGkodCxlKX1jbGFzcyBIbntjbGllbnQ7ZW50REI7cG9zdDt3aGVuUmVhZHk7cmVzb2x2ZVJlYWR5O3JlamVjdFJlYWR5O2NvbnN0cnVjdG9yKGUpe3RoaXMucG9zdD1lLHRoaXMud2hlblJlYWR5PW5ldyBQcm9taXNlKCh0LHIpPT57dGhpcy5yZXNvbHZlUmVhZHk9dCx0aGlzLnJlamVjdFJlYWR5PXJ9KX1hc3luYyBpbml0KCl7dHJ5e2xldCBlPWF3YWl0IENpKHRyKSx0PWF3YWl0IHlzKHtjYWNoZTohMX0pLHI9bmV3IE50KHQuYXBwbHksKCk9PnQuY2xlYXIoKSwoaSk9PntpZihpLmxlbmd0aDwxKXJldHVybjt0aGlzLnBvc3Qoe2tpbmQ6ImRpcnR5IixlaWRzOmkubWFwKChvKT0+by5zbGljZSgpKX0pfSksbj1yLmNsZWFyO3IuY2xlYXI9YXN5bmMoKT0+e2xldCBpPWF3YWl0IG4oKTtpZihpPT09MCl0aGlzLnBvc3Qoe2tpbmQ6IndpcGVkIn0pO3JldHVybiBpfTtsZXQgcz1uZXcgWXIobmV3IFByLHIsZSxzcyx0cik7dGhpcy5jbGllbnQ9cyx0aGlzLmVudERCPXQscy5jbGllbnRTdGF0ZS5saXN0ZW4oKCk9Pnt0aGlzLmVtaXRDbGllbnRTdGF0ZSgpfSkscy54ZmVyU3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0WGZlclN0YXRlKCl9KSxhd2FpdCB0aGlzLmVtaXRYZmVyU3RhdGUoKSx0aGlzLnBvc3Qoe2tpbmQ6InJlYWR5In0pLHRoaXMubWFya1JlYWR5KCl9Y2F0Y2goZSl7bGV0IHQ9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKTt0aHJvdyB0aGlzLnBvc3Qoe2tpbmQ6ImluaXRFcnJvciIsbWVzc2FnZTp0Lm1lc3NhZ2V9KSx0aGlzLmZhaWxSZWFkeSh0KSx0fX1tYXJrUmVhZHkoKXtsZXQgZT10aGlzLnJlc29sdmVSZWFkeTtpZih0aGlzLnJlc29sdmVSZWFkeT12b2lkIDAsdGhpcy5yZWplY3RSZWFkeT12b2lkIDAsZSllKCl9ZmFpbFJlYWR5KGUpe2xldCB0PXRoaXMucmVqZWN0UmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLHQpdChlKX1yZXF1aXJlQ2xpZW50KCl7aWYoIXRoaXMuY2xpZW50KXRocm93IEVycm9yKCJXb3JrZXJSdW50aW1lIG5vdCBpbml0aWFsaXplZCIpO3JldHVybiB0aGlzLmNsaWVudH1hc3luYyBlbWl0Q2xpZW50U3RhdGUoKXtsZXQgZT10aGlzLmNsaWVudDtpZighZSlyZXR1cm47bGV0IHQ9YXdhaXQgZS5jbGllbnRTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6ImNsaWVudFN0YXRlIixjb25uZWN0ZWQ6dC5jb25uZWN0ZWR9KX1hc3luYyBlbWl0WGZlclN0YXRlKCl7bGV0IGU9dGhpcy5jbGllbnQ7aWYoIWUpcmV0dXJuO2xldCB0PWF3YWl0IGUueGZlclN0YXRlLmdldCgpO3RoaXMucG9zdCh7a2luZDoieGZlclN0YXRlIixzdGF0ZTp0fSl9aG9zdEZyb21TZXJpYWxpemVkKGUpe3JldHVybntoYW5kbGU6bmV3IFVSTChlLmhhbmRsZSksbGFiZWw6ZS5sYWJlbCxpZHg6ZS5pZHh9fWFzeW5jIGhhbmRsZShlKXthd2FpdCB0aGlzLndoZW5SZWFkeTtsZXQgdD10aGlzLnJlcXVpcmVDbGllbnQoKTtzd2l0Y2goZS5vcCl7Y2FzZSJwaW5nIjpyZXR1cm4icG9uZyI7Y2FzZSJzZXRTZWVkIjp7bGV0W3Isbl09cmUuZnJvbUJ5dGVzKGUuc2VlZCk7aWYoZS5zZWVkLmZpbGwoMCksbiE9PTB8fHI9PT12b2lkIDApdGhyb3cgbmV3IHBlKG4pO2F3YWl0IHQuc2V0U2VlZChyLHtwZXJzaXN0OmUucGVyc2lzdH0pO3JldHVybn1jYXNlImxpbmsiOnthd2FpdCB0LmxpbmsodGhpcy5ob3N0RnJvbVNlcmlhbGl6ZWQoZS5ob3N0KSxlLmNvbm5lY3Q/PyEwKTtyZXR1cm59Y2FzZSJ1bmxpbmsiOnthd2FpdCB0LnVubGluayhlLmxhYmVsKTtyZXR1cm59Y2FzZSJjb25uZWN0Ijp7YXdhaXQgdC5jb25uZWN0KGUubGlzdGVuPz8hMCxlLnN5bmM/PyEwKTtyZXR1cm59Y2FzZSJkaXNjb25uZWN0Ijp7YXdhaXQgdC5kaXNjb25uZWN0KCk7cmV0dXJufWNhc2Uic3luYyI6cmV0dXJuIGF3YWl0IHQuc3luYygpO2Nhc2UicmVidWlsZCI6cmV0dXJuIGF3YWl0IHQucmVidWlsZCh7Y2hlY2tIb3N0OmUuY2hlY2tIb3N0Pz8hMH0pO2Nhc2UicmVjb25jaWxlIjp7bGV0W3Isbl09YXdhaXQgdC5yZWNvbmNpbGUoZS5ob3N0TGFiZWwse3B1bGw6ZS5wdWxsLHB1c2g6ZS5wdXNoLHN5bmM6ZS5zeW5jfSk7aWYobiE9PTApdGhyb3cgbmV3IHBlKG4pO2lmKCFyKXRocm93IG5ldyBwZSgxMik7cmV0dXJuIHJ9Y2FzZSJtc2djaGVjayI6cmV0dXJuIGF3YWl0IHQubXNnY2hlY2soKTtjYXNlImVudGNoZWNrIjp7bGV0IHI9dGhpcy5lbnREQjtpZighcil0aHJvdyBuZXcgcGUoMTIpO2xldFtuLHNdPWF3YWl0IHIuY2hlY2tzdW0odHIpO2lmKHMhPT0wKXRocm93IG5ldyBwZShzKTtpZighbil0aHJvdyBuZXcgcGUoMTIpO3JldHVybiBufWNhc2Uid2lwZSI6e2F3YWl0IHQud2lwZSh7bXNnczplLm1zZ3MsZW50czplLmVudHMsbWV0YTplLm1ldGEsc2VlZDplLnNlZWR9KTtyZXR1cm59Y2FzZSJpbXBvcnQiOntsZXQgcj1lLmJ5dGVzLnNsaWNlKCksbj1uZXcgQmxvYihbcl0pLHM9bmV3IEZpbGUoW25dLCJpbXBvcnQuZGlwIik7cmV0dXJuIGF3YWl0IHQuaW1wb3J0KHMpfWNhc2UiZXhwb3J0Ijp7bGV0W3Isbl09YXdhaXQgdC5leHBvcnRCeXRlcygpO2lmKG4hPT0wKXRocm93IG5ldyBwZShuKTtpZighcil0aHJvdyBuZXcgcGUoMTIpO3JldHVybiByfWNhc2UiZ2V0WGZlclN0YXRlIjpyZXR1cm4gYXdhaXQgdC54ZmVyU3RhdGUuZ2V0KCk7ZGVmYXVsdDp7bGV0IHI9ZTt0aHJvdyBFcnJvcigidW5rbm93biB3b3JrZXIgY29tbWFuZCIpfX19fWNsYXNzIHBlIGV4dGVuZHMgRXJyb3J7c3RhdHVzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBXb3JrZXJTdGF0dXNFcnJvcjogJHtVW2VdfWApO3RoaXMuc3RhdHVzPWU7dGhpcy5uYW1lPSJXb3JrZXJTdGF0dXNFcnJvciJ9fWZ1bmN0aW9uIGdyKGUsdCl7cmV0dXJue2tpbmQ6InJlcGx5IixpZDplLG9rOiEwLHJlc3VsdDp0fX1mdW5jdGlvbiBNbihlLHQpe3JldHVybntraW5kOiJyZXBseSIsaWQ6ZSxvazohMSxzdGF0dXM6dH19dmFyIEhlPWdsb2JhbFRoaXMsVGk9bmV3IEhuKChlLHQpPT57aWYodCYmdC5sZW5ndGg+MClIZS5wb3N0TWVzc2FnZShlLHQpO2Vsc2UgSGUucG9zdE1lc3NhZ2UoZSl9KTtIZS5vbm1lc3NhZ2U9KGUpPT57bGV0IHQ9ZS5kYXRhO2lmKCFPbih0KSlyZXR1cm47TGEodCl9O2FzeW5jIGZ1bmN0aW9uIExhKGUpe3RyeXtsZXQgdD1hd2FpdCBUaS5oYW5kbGUoZSk7aWYoKGUub3A9PT0iZXhwb3J0Inx8ZS5vcD09PSJtc2djaGVjayJ8fGUub3A9PT0iZW50Y2hlY2siKSYmdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCByPXQuc2xpY2UoKTtIZS5wb3N0TWVzc2FnZShncihlLmlkLHIpLFtyLmJ1ZmZlcl0pO3JldHVybn1pZihlLm9wPT09InJlY29uY2lsZSImJnQmJnR5cGVvZiB0PT09Im9iamVjdCImJiJtc2djaGVjayJpbiB0JiZ0Lm1zZ2NoZWNrIGluc3RhbmNlb2YgVWludDhBcnJheSl7bGV0IHI9dC5tc2djaGVjay5zbGljZSgpLG49ey4uLnQsbXNnY2hlY2s6cn07SGUucG9zdE1lc3NhZ2UoZ3IoZS5pZCxuKSxbci5idWZmZXJdKTtyZXR1cm59SGUucG9zdE1lc3NhZ2UoZ3IoZS5pZCx0KSl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHBlKXtIZS5wb3N0TWVzc2FnZShNbihlLmlkLHQuc3RhdHVzKSk7cmV0dXJufWNvbnNvbGUuZXJyb3IoIndvcmtlciBjb21tYW5kIGZhaWxlZCIsdCksSGUucG9zdE1lc3NhZ2UoTW4oZS5pZCwxMikpfX1UaS5pbml0KCkuY2F0Y2goKGUpPT57Y29uc29sZS5lcnJvcigid29ya2VyIGluaXQgZmFpbGVkIixlKX0pOwo=";var Yn=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,qs=Yn===void 0?void 0:Yn.prototype.postMessage,Hn;function zl(){if(typeof Tn!=="string"||Tn.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(Tn)}function El(){if(Hn!==void 0)return Hn;let t=new Blob([zl()],{type:"text/javascript"});return Hn=URL.createObjectURL(t),Hn}function To(){if(Yn===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Yn(El(),{type:"module"})}function Ho(t,e,n){if(qs===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)qs.call(t,e,{transfer:n});else qs.call(t,e)}var Fl=new TextEncoder().encode("diplomatic.bind.v1"),_s=new TextEncoder().encode("diplomatic.bindtag.v1"),vl=32,Ql=32,Dl=16,Ol=32,rt=new Dt;function jl(t){return t.map((e)=>({handle:e.handle,label:e.label,idx:e.idx??0}))}function Yo(t){if(t.byteLength===0||t.every((l)=>l===0))return c(22);if(t.byteLength<yt+1)return c(14);let e=t.subarray(0,yt);if(e.every((l)=>l===0))return c(22);let n=new M(t.subarray(yt)),[s,i]=n.readStruct(zs);if(i!==0)return c(i);if(s===void 0)return c(14);if(!n.done())return c(14);let[o,r]=tt.fromBytes(e);if(r!==0)return c(r);if(o===void 0)return c(12);return m({enclave:o,hosts:s.hosts.map((l)=>({...l}))})}async function ko(t,e,n){let s=At();if(s!==0)return s;let[i,o]=jt(n);if(o!==0)return o;if(i===void 0)return 9;await gn();let r=new Uint8Array(e.byteLength);r.set(e);let l={largeBlob:{write:r.buffer}},a={publicKey:{challenge:Ct(Ot),rpId:i,allowCredentials:[{type:It,id:Bt(t)}],userVerification:"required",extensions:l,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(a)}catch(y){if(!Vn(y))throw y;Xe(),d=await navigator.credentials.get(a)}}catch(y){return Jt(y),30}finally{r.fill(0)}let[u,p]=qt(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}var $s=32;function Al(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function ql(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function Po(t){if(t===void 0)return;let e=Wn(t);if(e.byteLength<$s){e.fill(0);return}if(e.byteLength===$s)return e;let n=e.slice(0,$s);return e.fill(0),n}async function _l(t){let e=At();if(e!==0)return c(e);let[n,s]=jt(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.userName??Je,o=t?.displayName??i,r=Ct(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:Ct(Ot),rp:{id:n,name:t?.rpName??In},user:{id:r,name:i,displayName:o},pubKeyCredParams:Sn,authenticatorSelection:a,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((X)=>({type:It,id:Bt(X)}))}:{}},u=t?.salt!==void 0?Bt(t.salt):void 0,p=(X)=>Kn({publicKey:{...d,extensions:X&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),h;try{h=await p(u!==void 0)}catch(X){if(u===void 0||!ql(X))return Jt(X),c(30);try{h=await p(!1)}catch(W){return Jt(W),c(30)}}let[y,Z]=qt(h);if(Z!==0)return c(Z);if(y===void 0)return c(27);let b=y.getClientExtensionResults(),G=Po(b.prf?.results?.first),S=b.prf?.enabled===!0||G!==void 0;if(l&&G!==void 0)G.fill(0);return m({credId:new Uint8Array(y.rawId),userId:new Uint8Array(r),prfEnabled:S,prf:l?void 0:G,attachment:Os(y.authenticatorAttachment),transports:js(y),aaguid:xo(y)})}async function Lo(t){let e=At();if(e!==0)return c(e);let[n,s]=jt(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.salt??Cn,o=Bt(i),r={challenge:Ct(Ot),rpId:n,userVerification:"preferred",extensions:{prf:{eval:{first:o}}}};if(t?.hints!==void 0)r.hints=t.hints;let l=Al(t?.credId);if(l.length>0)r.allowCredentials=l.map((y)=>({type:It,id:Bt(y)}));let a;try{a=await xn({publicKey:r})}catch(y){return Jt(y),c(30)}let[d,u]=qt(a);if(u!==0)return c(u);if(d===void 0)return c(27);let p=d.getClientExtensionResults().prf?.results;if(p?.first===void 0)return c(7);let h=Po(p.first);if(h===void 0)return c(27);return m({prf:h,credId:new Uint8Array(d.rawId),attachment:Os(d.authenticatorAttachment),transports:js(d)})}function ti(t){if(t.byteLength!==yt)return c(10);return[t,0]}class tt{#t;constructor(t){this.#t=t}static async fromRandom(t){if(t.byteLength<Ol)return c(10);let e=await rt.gen256BitSecureRandomSeed(),n=Zt(e,t);try{let s=await rt.blake3(n),[i,o]=ti(s);if(o!==0)return c(o);if(i===void 0)return c(12);return m(new tt(i))}finally{e.fill(0),n.fill(0),t.fill(0)}}static fromBytes(t){let[e,n]=ti(t);if(n!==0)return c(n);if(e===void 0)return c(10);let[s,i]=ti(e.slice());if(i!==0)return c(i);if(s===void 0)return c(10);return m(new tt(s))}async sealWithPasskey(t){let e=t?.salt??Cn,n=t?.credId,s=n,i=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),o,r;if(i){let[u,p]=await _l({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??Je,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return c(p);if(u===void 0)return c(30);if(!u.prfEnabled)return c(30);s=u.credId,o=u,r=u.prf}let l=async(u,p,h,y)=>{try{let[Z,b]=await this.#s(u);if(b!==0)return c(b);if(Z===void 0)return c(12);return m({sealedMaster:Z,salt:e.slice(),credId:p.slice(),userId:o?.userId===void 0?void 0:o.userId.slice(),attachment:h??o?.attachment,transports:y??o?.transports,aaguid:o?.aaguid===void 0?void 0:o.aaguid.slice()})}finally{u.fill(0)}};if(r!==void 0&&o!==void 0)return l(r,o.credId,o.attachment,o.transports);let[a,d]=await Lo({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return c(d);if(a===void 0)return c(7);return l(a.prf,a.credId,a.attachment,a.transports)}async bind(t,e){if(e!==void 0){for(let o of e)if(!await this.#n(o.credId,o.tag))return c(10)}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return c(s);if(n===void 0)return c(12);let i=await this.#e(n.credId);return m({...n,tag:i})}static async unsealWithPasskey(t,e){if(t.length===0)return c(22);let n=[];for(let l of t)if(l.credId.byteLength>0)n.push(l.credId);let[s,i]=await Lo({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt});if(i!==0)return c(i);if(s===void 0)return c(7);let o=t.find((l)=>B(l.credId,s.credId)),r=o===void 0?t:[o,...t.filter((l)=>l!==o)];try{for(let l of r){let[a]=await tt.#i(l.sealedMaster,s.prf);if(a!==void 0)return m({enclave:a,credId:s.credId.slice()})}return c(20)}finally{s.prf.fill(0)}}async sealWithIkm(t){try{return await this.#s(t)}finally{t.fill(0)}}static async unsealWithIkm(t,e){try{return await tt.#i(t,e)}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){let n=e?.credId;if(n===void 0){let[o,r]=await Ro(e);if(r!==0)return c(r);if(o===void 0)return c(30);n=o}let[s,i]=this.#o(t);if(i!==0)return c(i);if(s===void 0)return c(12);try{let o=await ko(n,s,e);if(o!==0)return c(o);return m(n)}finally{s.fill(0)}}static async fromLargeBlob(t){let[e,n]=await Co(t?.credId,t);if(n!==0)return c(n);if(e===void 0)return c(7);try{let[s,i]=Yo(e.blob);if(i!==0)return c(i);if(s===void 0)return c(12);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static async clearLargeBlob(t,e){return ko(t,new Uint8Array(yt),e)}static fromPairPlain(t){return Yo(t)}static pairRequest(){return Be.create()}async pairAccept(t,e){let n;try{n=await rt.genX25519()}catch{return c(29)}try{let[s,i]=await vs(n.priv,t,t,n.pub);if(i!==0)return c(i);if(s===void 0)return c(12);try{let[o,r]=this.#o(e);if(r!==0)return c(r);if(o===void 0)return c(12);try{let l=await rt.encryptXSalsa20Poly1305Combined(o,s);return Fs(Zt(n.pub,l))}catch{return c(12)}finally{o.fill(0)}}finally{s.fill(0)}}finally{n.priv.fill(0)}}spawnSyncWorker(t){let e=To(),n=this.#t.slice();return Ho(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}deriveCipher(t,e){let n=t.slice(),s=(r)=>this.#c(n,r),i=(r)=>this.#a(n,r);return{encrypt:Object.freeze({encrypt:s}),decrypt:Object.freeze({decrypt:i}),both:Object.freeze({encrypt:s,decrypt:i})}[e]}async deriveIdentity(t,e=0){let n=t,s=e,i=await this.#l(n,s),o=i.publicKey;return i.privateKey.fill(0),Object.freeze({publicKey:o,sign:(r)=>this.#u(n,s,r),kdmFor:(r)=>this.#p(n,s,r)})}async#e(t){let e=new Uint8Array(this.#t.byteLength+_s.byteLength+t.byteLength);e.set(this.#t,0),e.set(_s,this.#t.byteLength),e.set(t,this.#t.byteLength+_s.byteLength);try{return await rt.blake3(e)}finally{e.fill(0)}}async#n(t,e){if(e.byteLength!==vl)return!1;let n=await this.#e(t);try{if(n.byteLength!==e.byteLength)return!1;let s=0;for(let i=0;i<n.byteLength;i++){let o=n[i],r=e[i];if(o===void 0||r===void 0)return!1;s|=o^r}return s===0}finally{n.fill(0)}}async#s(t){let[e,n]=await Mo(rt,t);if(n!==0)return c(n);if(e===void 0)return c(12);try{let s=await rt.encryptXSalsa20Poly1305Combined(this.#t,e);return Pt(s)}catch{return c(12)}finally{e.fill(0)}}static async#i(t,e){let[,n]=Pt(t);if(n!==0)return c(n);let[s,i]=await Mo(rt,e);if(i!==0)return c(i);if(s===void 0)return c(12);let o;try{try{o=await rt.decryptXSalsa20Poly1305Combined(t,s)}catch{return c(20)}return tt.fromBytes(o)}finally{s.fill(0),o?.fill(0)}}#o(t){let e=new U,n=e.writeStruct(zs,{hosts:jl(t)});if(n!==0)return c(n);let s=e.result(),i=new Uint8Array(yt+s.byteLength);return i.set(this.#t,0),i.set(s,yt),[i,0]}async#c(t,e){let n=await this.#r(t);try{return await rt.encryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#a(t,e){let n=await this.#r(t);try{return await rt.decryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#r(t){let e=new Uint8Array(this.#t.byteLength+t.byteLength);e.set(this.#t,0),e.set(t,this.#t.byteLength);try{return await rt.blake3(e)}finally{e.fill(0)}}async#d(t,e){let n=new TextEncoder().encode(t),s=new Uint8Array(8);return new DataView(s.buffer).setBigUint64(0,BigInt(e),!1),await this.#r(Zt(n,s))}async#l(t,e){let n=await this.#d(t,e);try{return await rt.deriveEd25519KeyPair(n)}finally{n.fill(0)}}async#u(t,e,n){let s=await this.#l(t,e);try{return await rt.signEd25519(n,s.privateKey)}finally{s.privateKey.fill(0)}}async#p(t,e,n){let s=await this.#l(t,e),i=Zt(s.privateKey,n);s.privateKey.fill(0);try{return(await rt.blake3(i)).slice(0,kt)}finally{i.fill(0)}}}async function Mo(t,e,n=Fl){if(e.byteLength<Dl)return c(10);let s=await t.blake3(Zt(e,n));return m(s.slice(0,Ql))}var $l=new Set(["constructor","prototype","length","name"]);function Uo(t){for(let e of Object.getOwnPropertyNames(t)){if($l.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})}}Uo(tt);Uo(tt.prototype);var Bo=8;class kn{#t;#e;#n;#s;#i;constructor(t){if(this.#i=t.persistKeyring,this.#n={rpId:t.rpId,rpName:t.rpName},this.#s=t.userName??t.rpId??t.rpName??Je,t.keyring!==void 0)this.#e=Tt(t.keyring)}get keyring(){return this.#e===void 0?void 0:Tt(this.#e)}list(){if(this.#e===void 0)return[];return this.#e.entries.map(nc)}async save(t,e){if(e?.persist===!0)return Promise.reject(Error("prf-store: use bindAndSave(enclave) to persist a binding"));return this.#t=t,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>=Bo)return c(26);let o=wo(e?.nick),r=e?.excludeCredentials??(i?void 0:zo(n)),l=e?.salt??n?.salt,a=n===void 0?void 0:n.entries.map((Z)=>({credId:Z.credId,tag:Z.tag})),[d,u]=await t.bind({...this.#n,salt:l,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!i,excludeCredentials:r,userName:this.#s,displayName:o??this.#n.rpName??this.#s,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},a);if(u!==0)return c(u);if(d===void 0)return c(12);let p=Date.now(),h={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:tc()},y=n===void 0?{salt:d.salt.slice(),entries:[]}:Tt(n);return this.#e=sc(y,h),this.#t=t,await this.#i(Tt(this.#e)),m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0||t.entries.length===0)return c(22);let[e,n]=await tt.unsealWithPasskey(t.entries.map((i)=>({sealedMaster:i.sealedMaster,credId:i.credId})),{...this.#n,salt:t.salt});if(n!==0)return c(n);this.#t=e.enclave;let s=ic(t,e.credId);if(s!==void 0)this.#e=s,await this.#i(Tt(s));return m(e.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return c(22);let s=n.entries.findIndex((a)=>B(a.credId,t));if(s<0)return c(13);let i=n.entries.map(Ne),o=i[s];if(o===void 0)return c(13);let r=wo(e);i[s]={...o,nick:r};let l={salt:n.salt.slice(),entries:i};return this.#e=l,await this.#i(Tt(l)),m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return c(22);let n=e.entries.filter((i)=>!B(i.credId,t));if(n.length===e.entries.length)return c(13);if(n.length===0)return this.#e=void 0,await this.#i(void 0),m(void 0);let s={salt:e.salt.slice(),entries:n.map(Ne)};return this.#e=s,await this.#i(Tt(s)),m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,await this.#i(void 0)}}function wo(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function tc(){if(typeof navigator>"u")return;return Ko(navigator.userAgent)}function Ne(t){let[e,n]=Pt(t.sealedMaster.slice());return{type:"prf",sealedMaster:n===0&&e!==void 0?e:t.sealedMaster,credId:t.credId.slice(),tag:t.tag.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 Tt(t){return{salt:t.salt.slice(),entries:t.entries.map(Ne)}}function Jo(t){return t!==null&&typeof t==="object"}function ec(t){if(!Jo(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||t.tag.byteLength!==32||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=Pt(t.sealedMaster);if(n!==0||e===void 0)return;let s=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,i=t.enrolledOs,o=i==="ios"||i==="macos"||i==="android"||i==="windows"||i==="linux"||i==="other"?i:void 0,r=Array.isArray(t.transports)?t.transports.filter((l)=>typeof l==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:t.tag.slice(),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:s,transports:r===void 0||r.length===0?void 0:r,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:o}}function No(t){if(!Jo(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=ec(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function nc(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 zo(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function sc(t,e){let n=t.entries.map(Ne),s=n.findIndex((i)=>B(i.credId,e.credId));if(s>=0){let i=n[s];n[s]={...e,enrolledAt:i?.enrolledAt??e.enrolledAt,nick:e.nick??i?.nick}}else n.push(e);return{salt:t.salt.slice(),entries:n}}function ic(t,e){if(e.byteLength===0)return;let n=t.entries.findIndex((o)=>B(o.credId,e));if(n<0)return;let s=t.entries.map(Ne),i=s[n];if(i===void 0)return;return s[n]={...i,lastUsedAt:Date.now()},{salt:t.salt.slice(),entries:s}}var oc=Ln("fbfc3007154e4ecc8c0b6e020557d7bd"),rc=Ln("ea9b8d664d011d213ce4b6b48cb575d4"),lc=Ln("08987058cadc4b81b6e130de50dcbe96"),cc=Ln("2fc0579f811347eab116bb5a8db9202a");function Ln(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 ac(t){if(t===void 0||t.byteLength!==16)return;if(B(t,oc))return"Apple Passkey";if(B(t,rc))return"GPM";if(B(t,lc))return"Windows Hello";if(B(t,cc))return"YubiKey";return}function dc(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 Eo(t){let e=ac(t.aaguid);if(e!==void 0)return e;if(dc(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 uc(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 pc(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=Eo(t),n=uc(t.credId);return n===""?e:`${e} ${n}`}var mc="diplomatic.pin/";function hc(t){return mc+at(t)}async function Fo(t,e,n){let s=await e.deriveIdentity(hc(n),0);return t.blake3(s.publicKey)}async function Mn(t,e){let n=await t.gen256BitSecureRandomSeed(),s=await Fo(t,e,n);return{n,h:s}}async function Pn(t,e,n){let s=await Fo(t,e,n.n);return yc(s,n.h)}function vo(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||e.h.byteLength<1)return;return{n:e.n.slice(),h:e.h.slice()}}function Un(t){return{n:t.n.slice(),h:t.h.slice()}}function yc(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}var wn="keyring",Qo="prfMeta",ei="idPin",Do="idPub";class Bn{#t;db;#e;constructor(t,e){this.db=t,this.#e=e}async save(t,e){return await this.#n(t),this.#t=t,this.#t}async load(){return this.#t}async clearSession(){this.#t=void 0}async wipe(){this.#t=void 0;let t=this.db.transaction(lt,"readwrite"),e=t.objectStore(lt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.delete(wn),e.delete(Qo),e.delete(ei),e.delete(Do)})}async loadKeyring(){let e=this.db.transaction(lt,"readonly").objectStore(lt);return new Promise((n,s)=>{let i=e.get(wn);i.onsuccess=()=>{n(No(i.result))},i.onerror=()=>s(i.error)})}async persistKeyring(t){let e=this.db.transaction(lt,"readwrite"),n=e.objectStore(lt);return new Promise((s,i)=>{if(e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(Qo),t===void 0){n.delete(wn);return}n.put(Tt(t),wn)})}async hasKeyring(){let t=await this.loadKeyring();return t!==void 0&&t.entries.length>0}async openPrfStore(t){let e=await this.loadKeyring();return new kn({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:e,persistKeyring:(n)=>this.persistKeyring(n)})}async#n(t){await this.#o(Do);let e=await this.#s();if(e!==void 0){if(!await Pn(this.#e,t,e))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)");return}let n=await Mn(this.#e,t);await this.#i(n)}#s(){let e=this.db.transaction(lt,"readonly").objectStore(lt);return new Promise((n,s)=>{let i=e.get(ei);i.onsuccess=()=>n(vo(i.result)),i.onerror=()=>s(i.error)})}#i(t){let e=Un(t),n=this.db.transaction(lt,"readwrite"),s=n.objectStore(lt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e,ei)})}#o(t){let e=this.db.transaction(lt,"readwrite"),n=e.objectStore(lt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}}class ni{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(mt,"readwrite"),i=s.objectStore(mt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=at(l);i.put({host:t,hash:a})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(mt,"readwrite"),i=s.objectStore(mt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=at(l);i.delete([t,a])}})}async list(t){let n=this.db.transaction(mt,"readonly").objectStore(mt);return new Promise((s,i)=>{let o=n.getAll();o.onsuccess=()=>{let l=o.result.filter((a)=>a.host===t).map((a)=>a.hash);s(l.map((a)=>Ve(a)))},o.onerror=()=>i(o.error)})}async count(){let e=this.db.transaction(mt,"readonly").objectStore(mt);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(mt,"readwrite"),e=t.objectStore(mt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var lt="seedMeta",ot="hosts",mt="uploadQueue",pt="downloadQueue",v="messages",Ue="apld",Oo=3,jo="diplomatic-store-db";class si{seed;hosts;uploads;downloads;messages;db;constructor(t,e){this.db=t,this.seed=new Bn(t,e),this.hosts=new Js(t),this.uploads=new ni(t),this.downloads=new Bs(t),this.messages=new Ns(t,e)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function bc(){return new Promise((t,e)=>{let n=indexedDB.open(jo,Oo);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!s.objectStoreNames.contains(lt))s.createObjectStore(lt);if(!s.objectStoreNames.contains(ot))s.createObjectStore(ot,{keyPath:"label"});if(!s.objectStoreNames.contains(mt))s.createObjectStore(mt,{keyPath:["host","hash"]});if(!s.objectStoreNames.contains(pt))s.createObjectStore(pt);let o;if(!s.objectStoreNames.contains(v))o=s.createObjectStore(v);else{if(!i)throw Error("missing upgrade transaction for messages store");o=i.objectStore(v)}if(!o.indexNames.contains(Ue))o.createIndex(Ue,"apld",{unique:!1})},n.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${jo} → v${Oo}); waiting for other connections to close`)},n.onsuccess=()=>{let s=n.result;s.onversionchange=()=>{s.close()},t(s)},n.onerror=()=>e(n.error??Error("protocol store IndexedDB open failed"))})}async function ii(t){let e=await bc();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((n)=>{setTimeout(()=>n(!1),2000)})])}catch{}return new si(e,t)}function Ao(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function qo(t){if(typeof t!=="number")return;return t}function Zc(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=Gc(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 Gc(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 _o(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=Zc(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var ht="[DIPLOMATIC]";class Ee{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:Et};clientState;xferState;constructor(t,e,n,s,i){this.state=t,this.store=e,this.readyTimeoutMs=i,this.clientState=new bt(async()=>this.cachedClientState),this.xferState=new bt(async()=>this.cachedXferState),this.scheduledSync=new Ye(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(o){console.error(`${ht} worker sync after local write failed`,o)}}),this.local=new he(n,t,e,()=>{throw Error(`${ht} local writer has no transport (use worker for network)`)},Ge,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),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(`${ht} worker error`,n),this.failPending(Error(`${ht} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${ht} 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 Mt,i=n.syncDebounceMs??cn,o=n.readyTimeoutMs??15000,r=new Ee(t,e,s,i,o);return await r.hydrateStateFromStore(e),r}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:Et}}async loadSession(t){let e=await this.store.seed.load(),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=_o(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${ht} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${ht} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${ht} worker terminated`))}onMessage(t){if(!Ao(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${ht} 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":{this.state.refresh(e.eids.map(fc));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 ze(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=qo(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof ze)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){await this.local.setSeed(t,e),await this.loadSession(!1),this.clientState.emit();let n=this.allocId(),s=this.readyTimeoutMs;await new Promise((i,o)=>{let r=void 0,l=(a)=>{if(r!==void 0)clearTimeout(r);a()};this.pending.set(n,{resolve:(a)=>l(()=>i(a)),reject:(a)=>l(()=>o(a))}),r=setTimeout(()=>{this.pending.delete(n),o(Error(`${ht} setSeed worker timeout after ${s}ms`))},s);try{let a=t.spawnSyncWorker({id:n,persist:e?.persist});this.bindWorker(a)}catch(a){if(this.pending.delete(n),r!==void 0)clearTimeout(r);o(a instanceof Error?a:Error(String(a)))}});try{await this.pullRemoteXfer()}catch{}}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){return this.local.insertRaw(t)}async updateRaw(t,e,n){return this.local.updateRaw(t,e,n)}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(!Xc(n))return c(12);return m(n)}catch(n){if(n instanceof ze&&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(`${ht} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${ht} entcheck: expected Uint8Array`);return t}async wipe(t){if(await this.local.wipe(t),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});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 dn(s,t),0}catch(n){if(n instanceof ze)return n.status;return 12}}}class ze extends Error{status;constructor(t){super(`WorkerReplyError: ${g[t]}`);this.status=t;this.name="WorkerReplyError"}}function Xc(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 fc(t){return t}var fe="[DIPLOMATIC]";async function Jn(t){let e=t.clock??new Mt;if(t.worker===!0&&Ic(t)!==void 0)throw Error(`${fe} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${fe} sync on main thread `+"(no worker — app did not request a worker)");let i=await $o(t.store);return Sc(e,t.state,i)}if(typeof Worker>"u")throw Error(`${fe} worker: true but Worker API is unavailable`);let n=await $o(void 0),s=await Ee.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${fe} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${fe} terminating sync worker`),s.terminate()}}}function Ic(t){if("store"in t)return t.store;return}async function Sc(t,e,n){let s=new he(t,e,n,ns,Ge);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function $o(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${fe} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return ii(Ge)}function Wc(t){let[e,n]=oi();return Nn(()=>{async function s(){let o=await t.clientState.get();n(o)}let i=t.clientState.listen(s);return s(),()=>{i()}},[t]),e}function Vc(t){let[e,n]=oi();return Nn(()=>{async function s(){let o=await t.xferState.get();n(o)}let i=t.xferState.listen(s);return s(),()=>{i()}},[t]),e}function gc(t){Nn(()=>{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 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 Kc(t={}){let e=t.clock??new Mt,{seed:n,host:s,readyTimeoutMs:i}=t,o=t.worker===!0,r="store"in t?t.store:void 0,[l,a]=oi({stateMgr:rs});return Nn(()=>{let d=!1,u;return(async()=>{let p=await hs();if(d)return;let h=rn(p),y=o?await Jn({state:h,clock:e,worker:!0,readyTimeoutMs:i}):await Jn({state:h,clock:e,store:r,readyTimeoutMs:i});if(d){y.dispose();return}u=y.dispose;let{client:Z,mode:b}=y;if(n)await Z.setSeed(n);if(s)await Z.link(s);if(d){u();return}a({client:Z,entDB:p,stateMgr:h,mode:b,error:void 0})})().catch((p)=>{let h=p instanceof Error?p:Error(String(p));if(console.error("[DIPLOMATIC] useClient init failed",h),!d)a((y)=>({...y,client:void 0,error:h}))}),()=>{d=!0,u?.()}},[e,n,s,o,r,i]),l}import{use as xc,useEffect as tr,useRef as Rc,useState as Cc}from"react";function er(t,e,n){let[s,i]=Cc();return tr(()=>{async function o(){let r=await n();i(r)}return o(),t.on(e,o),()=>{t.off(e,o)}},[t,e,n]),s}function Tc(t,e,n){let s=Rc(n());return tr(()=>{async function i(){s.current=n()}return t.on(e,i),()=>{t.off(e,i)}},[t,e,n]),xc(s.current)}function nr(t,e){return`${t}:${e}`}class ri{queue=new Map;async enq(t){for(let e of t){let n=nr(e.host,e.seq);this.queue.set(n,e)}}async deq(t,e){for(let n of e){let s=nr(t,n);this.queue.delete(s)}}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()}}function Hc(t,e){if(e.setLastSeq!==void 0)t.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0&&e.lastSeq>t.lastSeq)t.lastSeq=e.lastSeq}class li{hosts=new Map;async add(t){let e=this.hosts.get(t.label),n=e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0),s={...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0};this.hosts.set(t.label,s)}async touch(t,e){await this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.hosts.get(t);if(!n)return;Hc(n,e),this.hosts.set(t,{...n})}async get(t){return this.hosts.get(t)}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)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class ci{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(R(n),s),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(R(e))}async get(t){let e=this.messages.get(R(t));if(e)return await wt(t,e,this.crypto);return}async has(t){return this.messages.has(R(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[i,o]of this.messages){if(e!==void 0&&me(o.apld)!==e)continue;let r=et(i);s.push(await wt(r,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(me(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(et(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(B(t,s.eid)===!1)continue;let i=et(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 wt(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(R(e));if(!n)continue;Ft(n,Ut)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(R(e));if(!s)continue;Ft(s,Gt,n)}}async wipe(){this.messages.clear()}}class ai{#t;#e;#n;constructor(t){this.#e=t}async save(t,e){if(this.#n!==void 0){if(!await Pn(this.#e,t,this.#n))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)")}else this.#n=await Mn(this.#e,t);return this.#t=t,this.#t}async load(){return this.#t}async wipe(){this.#t=void 0,this.#n=void 0}peekPin(){return this.#n===void 0?void 0:Un(this.#n)}}class di{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(at(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(at(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(Ve(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 sr{seed;hosts=new li;uploads=new di;downloads=new ri;messages;constructor(t){this.seed=new ai(t),this.messages=new ci(t)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class ir{singletonType;latest;latestOff=-1;emitter=new Ht;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new M(e.eid),[s,i]=n.readStruct(A);if(i!==0)continue;let o=new U;o.writeVarString(this.singletonType);let r=o.result();if(s.id.length===r.length&&s.id.every((l,a)=>l===r[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)}}class or{#t;#e;#n;#s;constructor(t){if(this.#n=t.rpId,this.#s=t.rpName,t.credId!==void 0)this.#e=t.credId.slice()}get credId(){if(this.#e===void 0)return;return this.#e.slice()}setCredId(t){this.#e=t===void 0?void 0:t.slice()}async save(t,e){if(e?.persist!==!0)return this.#t=t,this.#t;let[n,s]=await t.persistToLargeBlob([],{rpId:this.#n,rpName:this.#s,credId:this.#e});if(s!==0||n===void 0)return Promise.reject(Error(`persistToLargeBlob status ${s}`));return this.#e=n,this.#t=t,this.#t}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0)return c(22);let[e,n]=await tt.fromLargeBlob({rpId:this.#n,rpName:this.#s,credId:t});if(n!==0||e===void 0)return c(n);return this.#t=e.enclave,m(e.enclave)}async wipe(){let t=this.#e;if(t!==void 0){let e=await tt.clearLargeBlob(t,{rpId:this.#n});if(e!==0)return Promise.reject(Error(`clearLargeBlob status ${e}`))}this.#t=void 0,this.#e=void 0}}export{Ut as APLD_APPLIED,Gt as APLD_ERROR,Wt as APLD_PENDING,He as CachedEntDB,Mt as Clock,Cn as DEFAULT_PRF_SALT,M as Decoder,tt as Enclave,U as Encoder,on as EntDBMemory,us as EntIDB,es as HTTPTransport,Bn as IDBSeedStore,si as IDBStore,Bo as KEYRING_MAX,yt as MASTER_SEED_LEN,sr as MemoryStore,Be as PairRequest,or as PasskeySeedStore,kn as PrfSeedStore,os as SEALED_MASTER_KEY_LEN,ir as SingletonStateManager,xe as StateManager,g as Status,he as SyncClient,Ht as TypedEventEmitter,Ee as WorkerClient,me as apldFromStored,Es as asDHKEReq,Fs as asDHKEResp,Pt as asSealedMasterKey,et as b64tob,On as b64urltob,R as btob64,kr as btob64url,at as btoh,Ke as checksumEntRevs,le as checksumSet,Yi as cmpBytes,Ge as crypto,pe as defaultPeekProgressEvery,go as defaultWebAuthnRpId,A as eidCodec,ki as encodeEntRev,rn as entStateManager,Yr as genSingletonEID,ns as hostHTTPTransport,Ve as htob,Et as idleProgress,sl as isApldState,F as isLiveEnt,il as isPendingApply,Zs as isTerminalApplyFailure,_r as isTombstone,zo as keyringCredIds,Eo as keyringKind,pc as keyringLabel,Jl as largeBlobCapable,Ji as normalizeTags,el as nullEntDB,rs as nullStateManager,Jn as openDiplomaticClient,hs as openEntDB,ii as openIDBStore,Nl as prfCapable,Te as revFromEntity,ys as revFromHead,Ft as setApld,an as shouldEmitItemProgress,Kc as useClient,Wc as useClientState,Vc as useClientXferState,er as useStateWatcher,Tc as useStateWatcherSuspense,gc as useSyncOnResume,Ul as webAuthnLastError};
|
|
1
|
+
function di(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 o=t.charCodeAt(s);if((o&64512)===56320)++s,i=((i&1023)<<10)+(o&1023)+65536}}if((i&4294901760)===0)n+=3;else n+=4}}return n}function rr(t,e,n){let s=t.length,i=n,o=0;while(o<s){let r=t.charCodeAt(o++);if((r&4294967168)===0){e[i++]=r;continue}else if((r&4294965248)===0)e[i++]=r>>6&31|192;else{if(r>=55296&&r<=56319){if(o<s){let l=t.charCodeAt(o);if((l&64512)===56320)++o,r=((r&1023)<<10)+(l&1023)+65536}}if((r&4294901760)===0)e[i++]=r>>12&15|224,e[i++]=r>>6&63|128;else e[i++]=r>>18&7|240,e[i++]=r>>12&63|128,e[i++]=r>>6&63|128}e[i++]=r&63|128}}var lr=new TextEncoder,cr=50;function ar(t,e,n){lr.encodeInto(t,e.subarray(n))}function ui(t,e,n){if(t.length>cr)ar(t,e,n);else rr(t,e,n)}var dr=4096;function Nn(t,e,n){let s=e,i=s+n,o=[],r="";while(s<i){let l=t[s++];if((l&128)===0)o.push(l);else if((l&224)===192){let a=t[s++]&63;o.push((l&31)<<6|a)}else if((l&240)===224){let a=t[s++]&63,d=t[s++]&63;o.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,o.push(p>>>10&1023|55296),p=56320|p&1023;o.push(p)}else o.push(l);if(o.length>=dr)r+=String.fromCharCode(...o),o.length=0}if(o.length>0)r+=String.fromCharCode(...o);return r}var ur=new TextDecoder,pr=200;function mr(t,e,n){let s=t.subarray(e,e+n);return ur.decode(s)}function pi(t,e,n){if(n>pr)return mr(t,e,n);else return Nn(t,e,n)}class ne{type;data;constructor(t,e){this.type=t,this.data=e}}class st extends Error{constructor(t){super(t);let e=Object.create(st.prototype);Object.setPrototypeOf(this,e),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:st.name})}}var se=4294967295;function mi(t,e,n){let s=n/4294967296,i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function Fe(t,e,n){let s=Math.floor(n/4294967296),i=n;t.setUint32(e,s),t.setUint32(e+4,i)}function ve(t,e){let n=t.getInt32(e),s=t.getUint32(e+4);return n*4294967296+s}function hi(t,e){let n=t.getUint32(e),s=t.getUint32(e+4);return n*4294967296+s}var hr=-1,yr=4294967295,br=17179869183;function Zr({sec:t,nsec:e}){if(t>=0&&e>=0&&t<=br)if(e===0&&t<=yr){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),o=new DataView(i.buffer);return o.setUint32(0,e<<2|n&3),o.setUint32(4,s),i}else{let n=new Uint8Array(12),s=new DataView(n.buffer);return s.setUint32(0,e),Fe(s,4,t),n}}function Gr(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 Xr(t){if(t instanceof Date){let e=Gr(t);return Zr(e)}else return null}function fr(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,o=n>>>2;return{sec:i,nsec:o}}case 12:{let n=ve(e,4),s=e.getUint32(0);return{sec:n,nsec:s}}default:throw new st(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${t.length}`)}}function Ir(t){let e=fr(t);return new Date(e.sec*1000+e.nsec/1e6)}var yi={type:hr,encode:Xr,decode:Ir};class ie{static defaultCodec=new ie;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(yi)}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 o=-1-n;return new ne(o,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 ne(n,i)}}if(t instanceof ne)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 ne(e,t)}}function Vr(t){return t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer}function Ie(t){if(t instanceof Uint8Array)return t;else if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength);else if(Vr(t))return new Uint8Array(t);else return Uint8Array.from(t)}var Sr=100,Wr=2048;class Qe{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??ie.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.maxDepth=t?.maxDepth??Sr,this.initialBufferSize=t?.initialBufferSize??Wr,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 Qe({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=di(t);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),ui(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=Ie(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 o=t[i];if(!(this.ignoreUndefined&&o===void 0))this.encodeString(i),this.doEncode(o,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),mi(this.view,this.pos,t),this.pos+=8}writeI64(t){this.ensureBufferSizeToWrite(8),Fe(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 zt(t,e){return new Qe(e).encodeSharedRef(t)}function De(t){return`${t<0?"-":""}0x${Math.abs(t).toString(16).padStart(2,"0")}`}var gr=16,Kr=16;class En{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(t=gr,e=Kr){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 o=i.bytes;for(let r=0;r<n;r++)if(o[r]!==t[e+r])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=Nn(t,e,n),o=Uint8Array.prototype.slice.call(t,e,e+n);return this.store(o,i),i}}var Fn="array",Se="map_key",Zi="map_value",xr=(t)=>{if(typeof t==="string"||typeof t==="number")return t;throw new st("The type of key must be string or number but "+typeof t)};class Gi{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(t){let e=this.getUninitializedStateFromPool();e.type=Fn,e.position=0,e.size=t,e.array=Array(t)}pushMapState(t){let e=this.getUninitializedStateFromPool();e.type=Se,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===Fn){let n=t;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(t.type===Se||t.type===Zi){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 Ve=-1,vn=new DataView(new ArrayBuffer(0)),Rr=new Uint8Array(vn.buffer);try{vn.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 bi=RangeError("Insufficient data"),Tr=new En;class Oe{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=vn;bytes=Rr;headByte=Ve;stack=new Gi;entered=!1;constructor(t){this.extensionCodec=t?.extensionCodec??ie.defaultCodec,this.context=t?.context,this.useBigInt64=t?.useBigInt64??!1,this.rawStrings=t?.rawStrings??!1,this.maxStrLength=t?.maxStrLength??se,this.maxBinLength=t?.maxBinLength??se,this.maxArrayLength=t?.maxArrayLength??se,this.maxMapLength=t?.maxMapLength??se,this.maxExtLength=t?.maxExtLength??se,this.keyDecoder=t?.keyDecoder!==void 0?t.keyDecoder:Tr,this.mapKeyConverter=t?.mapKeyConverter??xr}clone(){return new Oe({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=Ve,this.stack.reset()}setBuffer(t){let e=Ie(t);this.bytes=e,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.pos=0}appendBuffer(t){if(this.headByte===Ve&&!this.hasRemaining(1))this.setBuffer(t);else{let e=this.bytes.subarray(this.pos),n=Ie(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 r of t){if(e)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(r);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:o}=this;throw RangeError(`Insufficient data in parsing ${De(s)} at ${o} (${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(o){if(!(o instanceof RangeError))throw o}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 st(`Unrecognized type byte: ${De(t)}`);this.complete();let n=this.stack;while(n.length>0){let s=n.top();if(s.type===Fn)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===Se){if(e==="__proto__")throw new st("The key __proto__ is not allowed");s.key=this.mapKeyConverter(e),s.type=Zi;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=Se;continue t}}return e}}readHeadByte(){if(this.headByte===Ve)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=Ve}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 st(`Unrecognized array type byte: ${De(t)}`)}}pushMapState(t){if(t>this.maxMapLength)throw new st(`Max length exceeded: map length (${t}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(t)}pushArrayState(t){if(t>this.maxArrayLength)throw new st(`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 st(`Max length exceeded: UTF-8 byte length (${t}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+e+t)throw bi;let n=this.pos+e,s;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(t))s=this.keyDecoder.decode(this.bytes,n,t);else s=pi(this.bytes,n,t);return this.pos+=e+t,s}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===Se;return!1}decodeBinary(t,e){if(t>this.maxBinLength)throw new st(`Max length exceeded: bin length (${t}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(t+e))throw bi;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 st(`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=hi(this.view,this.pos);return this.pos+=8,t}readI64(){let t=ve(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 Qn(t,e){return new Oe(e).decode(t)}class Ht{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 bt{getter;static eventName="update";emitter;constructor(t){this.getter=t;this.emitter=new Ht}get=()=>this.getter();async emit(){let t=await this.getter();queueMicrotask(()=>this.emitter.emit(bt.eventName,t))}listen(t){return this.emitter.addEventListener(bt.eventName,t),()=>{this.emitter.removeEventListener(bt.eventName,t)}}}var Yt=64;var Xi=32,kt=8;var je=32;var fi=30000,Ii=512,g;((I)=>{I[I.Success=0]="Success";I[I.InvalidSignature=3]="InvalidSignature";I[I.ClockOutOfSync=4]="ClockOutOfSync";I[I.UserNotRegistered=5]="UserNotRegistered";I[I.ServerMisconfigured=6]="ServerMisconfigured";I[I.MissingBody=7]="MissingBody";I[I.ExtraBodyContent=8]="ExtraBodyContent";I[I.MissingParam=9]="MissingParam";I[I.InvalidParam=10]="InvalidParam";I[I.InvalidRequest=11]="InvalidRequest";I[I.InternalError=12]="InternalError";I[I.NotFound=13]="NotFound";I[I.InvalidMessage=14]="InvalidMessage";I[I.NoChange=15]="NoChange";I[I.DatabaseClosed=16]="DatabaseClosed";I[I.StorageError=17]="StorageError";I[I.DatabaseError=18]="DatabaseError";I[I.HashMismatch=19]="HashMismatch";I[I.DecryptionError=20]="DecryptionError";I[I.NotImplemented=21]="NotImplemented";I[I.MissingSeed=22]="MissingSeed";I[I.OutOfBounds=23]="OutOfBounds";I[I.HostError=24]="HostError";I[I.CommunicationError=25]="CommunicationError";I[I.VarLimitExceeded=26]="VarLimitExceeded";I[I.InvalidResponse=27]="InvalidResponse";I[I.ConnectionClosed=28]="ConnectionClosed";I[I.CryptoError=29]="CryptoError";I[I.WebAuthnError=30]="WebAuthnError"})(g||={});function m(t){return[t,0]}function c(t){return[void 0,t]}function Cr(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 Hr(t,e=0){let n=0n,s=0,i=e;while(!0){if(i>=t.length)return c(14);let o=t[i++];if(o===void 0)return c(14);if(n|=BigInt(o&127)<<BigInt(s),(o&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 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 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]=Hr(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 w{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]=Cr(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}}async function Dn(t,e){let n=new w,s=n.writeDate(e);if(s!==0)return c(s);let i=n.result(),o=await t.sign(i);return m({pubKey:t.publicKey,sig:o,timestamp:e})}async function Lt(t,e,n){let s=n.now().getTime(),i=t.timestamp.getTime();if(Math.abs(s-i)>fi)return 4;let r=new w;r.writeDate(t.timestamp);let l=r.result();if(!await e.checkSigEd25519(t.sig,l,t.pubKey))return 3;return 0}var A={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 oe(t){let e=new w,n=e.writeStruct(A,t);if(n!==0)return c(n);let s=e.result();return m(s)}async function Yr(t){return oe({id:t,ts:new Date(0)})}var ut={encode(t,e){let n=t.writeVarBytes(e.eid);if(n!==0)return n;let s=t.writeVarInt(e.off);if(s!==0)return s;let i=t.writeVarInt(e.ctr);if(i!==0)return i;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.readVarBytes();if(n!==0)return c(n);let s=new M(e),[,i]=A.decode(s);if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let[l,a]=t.readVarInt();if(a!==0)return c(a);let[d,u]=t.readVarInt();if(u!==0)return c(u);let p;if(d>0){let[h,y]=t.readBytes(je);if(y!==0)return c(y);p=h}return m({eid:e,off:o,ctr:l,len:d,hsh:p})}};function at(t){return Array.from(t).map((n)=>n.toString(16).padStart(2,"0")).join("")}function We(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 B(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;return t.every((n,s)=>n===e[s])}var R;if(typeof Uint8Array.prototype.toBase64==="function")R=(t)=>t.toBase64();else R=(t)=>btoa(String.fromCharCode(...t));var et;if(typeof Uint8Array.fromBase64==="function")et=(t)=>Uint8Array.fromBase64(t);else et=(t)=>Uint8Array.from(atob(t),(e)=>e.charCodeAt(0));function kr(t){return R(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function On(t){let e=t.length%4===0?"":"=".repeat(4-t.length%4),n=t.replace(/-/g,"+").replace(/_/g,"/")+e;return et(n)}function Zt(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}function Vi(t,e,n){return n.checkSigEd25519(t.sig,t.headCph,e)}async function Si(t,e,n,s){let i;if(t.bod&&t.len>0)i=await n.blake3(t.bod);let o=new w,r=ut.encode(o,{...t,hsh:i});if(r!==0)return c(r);let l=o.result(),a=await e.kdmFor(l),d=s.deriveCipher(a,"encrypt"),u=await d.encrypt(l),p=t.bod?await d.encrypt(t.bod):new Uint8Array(0),h=await e.sign(u);return m({sig:h,kdm:a,headCph:u,bodyCph:p})}async function jn(t,e,n,s,i){let o=new M(t),[r,l]=ut.decode(o);if(l!==0)return c(14);let a;try{a=e&&e.length>0?await n.decrypt(e):void 0}catch{return c(20)}let d=r.hsh&&a===void 0,u=r.hsh===void 0&&a!==void 0;if(d||u)return c(19);if(r.hsh&&a){let h=await s.blake3(a);if(!B(h,r.hsh))return c(19)}let p=i??await s.blake3(t);return m({msgHead:r,bod:a,headHash:p})}class Mt{now(){return new Date}}function Wi(t,e,n,s){let i=e.getTime()-t.getTime(),o=n.getTime()-s.getTime();return(i+o)/2}var ge={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,o]=t.readVarInt();if(o!==0)return c(o);s=i}return m({quota:e,usage:s})}};var An={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 o=t.writeVarInt(e.subscription.elapsed);if(o!==0)return o;let r=t.writeStruct(ge,e.subscription.stat);if(r!==0)return r;let l=t.writeStruct(ge,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,o]=t.readDate();if(o!==0)return c(o);let[r,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[h,y]=t.readStruct(ge);if(y!==0)return c(y);let[Z,b]=t.readStruct(ge);if(b!==0)return c(b);return m({status:s,timeRcvd:i,timeSent:r,subscription:{term:a,elapsed:u,stat:h,dyn:Z}})}};var qn={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})}};var dt={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(Xi);if(n!==0)return c(n);let[s,i]=t.readBytes(Yt);if(i!==0)return c(i);let[o,r]=t.readDate();if(r!==0)return c(r);return m({pubKey:e,sig:s,timestamp:o})}};var gi={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;for(let r of s)i.writeVarInt(r);return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let[h,y]=e.readVarInt();if(y!==0)return y;if(!e.done())return 8;let[Z,b]=await o.listHeads(d,h);if(b!==0)return b;return n.writeStructs(qn,Z)},decodeResp(t){return t.readStructs(qn)}};var _n={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})}};var Ki={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;for(let r of s){let l=i.writeVarInt(r);if(l!==0)return l}return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r,[u,p]=await o.hasUser(d);if(p!==0)return p;if(!u)return 5;let h=[];while(!e.done()){let[b,G]=e.readVarInt();if(G!==0)return G;h.push(b)}console.info(`PULL: ${h.length} bags`);let[y,Z]=await o.getBodies(d,h);if(Z!==0)return Z;if(!y)return 17;for(let{seq:b,bodyCph:G}of y){let V={seq:b,bodyCph:G},X=n.writeStruct(_n,V);if(X!==0)return X}return 0},decodeResp(t){return t.readStructs(_n)}};var $n={encode(t,e){t.writeBytes(e.sig),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(Yt);if(n!==0)return c(n);let[s,i]=t.readBytes(kt);if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);let[l,a]=t.readVarBytes();if(a!==0)return c(a);return m({sig:e,kdm:s,headCph:o,bodyCph:l})}};var Ae={encode(t,e){let n=t.writeVarInt(e.seq);if(n!==0)return n;let s=t.writeVarBytes(e.headCph);if(s!==0)return s;let i=e.bodyCph?e.bodyCph.length:0,o=t.writeVarInt(i);if(o!==0)return o;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.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let l;if(o>0){let[a,d]=t.readBytes(o);if(d!==0)return c(d);l=a}return m({seq:e,headCph:s,bodyCph:l})}};var qe={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(Yt);if(n!==0)return c(n);let[s,i]=t.readBytes(kt);if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);return m({sig:e,kdm:s,headCph:o})}};var _e={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 o=s[0];if(o!==0)return m({idx:e,status:o});let[r,l]=t.readVarInt();if(l!==0)return c(l);return m({idx:e,status:o,seq:r})}};var xi={async encodeReq(t,e,n,s,i){let o=i.writeStruct(dt,n);if(o!==0)return o;let r=i.writeStructs($n,s);if(r!==0)return r;return 0},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o,notifier:r}=t,[l,a]=e.readStruct(dt);if(a!==0)return a;let d=await Lt(l,i,s);if(d!==0)return d;let{pubKey:u}=l,[p,h]=await o.hasUser(u);if(h!==0)return h;if(!p)return 5;let[y,Z]=e.readStructs($n);if(Z!==0)return Z;console.info(`PUSH: ${y.length} bags`);let b=[],G=[];for(let f=0;f<y.length;f++){let W=y[f];if(!await Vi(W,u,i)){let H={idx:f,status:3},k=n.writeStruct(_e,H);if(k!==0)return k;continue}b.push(f),G.push(W)}let[V,X]=await o.setBags(u,G);if(X!==0)return X;if(!V||V.length!==G.length)return 17;let S=[];for(let f=0;f<G.length;f++){let W=G[f],T=b[f],H=V[f],k=new w,Y=k.writeStruct(qe,W);if(Y!==0)return Y;let U=k.result(),N={seq:H,headCph:U};if(y.length===1&&W.bodyCph.length<=Ii)N.bodyCph=W.bodyCph;S.push(N);let z={idx:T,status:0,seq:H},I=n.writeStruct(_e,z);if(I!==0)return I}if(S.length>0){let f=new w,W=f.writeStructs(Ae,S);if(W!==0)return W;let T=f.result();await Promise.resolve(r.push(u,T))}return 0},decodeResp(t){return t.readStructs(_e)}};var Ri={async encodeReq(t,e,n,s,i){return i.writeStruct(dt,n)},async handleReq(t,e,n){let{clock:s,crypto:i,storage:o}=t,[r,l]=e.readStruct(dt);if(l!==0)return l;let a=await Lt(r,i,s);if(a!==0)return a;let{pubKey:d}=r;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)}};class ts{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 o=new w;o.writeStruct(dt,t);let r=o.result(),l=at(r);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}}var q={user:{path:"/user",endpoint:Ri,name:0},push:{path:"/push",endpoint:xi,name:2},peek:{path:"/peek",endpoint:gi,name:1},pull:{path:"/pull",endpoint:Ki,name:3}},Lr={0:q.user,2:q.push,1:q.peek,3:q.pull},wu={[q.user.path]:q.user,[q.push.path]:q.push,[q.peek.path]:q.peek,[q.pull.path]:q.pull};class es{url;listener;constructor(t){this.url=t;this.listener=new ts(t)}async call(t,e){let{path:n}=Lr[t],s=new URL(n,this.url);try{return await Mr(s,e)}catch{return c(25)}}}var ns=(t)=>new es(t.handle);async function Mr(t,e){let n=await fetch(t,{method:"POST",body:e.result().slice()});if(!n.ok)return c(24);let s=await M.fromResponse(n);return m(s)}class $e{enclave;crypto;host;clock;transport;updateHostMeta;constructor(t,e,n,s,i,o){this.enclave=t;this.crypto=e;this.host=n;this.clock=s;this.transport=i;this.updateHostMeta=o}async call(t,e){let{clock:n,transport:s}=this,{endpoint:i,name:o}=t,r=await this.identity(),l=n.now(),[a,d]=await Dn(r,l);if(d!==0)return c(d);let u=new w,p=await i.encodeReq(this,r,a,e,u);if(p!==0)return c(p);let h=n.now(),[y,Z]=await s.call(o,u),b=n.now();if(Z!==0)return c(Z);let[G,V]=y.readStruct(An);if(V!==0)return c(V);if(G.status!==0)return c(G.status);let S={clockOffset:Wi(h,G.timeRcvd,G.timeSent,b),subscription:G.subscription},f=await this.updateHostMeta(S);if(f!==0)return c(f);return i.decodeResp(y)}identity=()=>{let{host:t,enclave:e}=this;return e.deriveIdentity(t.label,t.idx??0)};seal=async(t)=>{let{crypto:e,enclave:n}=this,s=await this.identity();return Si(t,s,e,n)};register=()=>this.call(q.user,[]);peek=(t)=>this.call(q.peek,[t]);push=(t)=>this.call(q.push,t);pull=(t)=>this.call(q.pull,t);listen=async(t,e,n)=>{let{clock:s,transport:i}=this,{listener:o}=i,r=await this.identity(),l=s.now(),[a,d]=await Dn(r,l);if(d!==0)return d;return await o.connect(a,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()}}var ss={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[o,r]=t.readVarInt();if(r!==0)return c(r);let[l,a]=t.readBytes(je);if(a!==0)return c(a);let[d,u]=t.readBytes(Yt);if(u!==0)return c(u);return m({lbl:e,idx:s,num:o,hsh:l,sig:d})}};var tn={encode(t,e){let n=t.writeStruct(ss,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(ss);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarBytes();if(r!==0)return c(r);return m({head:e,indexEnc:s,bodyEnc:o})}};var is={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(kt);if(n!==0)return c(n);let[s,i]=t.readVarBytes();if(i!==0)return c(i);let[o,r]=t.readVarInt();if(r!==0)return c(r);let l;if(o>0){let[a,d]=t.readVarInt();if(d!==0)return c(d);l=a}return m({kdm:e,headCph:s,lenBody:o,offBody:l})}};var en;((Ti)=>{Ti.defaultFileExtension="dpl";async function e(i,o,r,l,a){let d=await a.deriveIdentity(i,o),u=new w,p=new w,h=0,y=0;for(let W of r){let T=new w,H=T.writeStruct(ut,W.head);if(H!==0)return c(H);let k=T.result(),Y=await d.kdmFor(k),U=a.deriveCipher(Y,"encrypt"),N=await U.encrypt(k),z=W.body?await U.encrypt(W.body):new Uint8Array(0),I=W.head.len>0&&W.head.hsh!==void 0?z.length:0,C={kdm:Y,headCph:N,lenBody:I,offBody:I>0?y:void 0},P=u.writeStruct(is,C);if(P!==0)return c(P);if(W.body)p.writeBytes(z),y+=z.length;h++}let Z=p.result(),b=u.result(),G=await l.blake3(b),V=await d.sign(G),X={lbl:i,idx:o,num:h,hsh:G,sig:V},S=new w;S.writeStruct(tn,{head:X,indexEnc:b,bodyEnc:Z});let f=S.result();return m(f)}Ti.encodeFile=e;async function n(i,o,r){let[l,a]=tn.decode(new M(i));if(a!==0)return c(a);let{head:d,indexEnc:u,bodyEnc:p}=l,h=await r.deriveIdentity(d.lbl,d.idx);if(!await o.checkSigEd25519(d.sig,d.hsh,h.publicKey))return c(3);let Z=await o.blake3(u);if(!B(Z,d.hsh))return c(19);let b=new M(u),G=[];for(let X=0;X<d.num;X++){let[S,f]=b.readStruct(is);if(f!==0)return c(f);G.push(S)}if(G.length!==d.num)return c(14);let V=[];for(let X of G){let S=r.deriveCipher(X.kdm,"decrypt"),f;try{f=await S.decrypt(X.headCph)}catch{return c(20)}let[W,T]=ut.decode(new M(f));if(T!==0)return c(T);let H;if(X.lenBody>0&&X.offBody!==void 0){if(W.hsh===void 0)return c(14);let k=p.slice(X.offBody,X.offBody+X.lenBody);try{H=await S.decrypt(k)}catch{return c(20)}let Y=await o.blake3(H);if(!B(Y,W.hsh))return c(19)}V.push({head:W,body:H})}return m(V)}Ti.decodeFile=n;async function s(i,o,r,l,a){let[d,u]=await n(i,o,r);if(u!==0)return c(u);let[p,h]=tn.decode(new M(i));if(h!==0)return c(h);return e(p.head.lbl,p.head.idx,a(d),o,l)}Ti.migrateFile=s})(en||={});async function Ci({now:t,bod:e,crypto:n}){let s=await n.genRandomBytes(8),i=new w,o=i.writeStruct(A,{id:s,ts:t});if(o!==0)return c(o);let r=i.result();return nn({now:t,eid:r,ctr:0,bod:e,crypto:n})}async function nn({now:t,eid:e,ctr:n,bod:s,crypto:i}){let o=new M(e),[r,l]=A.decode(o);if(l!==0)return c(l);let a=t.getTime()-r.ts.getTime(),d,u=s?.length??0;if(s&&u>0)d=await i.blake3(s);return m({eid:e,off:a,ctr:n,len:u,hsh:d})}function Hi(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 re(t,e){let n=Array.from(t);n.sort(Hi);let s=0;for(let r of n)s+=r.length;let i=new Uint8Array(s),o=0;for(let r of n)i.set(r,o),o+=r.length;return e.blake3(i)}function Yi(t){let e=new w,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 Ke(t,e){let n=[];for(let s of t){let[i,o]=Yi(s);if(o!==0||!i)return c(o);n.push(i)}return m(await re(n,e))}var Cp=Symbol("MasterSeed"),Hp=Symbol("SealedMasterKey"),yt=32,os=24+yt+16;function Pt(t){if(t.byteLength!==os)return c(10);return m(t)}var kp=Symbol("EntityID");function ki(t){return"type"in t}var Lp=Symbol("DerivationSeed"),Mp=Symbol("PublicKey"),Pp=Symbol("PrivateKey"),wp=Symbol("HostSpecificKeyPair"),Up=Symbol("Hash");function Pr(t){if(!t)return!1;if(typeof t!=="object")return!1;if("body"in t===!1)return!1;if("type"in t===!1)return!1;return!0}function wr(t){if(!t.bod||t.bod.length===0){let s={off:t.off,ctr:t.ctr,eid:t.eid};return m(s)}let e=Qn(t.bod);if(Pr(e)===!1)return console.warn("msg body invalid",e),c(14);let n={off:t.off,ctr:t.ctr,eid:t.eid,pid:e.pid,tags:e.tags,type:e.type,body:e.body};return m(n)}class xe{applier;emitter=new Ht;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]=wr(l);if(n.push(d),d!==0)continue;e.push(a)}let{stats:s,types:i,eids:o}=await this.applier(e),r=[];for(let l=0;l<t.length;l++){let a=n[l],d=s[l];if(a!==0){r.push(a);continue}if(d!==0){r.push(d);continue}r.push(0)}if(!this.cacheDriven)for(let l of i)this.emitter.emit(l,null);if(o.length>0)this.onDirtyEids?.(o);return r};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 rs={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){}};var D="entities",sn="entity_type_created_at",cs="entity_type_updated_at",as="entity_type_parent_id",le="entity_tags",Li="entity_type_group_id",Mi="db",Pi=14;function Ur(t){return"typ"in t}function Br(t){let e={bod:t.body,crd:t.createdAt,...t.ctr!==0?{ctr:t.ctr}:{},eid:R(t.eid),pid:t.pid?R(t.pid):void 0,tgs:t.tags,typ:t.type,upd:t.updatedAt};if(e.pid===void 0)delete e.pid;if(e.tgs===void 0)delete e.tgs;if(e.ctr===void 0)delete e.ctr;return e}function Jr(t){if(!F(t))return{eid:R(t.eid),upd:t.updatedAt,...t.ctr!==0?{ctr:t.ctr}:{}};return Br(t)}function ce(t){return{body:t.bod,createdAt:t.crd,updatedAt:t.upd,ctr:t.ctr??0,type:t.typ,eid:et(t.eid),pid:t.pid?et(t.pid):void 0,...t.tgs!==void 0?{tags:t.tgs}:{}}}function ls(t){if(Ur(t))return ce(t);return{eid:et(t.eid),updatedAt:t.upd,ctr:t.ctr??0}}function zr(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 Nr(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 Er(t,e,n){let s=[];if(typeof n==="string"){for(let r of t)if(r.typ===e)s.push(ce(r));return s}let i=new Set,o="prefix"in n?n.prefix:void 0;for(let r of t){if(r.typ!==e)continue;if(i.has(r.eid))continue;if(o!==void 0){let l=r.tgs;if(!l||!l.some((a)=>a.startsWith(o)))continue}i.add(r.eid),s.push(ce(r))}return s}class ds{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=vr().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;try{s=await this.ensureDb()}catch{return{stats:t.map(()=>16),types:e,eids:n}}let i=s.transaction(D,"readwrite"),o=i.objectStore(D);return new Promise((r)=>{let l=Array(t.length).fill(0);if(t.length<1){r({stats:[],types:e,eids:n});return}i.oncomplete=()=>{r({stats:l,types:e,eids:n})},i.onerror=()=>{for(let d=0;d<l.length;d++)if(l[d]===void 0)l[d]=18;r({stats:l,types:e,eids:n})};let a=new Map;for(let d=0;d<t.length;d++){let u=t[d],p=R(u.eid),h={op:u,index:d},y=a.get(p);if(y)y.push(h);else a.set(p,[h])}for(let[d,u]of a){if(u.length<1)continue;let p=o.get(d);p.onsuccess=()=>{let h=p.result,y=h?ls(h):void 0,Z=!1;for(let{op:b,index:G}of u){let[V,X]=ae(y,b);if(X!==0){l[G]=X;continue}if(V===void 0){l[G]=12;continue}Z=!0;for(let S of de(y,V))e.add(S);y=V}if(Z)n.push(u[0].op.eid);if(y){let b=o.put(Jr(y));b.onerror=(G)=>{G.preventDefault();for(let{index:V}of u)l[V]=18}}},p.onerror=()=>{for(let{index:h}of u)l[h]=18}}})};async clear(){let t;try{t=await this.ensureDb()}catch{return 16}let e=t.transaction(D,"readwrite"),n=e.objectStore(D);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=R(t),i=e.transaction(D,"readonly").objectStore(D);return new Promise((o)=>{let r=i.get(n);r.onsuccess=()=>{let l=r.result;if(!l)o(m(void 0));else o(m(ls(l)))},r.onerror=()=>o(c(18))})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!F(e))return m(void 0);return m(e)}async getByUpdatedAt(t,e){let[n,s]=Re(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let r=i.transaction(D,"readonly").objectStore(D).index(cs),l=zr(t,e);return new Promise((a)=>{let d=r.getAll(l);d.onsuccess=()=>{let u=d.result;a(m(u.map(ce)))},d.onerror=()=>a(c(18))})}async getAllOfType(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D).index(sn);return new Promise((i)=>{let o=s.getAll(IDBKeyRange.bound([t],[t,[]]));o.onsuccess=()=>{let r=o.result;i(m(r.map(ce)))},o.onerror=()=>i(c(18))})}async getByTag(t,e){let[n,s]=Te(e);if(s!==0)return c(s);if(!n)return m([]);let i;try{i=await this.ensureDb()}catch{return c(16)}let o=Nr(e),l=i.transaction(D,"readonly").objectStore(D).index(le);return new Promise((a)=>{let d=l.getAll(o);d.onsuccess=()=>{let u=d.result;a(m(Er(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=R(t.pid),i=e.transaction(D,"readonly").objectStore(D).index(as);return new Promise((o)=>{let r=i.getAll(IDBKeyRange.only([t.type,n]));r.onsuccess=()=>{let a=r.result.map(ce);o(m(a))},r.onerror=()=>o(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,n]=await this.getAllEntities(t);if(n!==0)return c(n);return m(e)}async countEntities({type:t}){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D).index(sn);return new Promise((i)=>{let o=IDBKeyRange.bound([t],[t,[]]),r=s.count(o);r.onsuccess=()=>i(m(r.result)),r.onerror=()=>i(c(18))})}async checksum(t){let e;try{e=await this.ensureDb()}catch{return c(16)}let s=e.transaction(D,"readonly").objectStore(D),i=[];return new Promise((o)=>{let r=s.openCursor();r.onsuccess=()=>{let l=r.result;if(l){let a=l.value;i.push(Ce(ls(a))),l.continue()}else Ke(i,t).then(o)},r.onerror=()=>o(c(18))})}}function Fr(t,e){if(!t.objectStoreNames.contains(D))t.createObjectStore(D,{keyPath:"eid",autoIncrement:!1});let n=e.objectStore(D);if(!n.indexNames.contains(sn))n.createIndex(sn,["typ","crd"],{unique:!1});if(!n.indexNames.contains(cs))n.createIndex(cs,["typ","upd"],{unique:!1});if(n.indexNames.contains(Li))n.deleteIndex(Li);if(!n.indexNames.contains(as))n.createIndex(as,["typ","pid"],{unique:!1});if(n.indexNames.contains(le)){if(n.index(le).keyPath!=="tgs")n.deleteIndex(le)}if(!n.indexNames.contains(le))n.createIndex(le,"tgs",{unique:!1,multiEntry:!0})}function vr(){return new Promise((t,e)=>{let n=indexedDB.open(Mi,Pi);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!i){e(Error("Transaction is null during EntDB upgrade"));return}try{Fr(s,i)}catch(o){e(o instanceof Error?o:Error(String(o)))}},n.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${Mi} → v${Pi}); waiting for other connections to close`)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error??Error("EntDB IndexedDB open failed"))})}async function wi(){let t=new ds;return await t.init(),t}class on{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=R(t.eid),n=this.ents.get(e);if(n!==void 0&&F(n))this.unindex(e,n);if(this.ents.set(e,t),F(t))this.index(e,t)}del(t){let e=this.ents.get(t);if(e===void 0)return;if(F(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=R(e.pid),i=this.byTypePid.get(e.type);if(!i)i=new Map,this.byTypePid.set(e.type,i);let o=i.get(s);if(!o)o=new Map,i.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 i of e.tags){let o=s.get(i);if(!o)o=new Map,s.set(i,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=R(e.pid),i=this.byTypePid.get(e.type),o=i?.get(s);if(o){if(o.delete(t),o.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 o=s.get(i);if(o){if(o.delete(t),o.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]=Te(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 o=new Set,r=[];for(let[l,a]of i){if(!ps(l,e))continue;for(let[d,u]of a){if(o.has(d))continue;o.add(d),r.push(u)}}return m(r)}byDateSpec(t,e){let[n,s]=Re(e);if(s!==0)return c(s);if(!n)return m([]);let i=[],o=this.byType.get(t);if(o){for(let r of o.values())if(us(r.updatedAt,e))i.push(r)}return m(i)}async apply(t){let e=new Set,n=[],s=[];for(let i of t){let o=R(i.eid),r=this.ents.get(o),[l,a]=ae(r,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of de(r,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=R(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||!F(e))return m(void 0);return m(e)}async getAllEntities(t){let{type:e}=t;if(this.useIndex){if("pid"in t){let s=R(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(F(s)&&s.type===e&&s.pid&&B(s.pid,t.pid))n.push(s)}else if("tag"in t){let s=t.tag,[i,o]=Te(s);if(o!==0)return c(o);if(!i)return m(n);for(let r of this.ents.values())if(F(r)&&r.type===e&&r.tags&&r.tags.some((l)=>ps(l,s)))n.push(r)}else if("updatedAt"in t){let s=t.updatedAt,[i,o]=Re(s);if(o!==0)return c(o);if(!i)return m(n);for(let r of this.ents.values())if(F(r)&&r.type===e&&us(r.updatedAt,s))n.push(r)}else for(let s of this.ents.values())if(F(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(F(n)&&n.type===t)e+=1;return m(e)}async checksum(t){let e=[];for(let n of this.ents.values())e.push(Ce(n));return Ke(e,t)}}async function ms(t){let e=await wi();if(t?.cache===!1)return e;return new He(e,void 0,{indexes:t?.indexes,optimistic:t?.optimistic})}class He{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();optimistic;constructor(t,e,n){if(this.durable=t,this.optimistic=n?.optimistic!==!1,this.mem=new on(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;for(let e of this.listeners)e(t)}run(t){let e=this.chain.then(t,t);return this.chain=e.then(()=>{return},()=>{return}),e}apply(t){let e;if(this.optimistic){this.emit(qr(this.mem,t).types),e=new Map;for(let n of t){let s=R(n.eid);e.set(s,Bi(this.mem.ents.get(s)))}}return this.run(async()=>{let n=await this.durable.apply(t),{changed:s,status:i}=await this.pullEids(t.map((o)=>o.eid),e);if(this.emit(s),i!==0)return{stats:t.map(()=>i),types:n.types,eids:n.eids};return n})}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){return this.run(async()=>{let{changed:e,status:n}=await this.pullEids(t);return this.emit(e),n})}async pullEids(t,e){let n=new Set,s=new Set;for(let i of t){let o=R(i);if(s.has(o))continue;s.add(o);let[r,l]=await this.durable.getRow(i);if(l!==0)return{changed:n,status:l};let a=this.mem.ents.get(o);if(a!==void 0&&r!==void 0&&Ui(a,r))continue;if(e){if(!Ar(Bi(a),e.get(o)))continue}if(r){if(this.mem.put(r),!a||!Qr(a,r)){if(F(r))n.add(r.type);if(a!==void 0&&F(a))n.add(a.type)}}else if(a!==void 0){if(this.mem.del(o),F(a))n.add(a.type)}}return{changed:n,status:0}}async warmType(t){if(this.warmed.has(t))return 0;let[e,n]=await this.durable.getEntities({type:t});if(n!==0)return n;if(e)for(let s of e){let i=R(s.eid),o=this.mem.ents.get(i);if(!o||Ui(s,o))this.mem.put(s)}return this.warmed.add(t),0}async getRow(t){let e=R(t);if(this.mem.ents.has(e))return this.mem.getRow(t);return this.run(async()=>{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)this.mem.put(n);return m(n)})}async getEnt(t){let[e,n]=await this.getRow(t);if(n!==0)return c(n);if(e===void 0||!F(e))return m(void 0);return m(e)}async getEntities(t){if(!this.warmed.has(t.type)){let e=await this.run(()=>this.warmType(t.type));if(e!==0)return c(e)}return this.mem.getEntities(t)}async countEntities({type:t}){if(!this.warmed.has(t)){let e=await this.run(()=>this.warmType(t));if(e!==0)return c(e)}return this.mem.countEntities({type:t})}async checksum(t){return this.durable.checksum(t)}}function Qr(t,e){if(F(t)!==F(e))return!1;if(t.ctr!==e.ctr)return!1;if(t.updatedAt.getTime()!==e.updatedAt.getTime())return!1;if(!B(t.eid,e.eid))return!1;if(!F(t)||!F(e))return!0;if(t.createdAt.getTime()!==e.createdAt.getTime())return!1;if(t.type!==e.type)return!1;if(!Or(t.pid,e.pid))return!1;if(!Dr(t.tags,e.tags))return!1;return jr(t.body,e.body)}function Dr(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 Or(t,e){if(t===void 0&&e===void 0)return!0;if(t===void 0||e===void 0)return!1;return B(t,e)}function jr(t,e){if(Object.is(t,e))return!0;if(t instanceof Uint8Array&&e instanceof Uint8Array)return B(t,e);if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();try{return B(zt(t),zt(e))}catch{return!1}}function Ui(t,e){let n=t.updatedAt.getTime(),s=e.updatedAt.getTime();if(n!==s)return n>s;return t.ctr>e.ctr}function Bi(t){if(t===void 0)return;return{t:t.updatedAt.getTime(),ctr:t.ctr}}function Ar(t,e){if(t===void 0||e===void 0)return t===e;return t.t===e.t&&t.ctr===e.ctr}function qr(t,e){let n=new Set,s=[];for(let i of e){let o=R(i.eid),r=t.ents.get(o),[l,a]=ae(r,i);if(a!==0){s.push(a);continue}if(l===void 0){s.push(12);continue}for(let d of de(r,l))n.add(d);t.put(l),s.push(0)}return{stats:s,types:n}}function rn(t){if(t instanceof He){let e=new xe((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 xe((e)=>t.apply(e),()=>t.clear())}function F(t){return"type"in t}function _r(t){return!F(t)}function $r(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 Re(t){if(t instanceof Date)return m(!0);if(t.range.start>t.range.end)return c(10);return m(!0)}function us(t,e){if(e instanceof Date)return t.getTime()===e.getTime();return $r(t,e.range)}function tl(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 Te(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 ps(t,e){if(typeof e==="string")return t===e;if("range"in e)return tl(t,e.range);if(e.prefix.length===0)return!1;return t.startsWith(e.prefix)}function Ji(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 Ce(t){return{eid:t.eid,ctr:t.ctr,updatedAt:t.updatedAt}}function hs(t){let e=new M(t.eid),[n,s]=e.readStruct(A);if(s!==0)return c(s);return m({eid:t.eid,ctr:t.ctr,updatedAt:new Date(n.ts.getTime()+t.off)})}function ae(t,e){let n=new M(e.eid),[s,i]=n.readStruct(A);if(i!==0)return c(i);let o=new Date(s.ts.getTime()+e.off);if(t!==void 0&&o<=t.updatedAt)return c(15);if(ki(e)){let r=Ji(e.tags);return m({eid:e.eid,pid:e.pid,...r!==void 0?{tags:r}:{},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 de(t,e){let n=new Set;if(t!==void 0&&F(t))n.add(t.type);if(F(e))n.add(e.type);return[...n]}var el={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};class ln{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 cn=100;class Ye{timer=null;delayMs;work;tail=new ln;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)}}function zi(t){let e=new M(t.eid),[n,s]=A.decode(e);if(s!==0)return;return n.ts.getTime()+t.off}function nl(t,e){let n=zi(t),s=zi(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 ue(t,e){return t.slice().sort((n,s)=>nl(e(n),e(s)))}var Nt={phase:"idle"},pe=50;function an(t,e,n){if(t<=0||e<=0)return!1;if(t===1||t===e)return!0;return t%n===0}function dn(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 Ni(t,e,n){let s=[],i=[],o=0;for(let r of t){let l=e(r);if(i.length>0&&o+l>n)s.push(i),i=[],o=0;if(i.push(r),o+=l,o>=n)s.push(i),i=[],o=0}if(i.length>0)s.push(i);return s}async function ys(t,e,n){let s=t.length;if(s<1)return[];let i=Array(s),o=0,r=Math.min(Math.max(1,e),s),l=async()=>{while(!0){let d=o;if(o+=1,d>=s)return;i[d]=await n(t[d],d)}},a=[];for(let d=0;d<r;d++)a.push(l());return await Promise.all(a),i}async function un(t,e,n,s){let i=new M(t.headCph),[o,r]=i.readStruct(qe);if(r!==0)return c(r);let{sig:l,kdm:a,headCph:d}=o;if(!await s.checkSigEd25519(l,d,e))return c(3);let p=n.deriveCipher(a,"decrypt"),h;try{h=await p.decrypt(d)}catch{return c(20)}return m({kdm:a,headEnc:h})}var St="f",wt="t",Gt="e";function sl(t){return t===St||t===wt||t===Gt}function me(t){if(t===!0||t===wt)return wt;if(t===Gt)return Gt;return St}function il(t){return me(t.apld)===St}function bs(t){return t!==0&&t!==15&&t!==18&&t!==17}function Et(t,e,n){if(t.apld=e,e===Gt&&n!==void 0)t.err=n;else delete t.err}async function Ut(t,e,n,s){let i=s?.body!==!1,o=me(e.apld),r=e.body,l=r?.length??0,a;if(i&&r&&l>0)a=await n.blake3(r);let d={eid:e.eid,off:e.off??0,ctr:e.ctr??0,len:l,hsh:a},u={hash:t,head:d,apld:o};if(i&&r!==void 0)u.body=r;if(o===Gt&&e.err!==void 0)u.err=e.err;return u}var Zs=1048576,Gs=1048576,Fi=64;function ol(t){return t.sig.length+t.kdm.length+t.headCph.length+t.bodyCph.length}async function rl(t,e,n,s,i){if(s.length<1)return 0;let[o,r]=await t.push(s);if(r!==0)return r;if(!o)return 27;for(let a of o){if(a.status!==0){console.error("push err",a);continue}let d=i[a.idx];if(!d){console.error("no hash",a);continue}await e.uploads.deq(n,[d])}let l=await e.hosts.get(n);if(l){let a=l.lastSeq,d=a,u=[];for(let p of o)if(p.status===0)u.push(p.seq);u.sort((p,h)=>p-h);for(let p of u)if(p===a+1)a=p;if(a>d)await e.hosts.touch(n,a)}return 0}async function Ei(t,e){if(e.length<1)return m([]);let n=new Map,s=[];for(let l of e)n.set(l.seq,l),s.push(l.seq);let[i,o]=await t.pull(s);if(o!==0)return c(o);if(!i)return c(27);let r=[];for(let{seq:l,bodyCph:a}of i){let d=n.get(l);if(!d)continue;r.push({dl:d,bodyCph:a})}return m(r)}async function ll(t,e,n,s){if(s.length<1)return m({parts:[],hashes:[]});let i=[],o=[],r=[],l=new Map;for(let{dl:d,bodyCph:u}of s){let{head:p,kdm:h,seq:y,host:Z}=d,[b,G]=await vi(d,n);if(G!==0||!b){let Y=l.get(Z)??[];Y.push(y),l.set(Z,Y);continue}let{headEnc:V,headEncHash:X}=b,S=e.deriveCipher(h,"decrypt"),[f,W]=await jn(V,u,S,n,X);if(W!==0||!f){let Y=l.get(Z)??[];Y.push(y),l.set(Z,Y);continue}let T={head:p,body:f.bod},H=f.headHash;r.push({key:H,data:Oi(T)}),i.push(T),o.push(H);let k=l.get(Z)??[];k.push(y),l.set(Z,k)}let a=await t.messages.add(r);for(let[d,u]of l)await t.downloads.deq(d,u);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:i,hashes:o})}async function vi(t,e){let n=t.headEnc;if(!n){let i=new w,o=i.writeStruct(ut,t.head);if(o!==0)return c(o);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 Qi(t,e,n){let s=new Set;for(let r of e)s.add(R(r));if(s.size<1)return;let i=Array.from(await t.downloads.list());if(i.length<1)return;let o=new Map;for(let r of i){let l;if(r.headEncHash)l=R(r.headEncHash);else{let[d,u]=await vi(r,n);if(u!==0||!d)continue;l=R(d.headEncHash)}if(!s.has(l))continue;let a=o.get(r.host)??[];a.push(r.seq),o.set(r.host,a)}for(let[r,l]of o)await t.downloads.deq(r,l)}async function Xs({conn:t,store:e,enclave:n,host:s,crypto:i,onProgress:o,peekProgressEvery:r,peekConcurrency:l}){let a=await t.identity(),d=[],[u,p]=await t.peek(s.lastSeq);if(p!==0)return p;let h=u.length,y=r??pe,Z=l??Fi;if(o&&h>0)o({phase:"peek",host:s.label,done:0,total:h});let b=0,G=await ys(u,Z,async(X)=>{let[S,f]=await un(X,a.publicKey,n,i),W;if(f!==0||!S)W={ok:!1,seq:X.seq,stat:f};else{let T=await i.blake3(S.headEnc);W={ok:!0,seq:X.seq,kdm:S.kdm,headEnc:S.headEnc,headEncHash:T}}if(b+=1,o&&an(b,h,y))o({phase:"peek",host:s.label,done:b,total:h});return W}),V=new Set;for(let X of G){if(!X.ok){console.error("peek: decrypting item head",X.stat);continue}let S=R(X.headEncHash);if(await e.messages.has(X.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await e.uploads.deq(s.label,[X.headEncHash]),await e.downloads.deq(s.label,[X.seq]);continue}if(V.has(S)){await e.downloads.deq(s.label,[X.seq]);continue}let W=new M(X.headEnc),[T,H]=W.readStruct(ut);if(H!==0){console.error("peek: reading item head",H);continue}V.add(S),d.push({kdm:X.kdm,head:T,seq:X.seq,host:s.label,headEnc:X.headEnc,headEncHash:X.headEncHash})}if(await e.downloads.enq(d),u.length>0){let X=Math.max(...u.map((S)=>S.seq));await e.hosts.recordStats(s.label,{lastSeq:X})}if(o)o({phase:"peek",host:s.label,done:h,total:h});return 0}async function Di({conn:t,store:e,host:n,maxPushBytes:s,onProgress:i}){let o=s??Zs,r=await e.uploads.list(n.label),l=r.length,a=0;if(i&&l>0)i({phase:"push",host:n.label,done:0,total:l});let d=[],u=[],p=0,h=async()=>{if(d.length<1)return 0;let y=d.length,Z=await rl(t,e,n.label,d,u);if(d=[],u=[],p=0,Z===0){if(a+=y,i)i({phase:"push",host:n.label,done:a,total:l})}return Z};for(let y of r){let Z=await e.messages.get(y);if(!Z){a+=1;continue}let b={...Z.head,bod:Z.body},[G,V]=await t.seal(b);if(V!==0)return V;if(!G)return 12;let X=ol(G);if(d.length>0&&p+X>o){let S=await h();if(S!==0)return S}if(d.push(G),u.push(y),p+=X,p>=o){let S=await h();if(S!==0)return S}}return h()}async function fs({conn:t,store:e,enclave:n,host:s,crypto:i,maxPullBytes:o,onProgress:r},l){let a=o??Gs,d=await e.downloads.list(),u=Array.from(d).filter((G)=>G.host===s.label);if(u.length<1)return 15;let p=ue(u,(G)=>G.head),h=Ni(p,(G)=>G.head.len,a),y=p.length,Z=0;if(r)r({phase:"pull",host:s.label,done:0,total:y});let b=Ei(t,h[0]);for(let G=0;G<h.length;G++){let[V,X]=await b;if(X!==0||!V)return X;if(Z+=h[G].length,r)r({phase:"pull",host:s.label,done:Z,total:y});let S=h[G+1];if(S)b=Ei(t,S);if(r)r({phase:"open",host:s.label,done:Z,total:y});let f=ue(V,(T)=>T.dl.head),[,W]=await ll(e,n,i,f);if(W!==0)return W;if(l){if(r)r({phase:"exec",host:s.label,done:Z,total:y});await l()}}return 0}function Oi({head:t,body:e}){let n={eid:t.eid,body:e,apld:St};if(t.off!==0)n.off=t.off;if(t.ctr!==0)n.ctr=t.ctr;return n}async function ji(t,{conn:e,store:n,enclave:s,host:i,crypto:o,onProgress:r},l){let a=i.label,d=await e.identity(),u=new M(t),[p,h]=u.readStructs(Ae);if(h!==0){console.error("Failed decoding notif",g[h]);return}let y=!1,b=(await n.hosts.get(a))?.lastSeq,G=[],V=!1;for(let f of p){let[W,T]=await un({seq:f.seq,headCph:f.headCph},d.publicKey,s,o);if(T!==0){console.error("Failed decrypting notif",g[T]);continue}let H=await o.blake3(W.headEnc);if(await n.messages.has(H))continue;let k=new M(W.headEnc),[Y,U]=k.readStruct(ut);if(U!==0){console.error("Failed to parse head",g[U]);continue}if(!f.bodyCph&&Y.len>0)V=!0,await n.downloads.enq([{seq:f.seq,host:a,kdm:W.kdm,head:Y,headEnc:W.headEnc,headEncHash:H}]);else G.push({...W,head:Y,bodyCph:f.bodyCph,headEncHash:H});if(b===void 0||f.seq!==b+1)console.log("out of seq",f.seq,b),y=!0;else b=f.seq}if(b!==void 0)await n.hosts.touch(i.label,b);let X=[];for(let f of G){let W=s.deriveCipher(f.kdm,"decrypt"),[T,H]=await jn(f.headEnc,f.bodyCph,W,o);if(H!==0){console.error("Failed to open body",g[H]);continue}X.push({key:f.headEncHash,data:Oi({head:f.head,body:T.bod})})}let S=await n.messages.add(X);for(let f=0;f<S.length;f++){let W=S[f];if(W!==0&&W!==15)console.error("ERR storing",g[W],"for message",f)}if(r&&X.length>0)r({phase:"open",host:i.label,done:X.length,total:X.length});if(y||V||X.length>0)l()}async function Is(t,e={}){let n=e.pull!==!1,s=e.push===!0,{conn:i,store:o,enclave:r,host:l,crypto:a,onProgress:d,peekProgressEvery:u,peekConcurrency:p}=t,h=await i.identity(),[y,Z]=await i.peek(0);if(Z!==0)return c(Z);let b=y.length,G=u??pe,V=p??Fi;if(d&&b>0)d({phase:"peek",host:l.label,done:0,total:b});let X=0,S=await ys(y,V,async(C)=>{let[P,L]=await un(C,h.publicKey,r,a),E;if(L!==0||!P)E={ok:!1,seq:C.seq,stat:L};else{let x=await a.blake3(P.headEnc);E={ok:!0,seq:C.seq,kdm:P.kdm,headEnc:P.headEnc,headEncHash:x}}if(X+=1,d&&an(X,b,G))d({phase:"peek",host:l.label,done:X,total:b});return E}),f=new Map;for(let C of S){if(!C.ok)continue;let P=R(C.headEncHash),L=f.get(P);if(L)L.count+=1;else f.set(P,{hash:C.headEncHash,count:1,sample:C})}let W=0,T=[];for(let C of f.values()){if(C.count>1)W+=C.count-1;T.push(C.hash)}let H=y.length,k=f.size,Y=await re(T,a),U=[],N=0;for(let C of f.values()){if(await o.messages.has(C.hash)){await o.uploads.deq(l.label,[C.hash]);continue}if(N+=1,!n)continue;let L=C.sample,E=new M(L.headEnc),[x,O]=E.readStruct(ut);if(O!==0){console.error("reconcile: reading msg header",O);continue}U.push({kdm:L.kdm,head:x,seq:L.seq,host:l.label,headEnc:L.headEnc,headEncHash:L.headEncHash})}if(U.length>0)await o.downloads.enq(U);let z=0;if(s){let C=await o.messages.listKeys(),P=new Set(f.keys()),L=[];for(let E of C)if(!P.has(R(E)))z+=1,L.push(E);if(L.length>0)await o.uploads.enq(l.label,L)}else{let C=await o.messages.listKeys(),P=new Set(f.keys());for(let L of C)if(!P.has(R(L)))z+=1}let I=y.length>0?Math.max(...y.map((C)=>C.seq)):0;if(await o.hosts.recordStats(l.label,{setLastSeq:I}),d)d({phase:"peek",host:l.label,done:b,total:b});return m({msgcheck:Y,numBags:H,uniqueMsgs:k,numDupes:W,missingLocal:N,missingHost:z})}function cl(t){return t.map(({head:e,body:n})=>({...e,bod:n}))}class he{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new ln;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=pe;lastProgress=Nt;scheduledSync;constructor(t,e,n,s,i,o=!0,r=Zs,l=Gs,a){this.clock=t;this.state=e;this.store=n;this.transport=s;this.crypto=i;this.forceSkewHandlingByDefault=o;this.onScheduleSync=a;this.maxPushBytes=r,this.maxPullBytes=l,this.clientState=new bt(()=>this.getClientState()),this.xferState=new bt(()=>this.getXferState()),this.scheduledSync=new Ye(cn,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()};async setSeed(t,e){await this.store.seed.save(t,e),this.clientState.emit()}async getClientState(){let{store:t,connections:e}=this,n=await t.seed.load(),s=await t.hosts.list(),i=!1;for(let o of e.values())if(o.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)=>this.enqueueApplyJob(()=>this.doApply(t,e));async doApply(t,e={enqueueUpload:!0,triggerUpload:!0}){let n=this.state.apply(cl(t)),s=[],i=[];for(let{head:r,body:l}of t){let a=new w;a.writeStruct(ut,r);let d=a.result(),u=await this.crypto.blake3(d),p={eid:r.eid,body:l,apld:St};if(r.off!==0)p.off=r.off;if(r.ctr!==0)p.ctr=r.ctr;s.push(u),i.push({key:u,data:p})}await this.store.messages.add(i),await Qi(this.store,s,this.crypto);let o=await n;if(await this.markApplyStats(s,o),e.enqueueUpload){let r=[];for(let l=0;l<s.length;l++){let a=o[l];if(a===0||a===15)r.push(s[l])}if(r.length>0){let l=await this.store.hosts.list();for(let a of l)await this.store.uploads.enq(a.label,r);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:St});if(t.length<1)return[];let e=ue(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 o=await this.store.messages.get(i);if(o)e.push(o)}let n=await this.applyStored(e),s=new Map;for(let i=0;i<e.length;i++)s.set(R(e[i].hash),n[i]??12);return t.map((i)=>s.get(R(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 o=e[i];if(o===0||o===15)n.push(t[i]);else if(o!==void 0&&bs(o))s.push({key:t[i],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){let{clock:e,crypto:n}=this,[s,i]=await Ci({now:e.now(),bod:t,crypto:n});if(i!==0)return c(i);let r=(await this.apply([{head:s,body:t}]))[0];if(r!==0&&r!==15)return c(r??12);return m(s)}async makeUpdate(t,e){let{clock:n,crypto:s}=this,i=n.now();if(t.updatedAt.getTime()>i.getTime())return c(4);let o=t.ctr+1,[r,l]=await nn({now:i,eid:t.eid,ctr:o,bod:e,crypto:s});if(l!==0)return c(l);return m({head:r,body:e})}async updateWithSkew(t,e,n){if(n===!1)return c(4);let{clock:s,crypto:i}=this,o=s.now(),r=new M(t.eid),[l,a]=r.readStruct(A);if(a!==0)return c(a);let d=t.updatedAt.getTime()-l.ts.getTime(),u={eid:t.eid,off:d+1,ctr:t.ctr+1,len:0},h=(await this.apply([{head:u,body:void 0}]))[0];if(h!==0&&h!==15)return c(h??12);if(e===void 0)return m(u);let[y,Z]=oe({id:l.id,ts:o});if(Z!==0)return c(Z);let[b,G]=await nn({now:o,eid:y,ctr:0,bod:e,crypto:i});if(G!==0)return c(G);let X=(await this.apply([{head:b,body:e}]))[0];if(X!==0&&X!==15)return c(X??12);return m(b)}async updateRaw(t,e,n=this.forceSkewHandlingByDefault){if(t.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(t,e,n);return this.enqueueApplyJob(async()=>{let[s,i]=await this.makeUpdate(t,e);if(i!==0)return c(i);let r=(await this.doApply([s]))[0];if(r!==0&&r!==15)return c(r??12);return m(s.head)})}async insert(t){let{body:e,type:n,pid:s,tags:i}=t,r=zt({body:e,type:n,pid:s,tags:i});return this.insertRaw(r)}async update(t){let{prior:e,body:n,type:s,pid:i,tags:o,force:r}=t,a=zt({body:n,type:s,pid:i,tags:o});return this.updateRaw(e,a,r??this.forceSkewHandlingByDefault)}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 hs(e.head);let n=new M(t),[s,i]=n.readStruct(A);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 oe({id:t,ts:s});let i=await n.genRandomBytes(8);return oe({id:i,ts:s})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;await this.drainApplyQueue();for(let[i,o]of t){let r=await n.hosts.get(i);if(!r)continue;let l={conn:o,store:n,enclave:s,host:r,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},a=await Xs(l);if(a!==0)return console.error(`Failed to peek: ${a}`),this.emitProgress({phase:"idle"}),a;this.xferState.emit();let d=await Di(l);if(d!==0)return console.error(`Failed to push: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await fs(l,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 re(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,o=await i.seed.load();if(!o)return c(22);let r=await i.hosts.get(t);if(!r)return c(13);let l=n.get(t);if(!l||!l.isConnected()){if(await this.connectToHost(r,!1,!1),r=await i.hosts.get(t),!r)return c(13);l=n.get(t)}if(!l)return c(12);let a={conn:l,store:i,enclave:o,crypto:s,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[d,u]=await Is({...a,host:r},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 h=await i.hosts.get(t);if(!h)return c(13);let[y,Z]=await Is({...a,host:h},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),Z!==0)return c(Z);if(!y)return c(12);return m(y)}async repull(){let{connections:t,crypto:e,store:n}=this,s=await n.seed.load();if(!s)return 22;let i=Array.from(await n.hosts.list());if(i.length<1)return 0;for(let o of i){let r=t.get(o.label);if(!r||!r.isConnected())await this.connectToHost(o,!1,!1)}for(let[o,r]of t){let l=await n.hosts.get(o);if(!l)continue;let a={conn:r,store:n,enclave:s,host:{...l,lastSeq:0},crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},d=await Xs(a);if(d!==0)return console.error(`rebuild: failed to peek: ${d}`),this.emitProgress({phase:"idle"}),d;this.xferState.emit();let u=await fs(a);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=ue(e,(o)=>o.head),s=n.length;if(s<1)return this.emitProgress({phase:"idle"}),0;let i=0;while(i<n.length){let o=0,r=0,l=i;for(let d=i;d<n.length&&r<100&&o<102400;d++)o+=n[d].head.len,r++,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:o}=this;if(s)await o.hosts.wipe(),await o.uploads.wipe(),await o.downloads.wipe();if(e)await o.messages.wipe();if(i)await o.seed.wipe();if(n)await this.state.clear();this.lastProgress=Nt,this.clientState.emit(),this.xferState.emit()}import=async(t,e)=>{let{crypto:n,store:s}=this,i=e?.onProgress,o=await s.seed.load();if(!o)return 22;console.time("import: decoding file...");let r=await t.bytes(),[l,a]=await en.decodeFile(r,n,o);if(a!==0)return a;console.timeEnd("import: decoding file...");let d=0;while(d<l.length){let u=0,p=0,h=d;for(let b=d;b<l.length&&p<100&&u<102400;b++)u+=l[b].head.len,p++,h=b+1;let y=l.slice(d,h);console.time(`import: applying [${d}, ${h}]`);let Z=await this.apply(y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${d}, ${h}]`);for(let b=0;b<y.length;b++){let G=Z[b];if(G!==0&&G!==15)console.warn(`failed to import msg ${d+b}: ${g[G]}`)}if(i)queueMicrotask(()=>i(h,l.length,0));this.emitProgress({phase:"import",done:h,total:l.length}),d=h}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=await e.seed.load();if(!n)return c(22);let s=await e.messages.list();return en.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 dn(s,t),0}async link(t,e=!0){if(await this.store.hosts.add(t),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),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:o,store:r,transport:l}=this,a=i.get(t.label);if(a){if(a.isConnected())return;try{a.closeListener()}catch{}i.delete(t.label)}let d=await r.seed.load();if(!d)return;console.info(`Connecting to ${t.handle} (${t.label})`);let u=new $e(d,o,t,s,l(t),(p)=>r.hosts.set(t.label,p));if(await u.register(),e)await u.listen(async(p)=>{let h={conn:u,store:r,enclave:d,host:t,crypto:o,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return ji(p,h,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(!await i.seed.load())return;await this.drainApplyQueue();let r=await i.hosts.list();for(let l of r)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()}}var Ft=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function pn(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function Vs(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function j(t,...e){if(!Vs(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 Ss(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 Ai(t,e){j(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Ws(t){if(typeof t!=="boolean")throw Error(`boolean expected, not ${t}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var Wt=(t)=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));var al=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!al)throw Error("Non little-endian hardware is not supported");function dl(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function mn(t){if(typeof t==="string")t=dl(t);else if(Vs(t))t=hn(t);else throw Error("Uint8Array expected, got "+typeof t);return t}function qi(t,e){if(e==null||typeof e!=="object")throw Error("options must be defined");return Object.assign(t,e)}function _i(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}var $i=(t,e)=>{function n(s,...i){if(j(s),t.nonceLength!==void 0){let u=i[0];if(!u)throw Error("nonce / iv required");if(t.varSizeNonce)j(u);else j(u,t.nonceLength)}let o=t.tagLength;if(o&&i[1]!==void 0)j(i[1]);let r=e(s,...i),l=(u,p)=>{if(p!==void 0){if(u!==2)throw Error("cipher output not supported");j(p)}},a=!1;return{encrypt(u,p){if(a)throw Error("cannot encrypt() twice with same key + nonce");return a=!0,j(u),l(r.encrypt.length,p),r.encrypt(u,p)},decrypt(u,p){if(j(u),o&&u.length<o)throw Error("invalid ciphertext length: smaller than tagLength="+o);return l(r.decrypt.length,p),r.decrypt(u,p)}}}return Object.assign(n,t),n};function gs(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&&!ul(e))throw Error("invalid output, must be aligned");return e}function ul(t){return t.byteOffset%4===0}function hn(t){return Uint8Array.from(t)}function Xt(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function ke(t=32){if(Ft&&typeof Ft.getRandomValues==="function")return Ft.getRandomValues(new Uint8Array(t));if(Ft&&typeof Ft.randomBytes==="function")return Ft.randomBytes(t);throw Error("crypto.getRandomValues must be defined")}var eo=(t)=>Uint8Array.from(t.split("").map((e)=>e.charCodeAt(0))),pl=eo("expand 16-byte k"),ml=eo("expand 32-byte k"),hl=Wt(pl),yl=Wt(ml);function K(t,e){return t<<e|t>>>32-e}function Ks(t){return t.byteOffset%4===0}var yn=64,bl=16,no=4294967295,to=new Uint32Array;function Zl(t,e,n,s,i,o,r,l){let a=i.length,d=new Uint8Array(yn),u=Wt(d),p=Ks(i)&&Ks(o),h=p?Wt(i):to,y=p?Wt(o):to;for(let Z=0;Z<a;r++){if(t(e,n,s,u,r,l),r>=no)throw Error("arx: counter overflow");let b=Math.min(yn,a-Z);if(p&&b===yn){let G=Z/4;if(Z%4!==0)throw Error("arx: invalid block position");for(let V=0,X;V<bl;V++)X=G+V,y[X]=h[X]^u[V];Z+=yn;continue}for(let G=0,V;G<b;G++)V=Z+G,o[V]=i[V]^d[G];Z+=b}}function so(t,e){let{allowShortKeys:n,extendNonceFn:s,counterLength:i,counterRight:o,rounds:r}=qi({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},e);if(typeof t!=="function")throw Error("core must be a function");return pn(i),pn(r),Ws(o),Ws(n),(l,a,d,u,p=0)=>{j(l),j(a),j(d);let h=d.length;if(u===void 0)u=new Uint8Array(h);if(j(u),pn(p),p<0||p>=no)throw Error("arx: counter overflow");if(u.length<h)throw Error(`arx: output (${u.length}) is shorter than data (${h})`);let y=[],Z=l.length,b,G;if(Z===32)y.push(b=hn(l)),G=yl;else if(Z===16&&n)b=new Uint8Array(32),b.set(l),b.set(l,16),G=hl,y.push(b);else throw Error(`arx: invalid 32-byte key, got length=${Z}`);if(!Ks(a))y.push(a=hn(a));let V=Wt(b);if(s){if(a.length!==24)throw Error("arx: extended nonce must be 24 bytes");s(G,V,Wt(a.subarray(0,16)),V),a=a.subarray(16)}let X=16-i;if(X!==a.length)throw Error(`arx: nonce must be ${X} or 16 bytes`);if(X!==12){let f=new Uint8Array(12);f.set(a,o?0:12-a.length),a=f,y.push(a)}let S=Wt(a);return Zl(t,G,V,S,d,u,p,r),Xt(...y),u}}var _=(t,e)=>t[e++]&255|(t[e++]&255)<<8;class io{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=mn(t),j(t,32);let e=_(t,0),n=_(t,2),s=_(t,4),i=_(t,6),o=_(t,8),r=_(t,10),l=_(t,12),a=_(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|o<<12)&255,this.r[5]=o>>>1&8190,this.r[6]=(o>>>14|r<<2)&8191,this.r[7]=(r>>>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]=_(t,16+2*d)}process(t,e,n=!1){let s=n?0:2048,{h:i,r:o}=this,r=o[0],l=o[1],a=o[2],d=o[3],u=o[4],p=o[5],h=o[6],y=o[7],Z=o[8],b=o[9],G=_(t,e+0),V=_(t,e+2),X=_(t,e+4),S=_(t,e+6),f=_(t,e+8),W=_(t,e+10),T=_(t,e+12),H=_(t,e+14),k=i[0]+(G&8191),Y=i[1]+((G>>>13|V<<3)&8191),U=i[2]+((V>>>10|X<<6)&8191),N=i[3]+((X>>>7|S<<9)&8191),z=i[4]+((S>>>4|f<<12)&8191),I=i[5]+(f>>>1&8191),C=i[6]+((f>>>14|W<<2)&8191),P=i[7]+((W>>>11|T<<5)&8191),L=i[8]+((T>>>8|H<<8)&8191),E=i[9]+(H>>>5|s),x=0,O=x+k*r+Y*(5*b)+U*(5*Z)+N*(5*y)+z*(5*h);x=O>>>13,O&=8191,O+=I*(5*p)+C*(5*u)+P*(5*d)+L*(5*a)+E*(5*l),x+=O>>>13,O&=8191;let nt=x+k*l+Y*r+U*(5*b)+N*(5*Z)+z*(5*y);x=nt>>>13,nt&=8191,nt+=I*(5*h)+C*(5*p)+P*(5*u)+L*(5*d)+E*(5*a),x+=nt>>>13,nt&=8191;let ct=x+k*a+Y*l+U*r+N*(5*b)+z*(5*Z);x=ct>>>13,ct&=8191,ct+=I*(5*y)+C*(5*h)+P*(5*p)+L*(5*u)+E*(5*d),x+=ct>>>13,ct&=8191;let Q=x+k*d+Y*a+U*l+N*r+z*(5*b);x=Q>>>13,Q&=8191,Q+=I*(5*Z)+C*(5*y)+P*(5*h)+L*(5*p)+E*(5*u),x+=Q>>>13,Q&=8191;let Vt=x+k*u+Y*d+U*a+N*l+z*r;x=Vt>>>13,Vt&=8191,Vt+=I*(5*b)+C*(5*Z)+P*(5*y)+L*(5*h)+E*(5*p),x+=Vt>>>13,Vt&=8191;let qt=x+k*p+Y*u+U*d+N*a+z*l;x=qt>>>13,qt&=8191,qt+=I*r+C*(5*b)+P*(5*Z)+L*(5*y)+E*(5*h),x+=qt>>>13,qt&=8191;let _t=x+k*h+Y*p+U*u+N*d+z*a;x=_t>>>13,_t&=8191,_t+=I*l+C*r+P*(5*b)+L*(5*Z)+E*(5*y),x+=_t>>>13,_t&=8191;let $t=x+k*y+Y*h+U*p+N*u+z*d;x=$t>>>13,$t&=8191,$t+=I*a+C*l+P*r+L*(5*b)+E*(5*Z),x+=$t>>>13,$t&=8191;let te=x+k*Z+Y*y+U*h+N*p+z*u;x=te>>>13,te&=8191,te+=I*d+C*a+P*l+L*r+E*(5*b),x+=te>>>13,te&=8191;let ee=x+k*b+Y*Z+U*y+N*h+z*p;x=ee>>>13,ee&=8191,ee+=I*u+C*d+P*a+L*l+E*r,x+=ee>>>13,ee&=8191,x=(x<<2)+x|0,x=x+O|0,O=x&8191,x=x>>>13,nt+=x,i[0]=O,i[1]=nt,i[2]=ct,i[3]=Q,i[4]=Vt,i[5]=qt,i[6]=_t,i[7]=$t,i[8]=te,i[9]=ee}finalize(){let{h:t,pad:e}=this,n=new Uint16Array(10),s=t[1]>>>13;t[1]&=8191;for(let r=2;r<10;r++)t[r]+=s,s=t[r]>>>13,t[r]&=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 r=1;r<10;r++)n[r]=t[r]+s,s=n[r]>>>13,n[r]&=8191;n[9]-=8192;let i=(s^1)-1;for(let r=0;r<10;r++)n[r]&=i;i=~i;for(let r=0;r<10;r++)t[r]=t[r]&i|n[r];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 r=1;r<8;r++)o=(t[r]+e[r]|0)+(o>>>16)|0,t[r]=o&65535;Xt(n)}update(t){Ss(this);let{buffer:e,blockLen:n}=this;t=mn(t);let s=t.length;for(let i=0;i<s;){let o=Math.min(n-this.pos,s-i);if(o===n){for(;n<=s-i;i+=n)this.process(t,i);continue}if(e.set(t.subarray(i,i+o),this.pos),this.pos+=o,i+=o,this.pos===n)this.process(e,0,!1),this.pos=0}return this}destroy(){Xt(this.h,this.r,this.buffer,this.pad)}digestInto(t){Ss(this),Ai(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 o=0;o<8;o++)t[i++]=n[o]>>>0,t[i++]=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 Gl(t){let e=(s,i)=>t(i).update(mn(s)).digest(),n=t(new Uint8Array(32));return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var xs=Gl((t)=>new io(t));function Xl(t,e,n,s,i,o=20){let r=t[0],l=e[0],a=e[1],d=e[2],u=e[3],p=t[1],h=n[0],y=n[1],Z=i,b=0,G=t[2],V=e[4],X=e[5],S=e[6],f=e[7],W=t[3],T=r,H=l,k=a,Y=d,U=u,N=p,z=h,I=y,C=Z,P=b,L=G,E=V,x=X,O=S,nt=f,ct=W;for(let Vt=0;Vt<o;Vt+=2)U^=K(T+x|0,7),C^=K(U+T|0,9),x^=K(C+U|0,13),T^=K(x+C|0,18),P^=K(N+H|0,7),O^=K(P+N|0,9),H^=K(O+P|0,13),N^=K(H+O|0,18),nt^=K(L+z|0,7),k^=K(nt+L|0,9),z^=K(k+nt|0,13),L^=K(z+k|0,18),Y^=K(ct+E|0,7),I^=K(Y+ct|0,9),E^=K(I+Y|0,13),ct^=K(E+I|0,18),H^=K(T+Y|0,7),k^=K(H+T|0,9),Y^=K(k+H|0,13),T^=K(Y+k|0,18),z^=K(N+U|0,7),I^=K(z+N|0,9),U^=K(I+z|0,13),N^=K(U+I|0,18),E^=K(L+P|0,7),C^=K(E+L|0,9),P^=K(C+E|0,13),L^=K(P+C|0,18),x^=K(ct+nt|0,7),O^=K(x+ct|0,9),nt^=K(O+x|0,13),ct^=K(nt+O|0,18);let Q=0;s[Q++]=r+T|0,s[Q++]=l+H|0,s[Q++]=a+k|0,s[Q++]=d+Y|0,s[Q++]=u+U|0,s[Q++]=p+N|0,s[Q++]=h+z|0,s[Q++]=y+I|0,s[Q++]=Z+C|0,s[Q++]=b+P|0,s[Q++]=G+L|0,s[Q++]=V+E|0,s[Q++]=X+x|0,s[Q++]=S+O|0,s[Q++]=f+nt|0,s[Q++]=W+ct|0}function fl(t,e,n,s){let i=t[0],o=e[0],r=e[1],l=e[2],a=e[3],d=t[1],u=n[0],p=n[1],h=n[2],y=n[3],Z=t[2],b=e[4],G=e[5],V=e[6],X=e[7],S=t[3];for(let W=0;W<20;W+=2)a^=K(i+G|0,7),h^=K(a+i|0,9),G^=K(h+a|0,13),i^=K(G+h|0,18),y^=K(d+o|0,7),V^=K(y+d|0,9),o^=K(V+y|0,13),d^=K(o+V|0,18),X^=K(Z+u|0,7),r^=K(X+Z|0,9),u^=K(r+X|0,13),Z^=K(u+r|0,18),l^=K(S+b|0,7),p^=K(l+S|0,9),b^=K(p+l|0,13),S^=K(b+p|0,18),o^=K(i+l|0,7),r^=K(o+i|0,9),l^=K(r+o|0,13),i^=K(l+r|0,18),u^=K(d+a|0,7),p^=K(u+d|0,9),a^=K(p+u|0,13),d^=K(a+p|0,18),b^=K(Z+y|0,7),h^=K(b+Z|0,9),y^=K(h+b|0,13),Z^=K(y+h|0,18),G^=K(S+X|0,7),V^=K(G+S|0,9),X^=K(V+G|0,13),S^=K(X+V|0,18);let f=0;s[f++]=i,s[f++]=d,s[f++]=Z,s[f++]=S,s[f++]=u,s[f++]=p,s[f++]=h,s[f++]=y}var Rs=so(Xl,{counterRight:!0,extendNonceFn:fl}),Ts=$i({blockSize:64,nonceLength:24,tagLength:16},(t,e)=>({encrypt(n,s){s=gs(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32);s.set(n,32),Xt(i),Rs(t,e,s,s);let r=xs(o,i);return s.set(r,16),Xt(s.subarray(0,16),r),s.subarray(16)},decrypt(n,s){j(n),s=gs(n.length+32,s,!1);let i=s.subarray(0,32),o=s.subarray(32,48),r=s.subarray(48);s.set(n,32),Xt(i);let l=Rs(t,e,i,i),a=xs(r,l);if(!_i(o,a))throw Error("invalid tag");return Rs(t,e,s.subarray(16),s.subarray(16)),Xt(i,o,a),r}}));/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function Il(t){return t instanceof Uint8Array||ArrayBuffer.isView(t)&&t.constructor.name==="Uint8Array"}function Le(t){if(!Number.isSafeInteger(t)||t<0)throw Error("positive integer expected, got "+t)}function vt(t,...e){if(!Il(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 Me(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 bn(t,e){vt(t);let n=e.outputLen;if(t.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function oo(t){return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}function ye(t){return new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4))}function be(...t){for(let e=0;e<t.length;e++)t[e].fill(0)}function Pe(t,e){return t<<32-e|t>>>e}var ro=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function lo(t){return t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255}var co=ro?(t)=>t:(t)=>lo(t);function Vl(t){for(let e=0;e<t.length;e++)t[e]=lo(t[e]);return t}var it=ro?(t)=>t:Vl;function Sl(t){if(typeof t!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(t))}function Ze(t){if(typeof t==="string")t=Sl(t);return vt(t),t}class Cs{}function ao(t){let e=(s,i)=>t(i).update(Ze(s)).digest(),n=t({});return e.outputLen=n.outputLen,e.blockLen=n.blockLen,e.create=(s)=>t(s),e}var uo=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var Zn=BigInt(4294967295),po=BigInt(32);function Hs(t,e=!1){if(e)return{h:Number(t&Zn),l:Number(t>>po&Zn)};return{h:Number(t>>po&Zn)|0,l:Number(t&Zn)|0}}function gt(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,16),n=n+s|0,e=Pe(e^n,12),{a:t,b:e,c:n,d:s}}function Kt(t,e,n,s,i){return t=t+e+i|0,s=Pe(s^t,8),n=n+s|0,e=Pe(e^n,7),{a:t,b:e,c:n,d:s}}class Ys extends Cs{constructor(t,e){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,Le(t),Le(e),this.blockLen=t,this.outputLen=e,this.buffer=new Uint8Array(t),this.buffer32=ye(this.buffer)}update(t){Me(this),t=Ze(t),vt(t);let{blockLen:e,buffer:n,buffer32:s}=this,i=t.length,o=t.byteOffset,r=t.buffer;for(let l=0;l<i;){if(this.pos===e)it(s),this.compress(s,0,!1),it(s),this.pos=0;let a=Math.min(e-this.pos,i-l),d=o+l;if(a===e&&!(d%4)&&l+a<i){let u=new Uint32Array(r,d,Math.floor((i-l)/4));it(u);for(let p=0;l+e<i;p+=s.length,l+=e)this.length+=e,this.compress(u,p,!1);it(u);continue}n.set(t.subarray(l,l+a),this.pos),this.pos+=a,this.length+=a,l+=a}return this}digestInto(t){Me(this),bn(t,this);let{pos:e,buffer32:n}=this;this.finished=!0,be(this.buffer.subarray(e)),it(n),this.compress(n,0,!0),it(n);let s=ye(t);this.get().forEach((i,o)=>s[o]=co(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:o,pos:r}=this;return t||(t=new this.constructor({dkLen:o})),t.set(...this.get()),t.buffer.set(e),t.destroyed=i,t.finished=s,t.length=n,t.pos=r,t.outputLen=o,t}clone(){return this._cloneInto()}}function ks(t,e,n,s,i,o,r,l,a,d,u,p,h,y,Z,b,G,V,X,S){let f=0;for(let W=0;W<s;W++)({a:i,b:a,c:h,d:G}=gt(i,a,h,G,n[e+t[f++]])),{a:i,b:a,c:h,d:G}=Kt(i,a,h,G,n[e+t[f++]]),{a:o,b:d,c:y,d:V}=gt(o,d,y,V,n[e+t[f++]]),{a:o,b:d,c:y,d:V}=Kt(o,d,y,V,n[e+t[f++]]),{a:r,b:u,c:Z,d:X}=gt(r,u,Z,X,n[e+t[f++]]),{a:r,b:u,c:Z,d:X}=Kt(r,u,Z,X,n[e+t[f++]]),{a:l,b:p,c:b,d:S}=gt(l,p,b,S,n[e+t[f++]]),{a:l,b:p,c:b,d:S}=Kt(l,p,b,S,n[e+t[f++]]),{a:i,b:d,c:Z,d:S}=gt(i,d,Z,S,n[e+t[f++]]),{a:i,b:d,c:Z,d:S}=Kt(i,d,Z,S,n[e+t[f++]]),{a:o,b:u,c:b,d:G}=gt(o,u,b,G,n[e+t[f++]]),{a:o,b:u,c:b,d:G}=Kt(o,u,b,G,n[e+t[f++]]),{a:r,b:p,c:h,d:V}=gt(r,p,h,V,n[e+t[f++]]),{a:r,b:p,c:h,d:V}=Kt(r,p,h,V,n[e+t[f++]]),{a:l,b:a,c:y,d:X}=gt(l,a,y,X,n[e+t[f++]]),{a:l,b:a,c:y,d:X}=Kt(l,a,y,X,n[e+t[f++]]);return{v0:i,v1:o,v2:r,v3:l,v4:a,v5:d,v6:u,v7:p,v8:h,v9:y,v10:Z,v11:b,v12:G,v13:V,v14:X,v15:S}}var ft={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},xt=uo.slice(),mo=(()=>{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)})();class Ls extends Ys{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 o=Ze(n).slice();vt(o,32),this.IV=ye(o),it(this.IV),this.flags=e|ft.KEYED_HASH}else if(i){let o=Ze(s),r=new Ls({dkLen:32},ft.DERIVE_KEY_CONTEXT).update(o).digest();this.IV=ye(r),it(this.IV),this.flags=e|ft.DERIVE_KEY_MATERIAL}else this.IV=xt.slice(),this.flags=e;this.state=this.IV.slice(),this.bufferOut=oo(this.bufferOut32)}get(){return[]}set(){}b2Compress(t,e,n,s=0){let{state:i,pos:o}=this,{h:r,l}=Hs(BigInt(t),!0),{v0:a,v1:d,v2:u,v3:p,v4:h,v5:y,v6:Z,v7:b,v8:G,v9:V,v10:X,v11:S,v12:f,v13:W,v14:T,v15:H}=ks(mo,s,n,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],xt[0],xt[1],xt[2],xt[3],r,l,o,e);i[0]=a^G,i[1]=d^V,i[2]=u^X,i[3]=p^S,i[4]=h^f,i[5]=y^W,i[6]=Z^T,i[7]=b^H}compress(t,e=0,n=!1){let s=this.flags;if(!this.chunkPos)s|=ft.CHUNK_START;if(this.chunkPos===15||n)s|=ft.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 o,r=this.chunksDone+1;n||!(r&1);r>>=1){if(!(o=this.stack.pop()))break;this.buffer32.set(o,0),this.buffer32.set(i,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|ft.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:o,chunkOut:r,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=o,t.chunkOut=r,t.enableXOF=this.enableXOF,t.bufferOut32.set(this.bufferOut32),t}destroy(){this.destroyed=!0,be(this.state,this.buffer32,this.IV,this.bufferOut32),be(...this.stack)}b2CompressOut(){let{state:t,pos:e,flags:n,buffer32:s,bufferOut32:i}=this,{h:o,l:r}=Hs(BigInt(this.chunkOut++));it(s);let{v0:l,v1:a,v2:d,v3:u,v4:p,v5:h,v6:y,v7:Z,v8:b,v9:G,v10:V,v11:X,v12:S,v13:f,v14:W,v15:T}=ks(mo,0,s,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],xt[0],xt[1],xt[2],xt[3],r,o,e,n);i[0]=l^b,i[1]=a^G,i[2]=d^V,i[3]=u^X,i[4]=p^S,i[5]=h^f,i[6]=y^W,i[7]=Z^T,i[8]=t[0]^b,i[9]=t[1]^G,i[10]=t[2]^V,i[11]=t[3]^X,i[12]=t[4]^S,i[13]=t[5]^f,i[14]=t[6]^W,i[15]=t[7]^T,it(s),it(i),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,be(this.buffer.subarray(this.pos));let t=this.flags|ft.ROOT;if(this.stack.length)t|=ft.PARENT,it(this.buffer32),this.compress(this.buffer32,0,!0),it(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else t|=(!this.chunkPos?ft.CHUNK_START:0)|ft.CHUNK_END;this.flags=t,this.b2CompressOut()}writeInto(t){Me(this,!1),vt(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 o=Math.min(e-this.posOut,i-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 Le(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(bn(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))}}var ho=ao((t)=>new Ls(t));var Wl=32,eb=Symbol("X25519Sk");function yo(t){if(t.byteLength!==Wl)return c(10);return m(t)}var J=(1n<<255n)-19n,gl=121665n,bo=new Uint8Array(32);bo[0]=9;function Zo(t){let e=0n;for(let n=t.length-1;n>=0;n--)e=e<<8n|BigInt(t[n]);return e}function Kl(t){let e=new Uint8Array(32),n=(t%J+J)%J;for(let s=0;s<32;s++)e[s]=Number(n&0xffn),n>>=8n;return e}function xl(t){let e=t.slice();return e[31]&=127,Zo(e)}function Rl(t){let e=t.slice();return e[0]&=248,e[31]&=127,e[31]|=64,e}function Gn(t,e,n){let s=-t,i=(e^n)&s;return[e^i,n^i]}function Tl(t){let e=J-2n,n=(t%J+J)%J,s=1n;while(e>0n){if(e&1n)s=s*n%J;n=n*n%J,e>>=1n}return s}function Ms(t,e){let n=Rl(t),s=xl(e),i=1n,o=0n,r=s,l=1n,a=0n,d=Zo(n);for(let u=254;u>=0;u--){let p=d>>BigInt(u)&1n;a^=p,[i,r]=Gn(a,i,r),[o,l]=Gn(a,o,l),a=p;let h=(i+o)%J,y=h*h%J,Z=(i-o+J)%J,b=Z*Z%J,G=(y-b+J)%J,V=(r+l)%J,S=(r-l+J)%J*h%J,f=V*Z%J,W=(S+f)%J,T=(S-f+J)%J;r=W*W%J,l=s*T*T%J,i=y*b%J,o=G*(y+gl*G)%J}return[i,r]=Gn(a,i,r),[o,l]=Gn(a,o,l),n.fill(0),Kl(i*Tl(o)%J)}function Go(t){return Ms(t,bo)}var Ps=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Xo(t){let e=new Uint8Array(Ps.length+32);return e.set(Ps),e.set(t.subarray(0,32),Ps.length),e}var ws=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,110,4,34,4,32]);function fo(t){let e=new Uint8Array(ws.length+32);return e.set(ws),e.set(t.subarray(0,32),ws.length),e}function Io(t){return typeof t==="string"?new TextEncoder().encode(t):t}function Rt(t){let e=new ArrayBuffer(t.byteLength);return new Uint8Array(e).set(t),e}class Qt{verifyKeys=new Map;async genRandomBytes(t){return ke(t)}async gen256BitSecureRandomSeed(){return ke(32)}async encryptXSalsa20Poly1305Combined(t,e){let n=ke(24),i=Ts(e,n).encrypt(t);return new Uint8Array([...n,...i])}async decryptXSalsa20Poly1305Combined(t,e){let n=t.slice(0,24),s=t.slice(24);return Ts(e,n).decrypt(s)}async deriveEd25519KeyPair(t){let e=t,n=Xo(e),s=Rt(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 o=i.x;i.d=void 0;let r=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:o},{name:"Ed25519"},!0,["verify"]),l=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",r));this.verifyKeys.set(at(l),r);let a=new Uint8Array(64);return a.set(e,0),a.set(l,32),{keyType:"ed25519",privateKey:a,publicKey:l}}async importSignKey(t){let e=t.subarray(0,32),n=Xo(e),s=Rt(n);try{return await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"Ed25519"},!1,["sign"])}finally{n.fill(0),new Uint8Array(s).fill(0)}}async importVerifyKey(t){let e=at(t),n=this.verifyKeys.get(e);if(n)return n;let s=await globalThis.crypto.subtle.importKey("raw",Rt(t),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(e,s),s}async signEd25519(t,e){let n=Io(t),s=await this.importSignKey(e),i=await globalThis.crypto.subtle.sign({name:"Ed25519"},s,Rt(n));return new Uint8Array(i)}async checkSigEd25519(t,e,n){let s=Io(e);try{let i=await this.importVerifyKey(n);return await globalThis.crypto.subtle.verify({name:"Ed25519"},i,Rt(t),Rt(s))}catch{return!1}}async blake3(t){return ho(t)}async genX25519(){let t=await ke(32);t[0]&=248,t[31]&=127,t[31]|=64;let[e,n]=yo(t);if(n!==0||e===void 0)throw t.fill(0),Error("X25519 scalar brand failed");let s=Go(e),i=fo(e),o=Rt(i);try{let r=await globalThis.crypto.subtle.importKey("pkcs8",o,{name:"X25519"},!0,["deriveBits"]),l=await globalThis.crypto.subtle.exportKey("jwk",r);if(typeof l.x!=="string")throw Error("X25519 JWK missing x");let a=On(l.x);if(l.d=void 0,!B(a,s))throw Error("X25519 WebCrypto pub != RFC 7748");return{priv:e,pub:s}}catch(r){throw e.fill(0),r}finally{i.fill(0),new Uint8Array(o).fill(0)}}async x25519Shared(t,e){let n=fo(t),s=Rt(n);try{let i=await globalThis.crypto.subtle.importKey("pkcs8",s,{name:"X25519"},!1,["deriveBits"]),o=await globalThis.crypto.subtle.importKey("raw",Rt(e),{name:"X25519"},!1,[]),r=await globalThis.crypto.subtle.deriveBits({name:"X25519",public:o},i,256);return new Uint8Array(r)}catch{return Ms(t,e)}finally{n.fill(0),new Uint8Array(s).fill(0)}}}var Cl=new Qt,Ge=Cl;import{useEffect as zn,useState as ii}from"react";class Us{db;constructor(t){this.db=t}async enq(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(pt,"readwrite"),s=n.objectStore(pt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=`${r.host}:${r.seq}`;s.put(r,l)}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(pt,"readwrite"),i=s.objectStore(pt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=`${t}:${l}`;i.delete(a)}})}async list(){let e=this.db.transaction(pt,"readonly").objectStore(pt);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(pt,"readonly").objectStore(pt);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(pt,"readwrite"),e=t.objectStore(pt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}function Vo(t){return{label:t.label,handle:new URL(t.handle),idx:t.idx,lastSeq:t.lastSeq||0,clockOffset:t.clockOffset,subscription:t.subscription}}function Hl(t,e){let n={...t};if(e.setLastSeq!==void 0)n.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0){let s=n.lastSeq||0;if(e.lastSeq>s)n.lastSeq=e.lastSeq}return delete n.numBags,delete n.numDupes,n}class Bs{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);return this.put({...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0})}async put(t){let e={...t,handle:t.handle.toString(),lastSeq:t.lastSeq??0},n=this.db.transaction(ot,"readwrite"),s=n.objectStore(ot);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e)})}async touch(t,e){return this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.db.transaction(ot,"readwrite"),s=n.objectStore(ot);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);let r=s.get(t);r.onsuccess=()=>{let l=r.result;if(!l)return;s.put(Hl(l,e))}})}async get(t){let n=this.db.transaction(ot,"readonly").objectStore(ot);return new Promise((s,i)=>{let o=n.get(t);o.onsuccess=()=>{let r=o.result;if(!r)s(void 0);else s(Vo(r))},o.onerror=()=>i(o.error)})}async set(t,e){let n=await this.get(t);if(!n)return 13;try{return await this.put({...n,...e}),0}catch{return 18}}async del(t){let e=this.db.transaction(ot,"readwrite"),n=e.objectStore(ot);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}async list(){let e=this.db.transaction(ot,"readonly").objectStore(ot);return new Promise((n,s)=>{let i=e.getAll();i.onsuccess=()=>{let o=i.result;n(o.map(Vo))},i.onerror=()=>s(i.error)})}async wipe(){let t=this.db.transaction(ot,"readwrite"),e=t.objectStore(ot);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}class Js{crypto;db;constructor(t,e){this.crypto=e;this.db=t}async add(t){let e=this.db.transaction(v,"readwrite"),n=e.objectStore(v);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 o=0;o<i.length;o++)i[o]=18;s(i)};for(let o=0;o<t.length;o++){let{key:r,data:l}=t[o],a=R(r),d=n.put(l,a);d.onerror=(u)=>{u.preventDefault(),i[o]=18}}})}async del(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=R(r);s.delete(l)}})}async get(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o=R(t),r=n.get(o);r.onsuccess=async()=>{let l=r.result;if(l)s(await Ut(t,l,this.crypto));else s(void 0)},r.onerror=()=>i(r.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(v,"readonly").objectStore(v);return new Promise((o,r)=>{let l=[],a=e===void 0?i.openCursor():i.index(we).openCursor(IDBKeyRange.only(e));a.onsuccess=(d)=>{let u=d.target.result;if(u){let p=e===void 0?u.key:u.primaryKey,h=u.value;l.push({hash:et(p),data:h}),u.continue()}else Promise.all(l.map(({hash:p,data:h})=>Ut(p,h,this.crypto,{body:n}))).then(o).catch(r)},a.onerror=()=>r(a.error)})}async count(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o=t===void 0?n.count():n.index(we).count(IDBKeyRange.only(t));o.onsuccess=()=>s(o.result),o.onerror=()=>i(o.error)})}async listKeys(){let e=this.db.transaction(v,"readonly").objectStore(v);return new Promise((n,s)=>{let i=[],o=e.openKeyCursor();o.onsuccess=(r)=>{let l=r.target.result;if(l)i.push(et(l.key)),l.continue();else n(i)},o.onerror=()=>s(o.error)})}async last(t){let n=this.db.transaction(v,"readonly").objectStore(v);return new Promise((s,i)=>{let o,r=n.openCursor();r.onsuccess=async(l)=>{let a=l.target.result;if(a){let{key:d,value:u}=a;if(B(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=et(o.key);s(await Ut(d,o.data,this.crypto))}else s(void 0)},r.onerror=()=>i(r.error)})}async markApplied(t){let e=[...t];if(e.length===0)return;let n=this.db.transaction(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let r of e){let l=R(r),a=s.get(l);a.onsuccess=()=>{let d=a.result;if(!d)return;Et(d,wt),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(v,"readwrite"),s=n.objectStore(v);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error);for(let{key:r,err:l}of e){let a=R(r),d=s.get(a);d.onsuccess=()=>{let u=d.result;if(!u)return;Et(u,Gt,l),s.put(u,a)},d.onerror=(u)=>{u.preventDefault()}}})}async wipe(){let t=this.db.transaction(v,"readwrite"),e=t.objectStore(v);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var Xn={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[o,r]=t.readVarInt();if(r!==0)return c(r);return m({handle:e,label:s,idx:o})}};var zs={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(Xn,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[o,r]=t.readStruct(Xn);if(r!==0)return c(r);if(o===void 0)return c(14);s.push(o)}return m({hosts:s})}};var Yl=new TextEncoder().encode("diplomatic.qrpair.v1"),Ue=32,kl=Ue+24+16,Ll=32,zb=Symbol("DHKEReq"),Nb=Symbol("DHKEResp");function Ns(t){if(t.byteLength!==Ue)return c(10);return m(t)}function Es(t){if(t.byteLength<kl)return c(10);return m(t)}var fn=new Qt;async function Fs(t,e,n,s){let i;try{i=await fn.x25519Shared(t,e)}catch{return c(29)}try{if(i.byteLength!==Ue||i.every((l)=>l===0))return c(10);let o=Zt(i,Yl),r=Zt(o,Zt(n,s));try{let l=await fn.blake3(r);return m(l.slice(0,Ll))}finally{o.fill(0),r.fill(0)}}finally{i.fill(0)}}class Be{#t;#e;constructor(t,e){this.#t=t,this.#e=e}static async create(){let t;try{let e=await fn.genX25519();t=e.priv;let[n,s]=Ns(e.pub);if(s!==0)return c(s);if(n===void 0)return c(10);let i=new Be(t,n);return t=void 0,m(i)}catch{return c(29)}finally{t?.fill(0)}}wipe(){this.#t.fill(0)}get dhkeReq(){let[t,e]=Ns(this.#e.slice());if(t===void 0)throw Error(`dhkeReq ${e}`);return t}async finish(t){let e=t.subarray(0,Ue),n=t.subarray(Ue),[s,i]=await Fs(this.#t,e,this.#e,e);if(i!==0)return c(i);if(s===void 0)return c(12);let o;try{try{o=await fn.decryptXSalsa20Poly1305Combined(n,s)}catch{return c(20)}let[r,l]=tt.fromPairPlain(o);if(l!==0)return c(l);if(r===void 0)return c(12);return this.wipe(),m(r)}finally{s.fill(0),o?.fill(0)}}}function Tt(t){let e=new Uint8Array(t);if(t>0)crypto.getRandomValues(e);return e}var Dt=32,In="DIPLOMATIC",It="public-key",Ml=-7,Pl=-8,wl=-257,Vn=[{type:It,alg:Ml},{type:It,alg:Pl},{type:It,alg:wl}];function go(t){return t.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function Bt(t){let e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}function Sn(t){if(t instanceof ArrayBuffer)return new Uint8Array(t).slice();return new Uint8Array(t.buffer,t.byteOffset,t.byteLength).slice()}function Ot(t){if(t?.rpId!==void 0)return m(t.rpId);if(typeof location>"u")return c(9);return m(go(location.hostname))}var Qs="";function Ul(){return Qs}function Jt(t){if(t instanceof Error){Qs=t.message===""?t.name:`${t.name}: ${t.message}`;return}Qs=String(t)}function Wn(t){if(!(t instanceof Error))return!1;return t.name==="NotAllowedError"&&t.message.toLowerCase().includes("does not have focus")}function So(){if(typeof document>"u")return!0;return document.visibilityState!=="hidden"}function Xe(){if(typeof globalThis.focus!=="function")return;try{globalThis.focus()}catch{}}function gn(t=2500){if(So())return Xe(),Promise.resolve();return new Promise((e)=>{let n=()=>{clearTimeout(i),document.removeEventListener("visibilitychange",s),Xe(),e()},s=()=>{if(So())n()},i=setTimeout(n,t);document.addEventListener("visibilitychange",s),s()})}async function Kn(t){await gn();try{return await navigator.credentials.create(t)}catch(e){if(!Wn(e))throw e;return Xe(),await navigator.credentials.create(t)}}async function xn(t){await gn();try{return await navigator.credentials.get(t)}catch(e){if(!Wn(e))throw e;return Xe(),await navigator.credentials.get(t)}}function jt(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function At(t){if(t===null||t.type!==It||!("rawId"in t)||typeof t.getClientExtensionResults!=="function")return c(27);return m(t)}async function Rn(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 Ds(t){if(t==="platform"||t==="cross-platform")return t;return}function Ko(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 Os(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 o of s)if(typeof o==="string"&&o.length>0)i.push(o);return i.length===0?void 0:i}var Bl=32,Jl=64,vs=37,Wo=16;function xo(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<vs+Wo)return;let o=i[Bl];if(o===void 0||(o&Jl)===0)return;return i.slice(vs,vs+Wo)}function zl(){return Rn("extension:largeBlob")}async function Ro(t){let e=jt();if(e!==0)return c(e);let[n,s]=Ot(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.userName??t?.rpName??n,o={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(t?.authenticatorAttachment!==void 0)o.authenticatorAttachment=t.authenticatorAttachment;let r={largeBlob:{support:"required"}},l;try{l=await Kn({publicKey:{challenge:Tt(Dt),rp:{id:n,name:t?.rpName??In},user:{id:Tt(16),name:i,displayName:i},pubKeyCredParams:Vn,authenticatorSelection:o,extensions:r,...t?.hints!==void 0?{hints:t.hints}:{}}})}catch(p){return Jt(p),c(30)}let[a,d]=At(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 js(t,e,n,s){let i={challenge:Tt(Dt),rpId:t,userVerification:"preferred"};if(e?.hints!==void 0)i.hints=e.hints;if(n!==void 0)i.allowCredentials=[{type:It,id:Bt(n)}];if(s!==void 0)i.extensions=s;let o;try{o=await xn({publicKey:i})}catch(a){return Jt(a),c(30)}let[r,l]=At(o);if(l!==0)return c(l);if(r===void 0)return c(27);return m(r)}async function To(t,e){let n=jt();if(n!==0)return c(n);let[s,i]=Ot(e);if(i!==0)return c(i);if(s===void 0)return c(9);let o=t;if(o===void 0){let[p,h]=await js(s,e);if(h!==0&&e?.hints!==void 0)[p,h]=await js(s,{rpId:e.rpId,rpName:e.rpName});if(h!==0)return c(h);if(p===void 0)return c(27);o=new Uint8Array(p.rawId)}let[r,l]=await js(s,e,o,{largeBlob:{read:!0}});if(l!==0)return c(l);if(r===void 0)return c(27);let d=r.getClientExtensionResults().largeBlob;if(d===void 0||d.blob===void 0)return c(7);let u=Sn(d.blob);if(u.byteLength===0)return c(7);return m({blob:u,credId:new Uint8Array(r.rawId)})}var Tn=new TextEncoder().encode("diplomatic.prf.v1"),Je="diplomatic-prf";async function Nl(){return Rn("extension:prf")}var Cn="dmFyIEJlPTY0O3ZhciBNbj0zMix2ZT04O3ZhciBVdD0zMjt2YXIgUm49MzAwMDAsTG49NTEyLFU7KChJKT0+e0lbSS5TdWNjZXNzPTBdPSJTdWNjZXNzIjtJW0kuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7SVtJLkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7SVtJLlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7SVtJLlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO0lbSS5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO0lbSS5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50IjtJW0kuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO0lbSS5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO0lbSS5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0IjtJW0kuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO0lbSS5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjtJW0kuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7SVtJLk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO0lbSS5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjtJW0kuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjtJW0kuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO0lbSS5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO0lbSS5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO0lbSS5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjtJW0kuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7SVtJLk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO0lbSS5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO0lbSS5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO0lbSS5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7SVtJLkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7SVtJLkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIjtJW0kuQ3J5cHRvRXJyb3I9MjldPSJDcnlwdG9FcnJvciI7SVtJLldlYkF1dGhuRXJyb3I9MzBdPSJXZWJBdXRobkVycm9yIn0pKFV8fD17fSk7ZnVuY3Rpb24gS24oZSl7aWYoIWV8fHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gZSl8fCEoImlkImluIGUpKXJldHVybiExO3JldHVybiB0eXBlb2YgZS5vcD09PSJzdHJpbmciJiZ0eXBlb2YgZS5pZD09PSJudW1iZXIifWZ1bmN0aW9uIE9uKGUpe2xldCB0PWUubGVuZ3RoLHI9MCxuPTA7d2hpbGUobjx0KXtsZXQgcz1lLmNoYXJDb2RlQXQobisrKTtpZigocyY0Mjk0OTY3MTY4KT09PTApe3IrKztjb250aW51ZX1lbHNlIGlmKChzJjQyOTQ5NjUyNDgpPT09MClyKz0yO2Vsc2V7aWYocz49NTUyOTYmJnM8PTU2MzE5KXtpZihuPHQpe2xldCBpPWUuY2hhckNvZGVBdChuKTtpZigoaSY2NDUxMik9PT01NjMyMCkrK24scz0oKHMmMTAyMyk8PDEwKSsoaSYxMDIzKSs2NTUzNn19aWYoKHMmNDI5NDkwMTc2MCk9PT0wKXIrPTM7ZWxzZSByKz00fX1yZXR1cm4gcn1mdW5jdGlvbiBIaShlLHQscil7bGV0IG49ZS5sZW5ndGgscz1yLGk9MDt3aGlsZShpPG4pe2xldCBvPWUuY2hhckNvZGVBdChpKyspO2lmKChvJjQyOTQ5NjcxNjgpPT09MCl7dFtzKytdPW87Y29udGludWV9ZWxzZSBpZigobyY0Mjk0OTY1MjQ4KT09PTApdFtzKytdPW8+PjYmMzF8MTkyO2Vsc2V7aWYobz49NTUyOTYmJm88PTU2MzE5KXtpZihpPG4pe2xldCBhPWUuY2hhckNvZGVBdChpKTtpZigoYSY2NDUxMik9PT01NjMyMCkrK2ksbz0oKG8mMTAyMyk8PDEwKSsoYSYxMDIzKSs2NTUzNn19aWYoKG8mNDI5NDkwMTc2MCk9PT0wKXRbcysrXT1vPj4xMiYxNXwyMjQsdFtzKytdPW8+PjYmNjN8MTI4O2Vsc2UgdFtzKytdPW8+PjE4Jjd8MjQwLHRbcysrXT1vPj4xMiY2M3wxMjgsdFtzKytdPW8+PjYmNjN8MTI4fXRbcysrXT1vJjYzfDEyOH19dmFyIE1pPW5ldyBUZXh0RW5jb2RlcixSaT01MDtmdW5jdGlvbiBMaShlLHQscil7TWkuZW5jb2RlSW50byhlLHQuc3ViYXJyYXkocikpfWZ1bmN0aW9uIFZuKGUsdCxyKXtpZihlLmxlbmd0aD5SaSlMaShlLHQscik7ZWxzZSBIaShlLHQscil9dmFyIEtpPTQwOTY7ZnVuY3Rpb24gU3IoZSx0LHIpe2xldCBuPXQscz1uK3IsaT1bXSxvPSIiO3doaWxlKG48cyl7bGV0IGE9ZVtuKytdO2lmKChhJjEyOCk9PT0wKWkucHVzaChhKTtlbHNlIGlmKChhJjIyNCk9PT0xOTIpe2xldCBkPWVbbisrXSY2MztpLnB1c2goKGEmMzEpPDw2fGQpfWVsc2UgaWYoKGEmMjQwKT09PTIyNCl7bGV0IGQ9ZVtuKytdJjYzLHU9ZVtuKytdJjYzO2kucHVzaCgoYSYzMSk8PDEyfGQ8PDZ8dSl9ZWxzZSBpZigoYSYyNDgpPT09MjQwKXtsZXQgZD1lW24rK10mNjMsdT1lW24rK10mNjMsbD1lW24rK10mNjMsZj0oYSY3KTw8MTh8ZDw8MTJ8dTw8NnxsO2lmKGY+NjU1MzUpZi09NjU1MzYsaS5wdXNoKGY+Pj4xMCYxMDIzfDU1Mjk2KSxmPTU2MzIwfGYmMTAyMztpLnB1c2goZil9ZWxzZSBpLnB1c2goYSk7aWYoaS5sZW5ndGg+PUtpKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSksaS5sZW5ndGg9MH1pZihpLmxlbmd0aD4wKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uaSk7cmV0dXJuIG99dmFyIE9pPW5ldyBUZXh0RGVjb2RlcixWaT0yMDA7ZnVuY3Rpb24gX2koZSx0LHIpe2xldCBuPWUuc3ViYXJyYXkodCx0K3IpO3JldHVybiBPaS5kZWNvZGUobil9ZnVuY3Rpb24gX24oZSx0LHIpe2lmKHI+VmkpcmV0dXJuIF9pKGUsdCxyKTtlbHNlIHJldHVybiBTcihlLHQscil9Y2xhc3MgR2V7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIGVlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9T2JqZWN0LmNyZWF0ZShlZS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ZWUubmFtZX0pfX12YXIgUWU9NDI5NDk2NzI5NTtmdW5jdGlvbiBObihlLHQscil7bGV0IG49ci80Mjk0OTY3Mjk2LHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBrdChlLHQscil7bGV0IG49TWF0aC5mbG9vcihyLzQyOTQ5NjcyOTYpLHM9cjtlLnNldFVpbnQzMih0LG4pLGUuc2V0VWludDMyKHQrNCxzKX1mdW5jdGlvbiBCdChlLHQpe2xldCByPWUuZ2V0SW50MzIodCksbj1lLmdldFVpbnQzMih0KzQpO3JldHVybiByKjQyOTQ5NjcyOTYrbn1mdW5jdGlvbiBxbihlLHQpe2xldCByPWUuZ2V0VWludDMyKHQpLG49ZS5nZXRVaW50MzIodCs0KTtyZXR1cm4gcio0Mjk0OTY3Mjk2K259dmFyIE5pPS0xLHFpPTQyOTQ5NjcyOTUsRmk9MTcxNzk4NjkxODM7ZnVuY3Rpb24gV2koe3NlYzplLG5zZWM6dH0pe2lmKGU+PTAmJnQ+PTAmJmU8PUZpKWlmKHQ9PT0wJiZlPD1xaSl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhyLmJ1ZmZlcikuc2V0VWludDMyKDAsZSkscn1lbHNle2xldCByPWUvNDI5NDk2NzI5NixuPWUmNDI5NDk2NzI5NSxzPW5ldyBVaW50OEFycmF5KDgpLGk9bmV3IERhdGFWaWV3KHMuYnVmZmVyKTtyZXR1cm4gaS5zZXRVaW50MzIoMCx0PDwyfHImMyksaS5zZXRVaW50MzIoNCxuKSxzfWVsc2V7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoMTIpLG49bmV3IERhdGFWaWV3KHIuYnVmZmVyKTtyZXR1cm4gbi5zZXRVaW50MzIoMCx0KSxrdChuLDQsZSkscn19ZnVuY3Rpb24gemkoZSl7bGV0IHQ9ZS5nZXRUaW1lKCkscj1NYXRoLmZsb29yKHQvMTAwMCksbj0odC1yKjEwMDApKjFlNixzPU1hdGguZmxvb3Iobi8xZTkpO3JldHVybntzZWM6citzLG5zZWM6bi1zKjFlOX19ZnVuY3Rpb24gWGkoZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCB0PXppKGUpO3JldHVybiBXaSh0KX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIGppKGUpe2xldCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCByPXQuZ2V0VWludDMyKDApLG49MDtyZXR1cm57c2VjOnIsbnNlYzowfX1jYXNlIDg6e2xldCByPXQuZ2V0VWludDMyKDApLG49dC5nZXRVaW50MzIoNCkscz0ociYzKSo0Mjk0OTY3Mjk2K24saT1yPj4+MjtyZXR1cm57c2VjOnMsbnNlYzppfX1jYXNlIDEyOntsZXQgcj1CdCh0LDQpLG49dC5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpyLG5zZWM6bn19ZGVmYXVsdDp0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCBkYXRhIHNpemUgZm9yIHRpbWVzdGFtcCAoZXhwZWN0ZWQgNCwgOCwgb3IgMTIpOiAke2UubGVuZ3RofWApfX1mdW5jdGlvbiAkaShlKXtsZXQgdD1qaShlKTtyZXR1cm4gbmV3IERhdGUodC5zZWMqMTAwMCt0Lm5zZWMvMWU2KX12YXIgRm49e3R5cGU6TmksZW5jb2RlOlhpLGRlY29kZTokaX07Y2xhc3MgWWV7c3RhdGljIGRlZmF1bHRDb2RlYz1uZXcgWWU7X19icmFuZDtidWlsdEluRW5jb2RlcnM9W107YnVpbHRJbkRlY29kZXJzPVtdO2VuY29kZXJzPVtdO2RlY29kZXJzPVtdO2NvbnN0cnVjdG9yKCl7dGhpcy5yZWdpc3RlcihGbil9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6cn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09cjtlbHNle2xldCBuPS0xLWU7dGhpcy5idWlsdEluRW5jb2RlcnNbbl09dCx0aGlzLmJ1aWx0SW5EZWNvZGVyc1tuXT1yfX10cnlUb0VuY29kZShlLHQpe2ZvcihsZXQgcj0wO3I8dGhpcy5idWlsdEluRW5jb2RlcnMubGVuZ3RoO3IrKyl7bGV0IG49dGhpcy5idWlsdEluRW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpe2xldCBpPS0xLXI7cmV0dXJuIG5ldyBHZShpLHMpfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2xldCBuPXRoaXMuZW5jb2RlcnNbcl07aWYobiE9bnVsbCl7bGV0IHM9bihlLHQpO2lmKHMhPW51bGwpcmV0dXJuIG5ldyBHZShyLHMpfX1pZihlIGluc3RhbmNlb2YgR2UpcmV0dXJuIGU7cmV0dXJuIG51bGx9ZGVjb2RlKGUsdCxyKXtsZXQgbj10PDA/dGhpcy5idWlsdEluRGVjb2RlcnNbLTEtdF06dGhpcy5kZWNvZGVyc1t0XTtpZihuKXJldHVybiBuKGUsdCxyKTtlbHNlIHJldHVybiBuZXcgR2UodCxlKX19ZnVuY3Rpb24gR2koZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1IiYmZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyfWZ1bmN0aW9uIGR0KGUpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBlO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtlbHNlIGlmKEdpKGUpKXJldHVybiBuZXcgVWludDhBcnJheShlKTtlbHNlIHJldHVybiBVaW50OEFycmF5LmZyb20oZSl9dmFyIFFpPTEwMCxZaT0yMDQ4O2NsYXNzIHZ0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7bWF4RGVwdGg7aW5pdGlhbEJ1ZmZlclNpemU7c29ydEtleXM7Zm9yY2VGbG9hdDMyO2lnbm9yZVVuZGVmaW5lZDtmb3JjZUludGVnZXJUb0Zsb2F0O3Bvczt2aWV3O2J5dGVzO2VudGVyZWQ9ITE7Y29uc3RydWN0b3IoZSl7dGhpcy5leHRlbnNpb25Db2RlYz1lPy5leHRlbnNpb25Db2RlYz8/WWUuZGVmYXVsdENvZGVjLHRoaXMuY29udGV4dD1lPy5jb250ZXh0LHRoaXMudXNlQmlnSW50NjQ9ZT8udXNlQmlnSW50NjQ/PyExLHRoaXMubWF4RGVwdGg9ZT8ubWF4RGVwdGg/P1FpLHRoaXMuaW5pdGlhbEJ1ZmZlclNpemU9ZT8uaW5pdGlhbEJ1ZmZlclNpemU/P1lpLHRoaXMuc29ydEtleXM9ZT8uc29ydEtleXM/PyExLHRoaXMuZm9yY2VGbG9hdDMyPWU/LmZvcmNlRmxvYXQzMj8/ITEsdGhpcy5pZ25vcmVVbmRlZmluZWQ9ZT8uaWdub3JlVW5kZWZpbmVkPz8hMSx0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQ9ZT8uZm9yY2VJbnRlZ2VyVG9GbG9hdD8/ITEsdGhpcy5wb3M9MCx0aGlzLnZpZXc9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcih0aGlzLmluaXRpYWxCdWZmZXJTaXplKSksdGhpcy5ieXRlcz1uZXcgVWludDhBcnJheSh0aGlzLnZpZXcuYnVmZmVyKX1jbG9uZSgpe3JldHVybiBuZXcgdnQoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGVTaGFyZWRSZWYoZSk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnN1YmFycmF5KDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1lbmNvZGUoZSl7aWYodGhpcy5lbnRlcmVkKXJldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlKGUpO3RyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zbGljZSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9FbmNvZGUoZSx0KXtpZih0PnRoaXMubWF4RGVwdGgpdGhyb3cgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO2lmKGU9PW51bGwpdGhpcy5lbmNvZGVOaWwoKTtlbHNlIGlmKHR5cGVvZiBlPT09ImJvb2xlYW4iKXRoaXMuZW5jb2RlQm9vbGVhbihlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im51bWJlciIpaWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCl0aGlzLmVuY29kZU51bWJlcihlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIGlmKHR5cGVvZiBlPT09InN0cmluZyIpdGhpcy5lbmNvZGVTdHJpbmcoZSk7ZWxzZSBpZih0aGlzLnVzZUJpZ0ludDY0JiZ0eXBlb2YgZT09PSJiaWdpbnQiKXRoaXMuZW5jb2RlQmlnSW50NjQoZSk7ZWxzZSB0aGlzLmVuY29kZU9iamVjdChlLHQpfWVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKGUpe2xldCB0PXRoaXMucG9zK2U7aWYodGhpcy52aWV3LmJ5dGVMZW5ndGg8dCl0aGlzLnJlc2l6ZUJ1ZmZlcih0KjIpfXJlc2l6ZUJ1ZmZlcihlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZSkscj1uZXcgVWludDhBcnJheSh0KSxuPW5ldyBEYXRhVmlldyh0KTtyLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9bix0aGlzLmJ5dGVzPXJ9ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXtpZihlPT09ITEpdGhpcy53cml0ZVU4KDE5NCk7ZWxzZSB0aGlzLndyaXRlVTgoMTk1KX1lbmNvZGVOdW1iZXIoZSl7aWYoIXRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdCYmTnVtYmVyLmlzU2FmZUludGVnZXIoZSkpaWYoZT49MClpZihlPDEyOCl0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZSBpZihlPDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKTtlbHNlIGlmKCF0aGlzLnVzZUJpZ0ludDY0KXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSk7ZWxzZSB0aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk7ZWxzZSBpZihlPj0tMzIpdGhpcy53cml0ZVU4KDIyNHxlKzMyKTtlbHNlIGlmKGU+PS0xMjgpdGhpcy53cml0ZVU4KDIwOCksdGhpcy53cml0ZUk4KGUpO2Vsc2UgaWYoZT49LTMyNzY4KXRoaXMud3JpdGVVOCgyMDkpLHRoaXMud3JpdGVJMTYoZSk7ZWxzZSBpZihlPj0tMjE0NzQ4MzY0OCl0aGlzLndyaXRlVTgoMjEwKSx0aGlzLndyaXRlSTMyKGUpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUk2NChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe2lmKHRoaXMuZm9yY2VGbG9hdDMyKXRoaXMud3JpdGVVOCgyMDIpLHRoaXMud3JpdGVGMzIoZSk7ZWxzZSB0aGlzLndyaXRlVTgoMjAzKSx0aGlzLndyaXRlRjY0KGUpfWVuY29kZUJpZ0ludDY0KGUpe2lmKGU+PUJpZ0ludCgwKSl0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpO2Vsc2UgdGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpfXdyaXRlU3RyaW5nSGVhZGVyKGUpe2lmKGU8MzIpdGhpcy53cml0ZVU4KDE2MCtlKTtlbHNlIGlmKGU8MjU2KXRoaXMud3JpdGVVOCgyMTcpLHRoaXMud3JpdGVVOChlKTtlbHNlIGlmKGU8NjU1MzYpdGhpcy53cml0ZVU4KDIxOCksdGhpcy53cml0ZVUxNihlKTtlbHNlIGlmKGU8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsb25nIHN0cmluZzogJHtlfSBieXRlcyBpbiBVVEYtOGApfWVuY29kZVN0cmluZyhlKXtsZXQgcj1PbihlKTt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDUrciksdGhpcy53cml0ZVN0cmluZ0hlYWRlcihyKSxWbihlLHRoaXMuYnl0ZXMsdGhpcy5wb3MpLHRoaXMucG9zKz1yfWVuY29kZU9iamVjdChlLHQpe2xldCByPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKHIhPW51bGwpdGhpcy5lbmNvZGVFeHRlbnNpb24ocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNlIGlmKHR5cGVvZiBlPT09Im9iamVjdCIpdGhpcy5lbmNvZGVNYXAoZSx0KTtlbHNlIHRocm93IEVycm9yKGBVbnJlY29nbml6ZWQgb2JqZWN0OiAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkoZSl9YCl9ZW5jb2RlQmluYXJ5KGUpe2xldCB0PWUuYnl0ZUxlbmd0aDtpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk2KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgxOTcpLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDE5OCksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgYmluYXJ5OiAke3R9YCk7bGV0IHI9ZHQoZSk7dGhpcy53cml0ZVU4YShyKX1lbmNvZGVBcnJheShlLHQpe2xldCByPWUubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDE0NCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihyKTtlbHNlIGlmKHI8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIxKSx0aGlzLndyaXRlVTMyKHIpO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtyfWApO2ZvcihsZXQgbiBvZiBlKXRoaXMuZG9FbmNvZGUobix0KzEpfWNvdW50V2l0aG91dFVuZGVmaW5lZChlLHQpe2xldCByPTA7Zm9yKGxldCBuIG9mIHQpaWYoZVtuXSE9PXZvaWQgMClyKys7cmV0dXJuIHJ9ZW5jb2RlTWFwKGUsdCl7bGV0IHI9T2JqZWN0LmtleXMoZSk7aWYodGhpcy5zb3J0S2V5cylyLnNvcnQoKTtsZXQgbj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLHIpOnIubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDEyOCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihuKTtlbHNlIGlmKG48NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjIzKSx0aGlzLndyaXRlVTMyKG4pO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke259YCk7Zm9yKGxldCBzIG9mIHIpe2xldCBpPWVbc107aWYoISh0aGlzLmlnbm9yZVVuZGVmaW5lZCYmaT09PXZvaWQgMCkpdGhpcy5lbmNvZGVTdHJpbmcocyksdGhpcy5kb0VuY29kZShpLHQrMSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZih0eXBlb2YgZS5kYXRhPT09ImZ1bmN0aW9uIil7bGV0IHI9ZS5kYXRhKHRoaXMucG9zKzYpLG49ci5sZW5ndGg7aWYobj49NDI5NDk2NzI5Nil0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGV4dGVuc2lvbiBvYmplY3Q6ICR7bn1gKTt0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEocik7cmV0dXJufWxldCB0PWUuZGF0YS5sZW5ndGg7aWYodD09PTEpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZih0PT09Mil0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKHQ9PT00KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYodD09PTgpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZih0PT09MTYpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZSBpZih0PDQyOTQ5NjcyOTYpdGhpcy53cml0ZVU4KDIwMSksdGhpcy53cml0ZVUzMih0KTtlbHNlIHRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVJOChlLnR5cGUpLHRoaXMud3JpdGVVOGEoZS5kYXRhKX13cml0ZVU4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldFVpbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVOGEoZSl7bGV0IHQ9ZS5sZW5ndGg7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSh0KSx0aGlzLmJ5dGVzLnNldChlLHRoaXMucG9zKSx0aGlzLnBvcys9dH13cml0ZUk4KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMSksdGhpcy52aWV3LnNldEludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVUxNihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRVaW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVJMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0SW50MTYodGhpcy5wb3MsZSksdGhpcy5wb3MrPTJ9d3JpdGVVMzIoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0VWludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlSTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEludDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldEZsb2F0MzIodGhpcy5wb3MsZSksdGhpcy5wb3MrPTR9d3JpdGVGNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSx0aGlzLnZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZVU2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLE5uKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUk2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLGt0KHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19ZnVuY3Rpb24gTWUoZSx0KXtyZXR1cm4gbmV3IHZ0KHQpLmVuY29kZVNoYXJlZFJlZihlKX1mdW5jdGlvbiBEdChlKXtyZXR1cm5gJHtlPDA/Ii0iOiIifTB4JHtNYXRoLmFicyhlKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfWB9dmFyIEppPTE2LFppPTE2O2NsYXNzIGJye2hpdD0wO21pc3M9MDtjYWNoZXM7bWF4S2V5TGVuZ3RoO21heExlbmd0aFBlcktleTtjb25zdHJ1Y3RvcihlPUppLHQ9Wmkpe3RoaXMubWF4S2V5TGVuZ3RoPWUsdGhpcy5tYXhMZW5ndGhQZXJLZXk9dCx0aGlzLmNhY2hlcz1bXTtmb3IobGV0IHI9MDtyPHRoaXMubWF4S2V5TGVuZ3RoO3IrKyl0aGlzLmNhY2hlcy5wdXNoKFtdKX1jYW5CZUNhY2hlZChlKXtyZXR1cm4gZT4wJiZlPD10aGlzLm1heEtleUxlbmd0aH1maW5kKGUsdCxyKXtsZXQgbj10aGlzLmNhY2hlc1tyLTFdO2U6Zm9yKGxldCBzIG9mIG4pe2xldCBpPXMuYnl0ZXM7Zm9yKGxldCBvPTA7bzxyO28rKylpZihpW29dIT09ZVt0K29dKWNvbnRpbnVlIGU7cmV0dXJuIHMuc3RyfXJldHVybiBudWxsfXN0b3JlKGUsdCl7bGV0IHI9dGhpcy5jYWNoZXNbZS5sZW5ndGgtMV0sbj17Ynl0ZXM6ZSxzdHI6dH07aWYoci5sZW5ndGg+PXRoaXMubWF4TGVuZ3RoUGVyS2V5KXJbTWF0aC5yYW5kb20oKSpyLmxlbmd0aHwwXT1uO2Vsc2Ugci5wdXNoKG4pfWRlY29kZShlLHQscil7bGV0IG49dGhpcy5maW5kKGUsdCxyKTtpZihuIT1udWxsKXJldHVybiB0aGlzLmhpdCsrLG47dGhpcy5taXNzKys7bGV0IHM9U3IoZSx0LHIpLGk9VWludDhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLHQsdCtyKTtyZXR1cm4gdGhpcy5zdG9yZShpLHMpLHN9fXZhciB3cj0iYXJyYXkiLGx0PSJtYXBfa2V5Iix6bj0ibWFwX3ZhbHVlIixlbz0oZSk9PntpZih0eXBlb2YgZT09PSJzdHJpbmcifHx0eXBlb2YgZT09PSJudW1iZXIiKXJldHVybiBlO3Rocm93IG5ldyBlZSgiVGhlIHR5cGUgb2Yga2V5IG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciBidXQgIit0eXBlb2YgZSl9O2NsYXNzIFhue3N0YWNrPVtdO3N0YWNrSGVhZFBvc2l0aW9uPS0xO2dldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5zdGFja0hlYWRQb3NpdGlvbisxfXRvcCgpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXB1c2hBcnJheVN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9d3IsdC5wb3NpdGlvbj0wLHQuc2l6ZT1lLHQuYXJyYXk9QXJyYXkoZSl9cHVzaE1hcFN0YXRlKGUpe2xldCB0PXRoaXMuZ2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKTt0LnR5cGU9bHQsdC5yZWFkQ291bnQ9MCx0LnNpemU9ZSx0Lm1hcD17fX1nZXRVbmluaXRpYWxpemVkU3RhdGVGcm9tUG9vbCgpe2lmKHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rKyx0aGlzLnN0YWNrSGVhZFBvc2l0aW9uPT09dGhpcy5zdGFjay5sZW5ndGgpe2xldCBlPXt0eXBlOnZvaWQgMCxzaXplOjAsYXJyYXk6dm9pZCAwLHBvc2l0aW9uOjAscmVhZENvdW50OjAsbWFwOnZvaWQgMCxrZXk6bnVsbH07dGhpcy5zdGFjay5wdXNoKGUpfXJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2tIZWFkUG9zaXRpb25dfXJlbGVhc2UoZSl7aWYodGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXSE9PWUpdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhY2sgc3RhdGUuIFJlbGVhc2VkIHN0YXRlIGlzIG5vdCBvbiB0b3Agb2YgdGhlIHN0YWNrLiIpO2lmKGUudHlwZT09PXdyKXtsZXQgcj1lO3Iuc2l6ZT0wLHIuYXJyYXk9dm9pZCAwLHIucG9zaXRpb249MCxyLnR5cGU9dm9pZCAwfWlmKGUudHlwZT09PWx0fHxlLnR5cGU9PT16bil7bGV0IHI9ZTtyLnNpemU9MCxyLm1hcD12b2lkIDAsci5yZWFkQ291bnQ9MCxyLnR5cGU9dm9pZCAwfXRoaXMuc3RhY2tIZWFkUG9zaXRpb24tLX1yZXNldCgpe3RoaXMuc3RhY2subGVuZ3RoPTAsdGhpcy5zdGFja0hlYWRQb3NpdGlvbj0tMX19dmFyIHV0PS0xLElyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpLHRvPW5ldyBVaW50OEFycmF5KElyLmJ1ZmZlcik7dHJ5e0lyLmdldEludDgoMCl9Y2F0Y2goZSl7aWYoIShlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgRXJyb3IoIlRoaXMgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgSmF2YVNjcmlwdCBlbmdpbmUgYmVjYXVzZSBEYXRhVmlldyBkb2VzIG5vdCB0aHJvdyBSYW5nZUVycm9yIG9uIG91dC1vZi1ib3VuZHMgYWNjZXNzIil9dmFyIFduPVJhbmdlRXJyb3IoIkluc3VmZmljaWVudCBkYXRhIikscm89bmV3IGJyO2NsYXNzIEN0e2V4dGVuc2lvbkNvZGVjO2NvbnRleHQ7dXNlQmlnSW50NjQ7cmF3U3RyaW5nczttYXhTdHJMZW5ndGg7bWF4QmluTGVuZ3RoO21heEFycmF5TGVuZ3RoO21heE1hcExlbmd0aDttYXhFeHRMZW5ndGg7a2V5RGVjb2RlcjttYXBLZXlDb252ZXJ0ZXI7dG90YWxQb3M9MDtwb3M9MDt2aWV3PUlyO2J5dGVzPXRvO2hlYWRCeXRlPXV0O3N0YWNrPW5ldyBYbjtlbnRlcmVkPSExO2NvbnN0cnVjdG9yKGUpe3RoaXMuZXh0ZW5zaW9uQ29kZWM9ZT8uZXh0ZW5zaW9uQ29kZWM/P1llLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLnJhd1N0cmluZ3M9ZT8ucmF3U3RyaW5ncz8/ITEsdGhpcy5tYXhTdHJMZW5ndGg9ZT8ubWF4U3RyTGVuZ3RoPz9RZSx0aGlzLm1heEJpbkxlbmd0aD1lPy5tYXhCaW5MZW5ndGg/P1FlLHRoaXMubWF4QXJyYXlMZW5ndGg9ZT8ubWF4QXJyYXlMZW5ndGg/P1FlLHRoaXMubWF4TWFwTGVuZ3RoPWU/Lm1heE1hcExlbmd0aD8/UWUsdGhpcy5tYXhFeHRMZW5ndGg9ZT8ubWF4RXh0TGVuZ3RoPz9RZSx0aGlzLmtleURlY29kZXI9ZT8ua2V5RGVjb2RlciE9PXZvaWQgMD9lLmtleURlY29kZXI6cm8sdGhpcy5tYXBLZXlDb252ZXJ0ZXI9ZT8ubWFwS2V5Q29udmVydGVyPz9lb31jbG9uZSgpe3JldHVybiBuZXcgQ3Qoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxyYXdTdHJpbmdzOnRoaXMucmF3U3RyaW5ncyxtYXhTdHJMZW5ndGg6dGhpcy5tYXhTdHJMZW5ndGgsbWF4QmluTGVuZ3RoOnRoaXMubWF4QmluTGVuZ3RoLG1heEFycmF5TGVuZ3RoOnRoaXMubWF4QXJyYXlMZW5ndGgsbWF4TWFwTGVuZ3RoOnRoaXMubWF4TWFwTGVuZ3RoLG1heEV4dExlbmd0aDp0aGlzLm1heEV4dExlbmd0aCxrZXlEZWNvZGVyOnRoaXMua2V5RGVjb2Rlcn0pfXJlaW5pdGlhbGl6ZVN0YXRlKCl7dGhpcy50b3RhbFBvcz0wLHRoaXMuaGVhZEJ5dGU9dXQsdGhpcy5zdGFjay5yZXNldCgpfXNldEJ1ZmZlcihlKXtsZXQgdD1kdChlKTt0aGlzLmJ5dGVzPXQsdGhpcy52aWV3PW5ldyBEYXRhVmlldyh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSx0aGlzLnBvcz0wfWFwcGVuZEJ1ZmZlcihlKXtpZih0aGlzLmhlYWRCeXRlPT09dXQmJiF0aGlzLmhhc1JlbWFpbmluZygxKSl0aGlzLnNldEJ1ZmZlcihlKTtlbHNle2xldCB0PXRoaXMuYnl0ZXMuc3ViYXJyYXkodGhpcy5wb3MpLHI9ZHQoZSksbj1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCtyLmxlbmd0aCk7bi5zZXQodCksbi5zZXQocix0Lmxlbmd0aCksdGhpcy5zZXRCdWZmZXIobil9fWhhc1JlbWFpbmluZyhlKXtyZXR1cm4gdGhpcy52aWV3LmJ5dGVMZW5ndGgtdGhpcy5wb3M+PWV9Y3JlYXRlRXh0cmFCeXRlRXJyb3IoZSl7bGV0e3ZpZXc6dCxwb3M6cn09dGhpcztyZXR1cm4gUmFuZ2VFcnJvcihgRXh0cmEgJHt0LmJ5dGVMZW5ndGgtcn0gb2YgJHt0LmJ5dGVMZW5ndGh9IGJ5dGUocykgZm91bmQgYXQgYnVmZmVyWyR7ZX1dYCl9ZGVjb2RlKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZShlKTt0cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcihlKTtsZXQgdD10aGlzLmRvRGVjb2RlU3luYygpO2lmKHRoaXMuaGFzUmVtYWluaW5nKDEpKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy5wb3MpO3JldHVybiB0fWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX0qZGVjb2RlTXVsdGkoZSl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGkoZSk7cmV0dXJufXRyeXt0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuc2V0QnVmZmVyKGUpO3doaWxlKHRoaXMuaGFzUmVtYWluaW5nKDEpKXlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWFzeW5jIGRlY29kZUFzeW5jKGUpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmRlY29kZUFzeW5jKGUpO3RyeXt0aGlzLmVudGVyZWQ9ITA7bGV0IHQ9ITEscjtmb3IgYXdhaXQobGV0IG8gb2YgZSl7aWYodCl0aHJvdyB0aGlzLmVudGVyZWQ9ITEsdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTt0aGlzLmFwcGVuZEJ1ZmZlcihvKTt0cnl7cj10aGlzLmRvRGVjb2RlU3luYygpLHQ9ITB9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgYX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc31pZih0KXtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMudG90YWxQb3MpO3JldHVybiByfWxldHtoZWFkQnl0ZTpuLHBvczpzLHRvdGFsUG9zOml9PXRoaXM7dGhyb3cgUmFuZ2VFcnJvcihgSW5zdWZmaWNpZW50IGRhdGEgaW4gcGFyc2luZyAke0R0KG4pfSBhdCAke2l9ICgke3N9IGluIHRoZSBjdXJyZW50IGJ1ZmZlcilgKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZGVjb2RlQXJyYXlTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCEwKX1kZWNvZGVTdHJlYW0oZSl7cmV0dXJuIHRoaXMuZGVjb2RlTXVsdGlBc3luYyhlLCExKX1hc3luYypkZWNvZGVNdWx0aUFzeW5jKGUsdCl7aWYodGhpcy5lbnRlcmVkKXt5aWVsZCp0aGlzLmNsb25lKCkuZGVjb2RlTXVsdGlBc3luYyhlLHQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwO2xldCByPXQsbj0tMTtmb3IgYXdhaXQobGV0IHMgb2YgZSl7aWYodCYmbj09PTApdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtpZih0aGlzLmFwcGVuZEJ1ZmZlcihzKSxyKW49dGhpcy5yZWFkQXJyYXlTaXplKCkscj0hMSx0aGlzLmNvbXBsZXRlKCk7dHJ5e3doaWxlKCEwKWlmKHlpZWxkIHRoaXMuZG9EZWNvZGVTeW5jKCksLS1uPT09MClicmVha31jYXRjaChpKXtpZighKGkgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSl0aHJvdyBpfXRoaXMudG90YWxQb3MrPXRoaXMucG9zfX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZG9EZWNvZGVTeW5jKCl7ZTp3aGlsZSghMCl7bGV0IGU9dGhpcy5yZWFkSGVhZEJ5dGUoKSx0O2lmKGU+PTIyNCl0PWUtMjU2O2Vsc2UgaWYoZTwxOTIpaWYoZTwxMjgpdD1lO2Vsc2UgaWYoZTwxNDQpe2xldCBuPWUtMTI4O2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPDE2MCl7bGV0IG49ZS0xNDQ7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2V7bGV0IG49ZS0xNjA7dD10aGlzLmRlY29kZVN0cmluZyhuLDApfWVsc2UgaWYoZT09PTE5Mil0PW51bGw7ZWxzZSBpZihlPT09MTk0KXQ9ITE7ZWxzZSBpZihlPT09MTk1KXQ9ITA7ZWxzZSBpZihlPT09MjAyKXQ9dGhpcy5yZWFkRjMyKCk7ZWxzZSBpZihlPT09MjAzKXQ9dGhpcy5yZWFkRjY0KCk7ZWxzZSBpZihlPT09MjA0KXQ9dGhpcy5yZWFkVTgoKTtlbHNlIGlmKGU9PT0yMDUpdD10aGlzLnJlYWRVMTYoKTtlbHNlIGlmKGU9PT0yMDYpdD10aGlzLnJlYWRVMzIoKTtlbHNlIGlmKGU9PT0yMDcpaWYodGhpcy51c2VCaWdJbnQ2NCl0PXRoaXMucmVhZFU2NEFzQmlnSW50KCk7ZWxzZSB0PXRoaXMucmVhZFU2NCgpO2Vsc2UgaWYoZT09PTIwOCl0PXRoaXMucmVhZEk4KCk7ZWxzZSBpZihlPT09MjA5KXQ9dGhpcy5yZWFkSTE2KCk7ZWxzZSBpZihlPT09MjEwKXQ9dGhpcy5yZWFkSTMyKCk7ZWxzZSBpZihlPT09MjExKWlmKHRoaXMudXNlQmlnSW50NjQpdD10aGlzLnJlYWRJNjRBc0JpZ0ludCgpO2Vsc2UgdD10aGlzLnJlYWRJNjQoKTtlbHNlIGlmKGU9PT0yMTcpe2xldCBuPXRoaXMubG9va1U4KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDEpfWVsc2UgaWYoZT09PTIxOCl7bGV0IG49dGhpcy5sb29rVTE2KCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDIpfWVsc2UgaWYoZT09PTIxOSl7bGV0IG49dGhpcy5sb29rVTMyKCk7dD10aGlzLmRlY29kZVN0cmluZyhuLDQpfWVsc2UgaWYoZT09PTIyMCl7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMSl7bGV0IG49dGhpcy5yZWFkVTMyKCk7aWYobiE9PTApe3RoaXMucHVzaEFycmF5U3RhdGUobiksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlIGV9ZWxzZSB0PVtdfWVsc2UgaWYoZT09PTIyMil7bGV0IG49dGhpcy5yZWFkVTE2KCk7aWYobiE9PTApe3RoaXMucHVzaE1hcFN0YXRlKG4pLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSBlfWVsc2UgdD17fX1lbHNlIGlmKGU9PT0yMjMpe2xldCBuPXRoaXMucmVhZFUzMigpO2lmKG4hPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShuKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgZX1lbHNlIHQ9e319ZWxzZSBpZihlPT09MTk2KXtsZXQgbj10aGlzLmxvb2tVOCgpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwxKX1lbHNlIGlmKGU9PT0xOTcpe2xldCBuPXRoaXMubG9va1UxNigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiwyKX1lbHNlIGlmKGU9PT0xOTgpe2xldCBuPXRoaXMubG9va1UzMigpO3Q9dGhpcy5kZWNvZGVCaW5hcnkobiw0KX1lbHNlIGlmKGU9PT0yMTIpdD10aGlzLmRlY29kZUV4dGVuc2lvbigxLDApO2Vsc2UgaWYoZT09PTIxMyl0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDIsMCk7ZWxzZSBpZihlPT09MjE0KXQ9dGhpcy5kZWNvZGVFeHRlbnNpb24oNCwwKTtlbHNlIGlmKGU9PT0yMTUpdD10aGlzLmRlY29kZUV4dGVuc2lvbig4LDApO2Vsc2UgaWYoZT09PTIxNil0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDE2LDApO2Vsc2UgaWYoZT09PTE5OSl7bGV0IG49dGhpcy5sb29rVTgoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMSl9ZWxzZSBpZihlPT09MjAwKXtsZXQgbj10aGlzLmxvb2tVMTYoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sMil9ZWxzZSBpZihlPT09MjAxKXtsZXQgbj10aGlzLmxvb2tVMzIoKTt0PXRoaXMuZGVjb2RlRXh0ZW5zaW9uKG4sNCl9ZWxzZSB0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7RHQoZSl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCByPXRoaXMuc3RhY2s7d2hpbGUoci5sZW5ndGg+MCl7bGV0IG49ci50b3AoKTtpZihuLnR5cGU9PT13cilpZihuLmFycmF5W24ucG9zaXRpb25dPXQsbi5wb3NpdGlvbisrLG4ucG9zaXRpb249PT1uLnNpemUpdD1uLmFycmF5LHIucmVsZWFzZShuKTtlbHNlIGNvbnRpbnVlIGU7ZWxzZSBpZihuLnR5cGU9PT1sdCl7aWYodD09PSJfX3Byb3RvX18iKXRocm93IG5ldyBlZSgiVGhlIGtleSBfX3Byb3RvX18gaXMgbm90IGFsbG93ZWQiKTtuLmtleT10aGlzLm1hcEtleUNvbnZlcnRlcih0KSxuLnR5cGU9em47Y29udGludWUgZX1lbHNlIGlmKG4ubWFwW24ua2V5XT10LG4ucmVhZENvdW50Kyssbi5yZWFkQ291bnQ9PT1uLnNpemUpdD1uLm1hcCxyLnJlbGVhc2Uobik7ZWxzZXtuLmtleT1udWxsLG4udHlwZT1sdDtjb250aW51ZSBlfX1yZXR1cm4gdH19cmVhZEhlYWRCeXRlKCl7aWYodGhpcy5oZWFkQnl0ZT09PXV0KXRoaXMuaGVhZEJ5dGU9dGhpcy5yZWFkVTgoKTtyZXR1cm4gdGhpcy5oZWFkQnl0ZX1jb21wbGV0ZSgpe3RoaXMuaGVhZEJ5dGU9dXR9cmVhZEFycmF5U2l6ZSgpe2xldCBlPXRoaXMucmVhZEhlYWRCeXRlKCk7c3dpdGNoKGUpe2Nhc2UgMjIwOnJldHVybiB0aGlzLnJlYWRVMTYoKTtjYXNlIDIyMTpyZXR1cm4gdGhpcy5yZWFkVTMyKCk7ZGVmYXVsdDppZihlPDE2MClyZXR1cm4gZS0xNDQ7ZWxzZSB0aHJvdyBuZXcgZWUoYFVucmVjb2duaXplZCBhcnJheSB0eXBlIGJ5dGU6ICR7RHQoZSl9YCl9fXB1c2hNYXBTdGF0ZShlKXtpZihlPnRoaXMubWF4TWFwTGVuZ3RoKXRocm93IG5ldyBlZShgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHtlfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKGUpfXB1c2hBcnJheVN0YXRlKGUpe2lmKGU+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGFycmF5IGxlbmd0aCAoJHtlfSkgPiBtYXhBcnJheUxlbmd0aCAoJHt0aGlzLm1heEFycmF5TGVuZ3RofSlgKTt0aGlzLnN0YWNrLnB1c2hBcnJheVN0YXRlKGUpfWRlY29kZVN0cmluZyhlLHQpe2lmKCF0aGlzLnJhd1N0cmluZ3N8fHRoaXMuc3RhdGVJc01hcEtleSgpKXJldHVybiB0aGlzLmRlY29kZVV0ZjhTdHJpbmcoZSx0KTtyZXR1cm4gdGhpcy5kZWNvZGVCaW5hcnkoZSx0KX1kZWNvZGVVdGY4U3RyaW5nKGUsdCl7aWYoZT50aGlzLm1heFN0ckxlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IFVURi04IGJ5dGUgbGVuZ3RoICgke2V9KSA+IG1heFN0ckxlbmd0aCAoJHt0aGlzLm1heFN0ckxlbmd0aH0pYCk7aWYodGhpcy5ieXRlcy5ieXRlTGVuZ3RoPHRoaXMucG9zK3QrZSl0aHJvdyBXbjtsZXQgcj10aGlzLnBvcyt0LG47aWYodGhpcy5zdGF0ZUlzTWFwS2V5KCkmJnRoaXMua2V5RGVjb2Rlcj8uY2FuQmVDYWNoZWQoZSkpbj10aGlzLmtleURlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMscixlKTtlbHNlIG49X24odGhpcy5ieXRlcyxyLGUpO3JldHVybiB0aGlzLnBvcys9dCtlLG59c3RhdGVJc01hcEtleSgpe2lmKHRoaXMuc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuc3RhY2sudG9wKCkudHlwZT09PWx0O3JldHVybiExfWRlY29kZUJpbmFyeShlLHQpe2lmKGU+dGhpcy5tYXhCaW5MZW5ndGgpdGhyb3cgbmV3IGVlKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgke2V9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKGUrdCkpdGhyb3cgV247bGV0IHI9dGhpcy5wb3MrdCxuPXRoaXMuYnl0ZXMuc3ViYXJyYXkocixyK2UpO3JldHVybiB0aGlzLnBvcys9dCtlLG59ZGVjb2RlRXh0ZW5zaW9uKGUsdCl7aWYoZT50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgZWUoYE1heCBsZW5ndGggZXhjZWVkZWQ6IGV4dCBsZW5ndGggKCR7ZX0pID4gbWF4RXh0TGVuZ3RoICgke3RoaXMubWF4RXh0TGVuZ3RofSlgKTtsZXQgcj10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyt0KSxuPXRoaXMuZGVjb2RlQmluYXJ5KGUsdCsxKTtyZXR1cm4gdGhpcy5leHRlbnNpb25Db2RlYy5kZWNvZGUobixyLHRoaXMuY29udGV4dCl9bG9va1U4KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyl9bG9va1UxNigpe3JldHVybiB0aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKX1sb29rVTMyKCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpfXJlYWRVOCgpe2xldCBlPXRoaXMudmlldy5nZXRVaW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkSTgoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50OCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKyssZX1yZWFkVTE2KCl7bGV0IGU9dGhpcy52aWV3LmdldFVpbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZEkxNigpe2xldCBlPXRoaXMudmlldy5nZXRJbnQxNih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz0yLGV9cmVhZFUzMigpe2xldCBlPXRoaXMudmlldy5nZXRVaW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRJMzIoKXtsZXQgZT10aGlzLnZpZXcuZ2V0SW50MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfXJlYWRVNjQoKXtsZXQgZT1xbih0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjQoKXtsZXQgZT1CdCh0aGlzLnZpZXcsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRVNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdVaW50NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfXJlYWRJNjRBc0JpZ0ludCgpe2xldCBlPXRoaXMudmlldy5nZXRCaWdJbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LGV9cmVhZEYzMigpe2xldCBlPXRoaXMudmlldy5nZXRGbG9hdDMyKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsZX1yZWFkRjY0KCl7bGV0IGU9dGhpcy52aWV3LmdldEZsb2F0NjQodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCxlfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBuZXcgQ3QodCkuZGVjb2RlKGUpfWNsYXNzIGZ0e2xpc3RlbmVycz1uZXcgTWFwO2FkZEV2ZW50TGlzdGVuZXIoZSx0KXtsZXQgcj10aGlzLmxpc3RlbmVycy5nZXQoZSk7aWYoIXIpcj1uZXcgU2V0LHRoaXMubGlzdGVuZXJzLnNldChlLHIpO3JldHVybiByLmFkZCh0KSwoKT0+e3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQpfX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2lmKHIuZGVsZXRlKHQpLHIuc2l6ZT09PTApdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGUpfX1lbWl0KGUsdCl7bGV0IHI9dGhpcy5saXN0ZW5lcnMuZ2V0KGUpO2lmKHIpe2xldCBuPUFycmF5LmZyb20ocik7Zm9yKGxldCBzIG9mIG4pcyh0KX19ZW1pdEFsbChlKXtsZXQgdD1BcnJheS5mcm9tKHRoaXMubGlzdGVuZXJzLmtleXMoKSk7Zm9yKGxldCByIG9mIHQpdGhpcy5lbWl0KHIsZSl9fWNsYXNzIFJle2dldHRlcjtzdGF0aWMgZXZlbnROYW1lPSJ1cGRhdGUiO2VtaXR0ZXI7Y29uc3RydWN0b3IoZSl7dGhpcy5nZXR0ZXI9ZTt0aGlzLmVtaXR0ZXI9bmV3IGZ0fWdldD0oKT0+dGhpcy5nZXR0ZXIoKTthc3luYyBlbWl0KCl7bGV0IGU9YXdhaXQgdGhpcy5nZXR0ZXIoKTtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5lbWl0dGVyLmVtaXQoUmUuZXZlbnROYW1lLGUpKX1saXN0ZW4oZSl7cmV0dXJuIHRoaXMuZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKFJlLmV2ZW50TmFtZSxlKSwoKT0+e3RoaXMuZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKFJlLmV2ZW50TmFtZSxlKX19fWZ1bmN0aW9uIHAoZSl7cmV0dXJuW2UsMF19ZnVuY3Rpb24gYyhlKXtyZXR1cm5bdm9pZCAwLGVdfWZ1bmN0aW9uIG5vKGUpe2lmKGU8MCljb25zb2xlLmluZm8oIk4iLGUpLGNvbnNvbGUudHJhY2UoKTtpZih0eXBlb2YgZSE9PSJiaWdpbnQiKWU9QmlnSW50KGUpO2lmKGU8MG4pcmV0dXJuIGMoMTApO2xldCB0PVtdO3doaWxlKGU+MG4pe2xldCByPU51bWJlcihlJjB4N2ZuKTtpZihlPj49N24sZT4wbil0LnB1c2gocnwxMjgpO2Vsc2UgdC5wdXNoKHIpfWlmKHQubGVuZ3RoPT09MClyZXR1cm4gcChuZXcgVWludDhBcnJheShbMF0pKTtpZih0Lmxlbmd0aD44KXJldHVybiBjKDI2KTtyZXR1cm4gcChuZXcgVWludDhBcnJheSh0KSl9ZnVuY3Rpb24gc28oZSx0PTApe2xldCByPTBuLG49MCxzPXQ7d2hpbGUoITApe2lmKHM+PWUubGVuZ3RoKXJldHVybiBjKDE0KTtsZXQgaT1lW3MrK107aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7aWYocnw9QmlnSW50KGkmMTI3KTw8QmlnSW50KG4pLChpJjEyOCk9PT0wKXtpZihzLXQ+OClyZXR1cm4gYygyNik7cmV0dXJuIHAoe3ZhbHVlOnI+MHgxZmZmZmZmZmZmZmZmZm4/cjpOdW1iZXIociksYnl0ZXNSZWFkOnMtdH0pfWlmKG4rPTcsbj49NTYpcmV0dXJuIGMoMjYpfX1jbGFzcyBMe2RhdGE7cG9zPTA7Y29uc3RydWN0b3IoZSl7dGhpcy5kYXRhPWV9c3RhdGljIGFzeW5jIGZyb21SZXNwb25zZShlKXtsZXQgdD1hd2FpdCBlLmFycmF5QnVmZmVyKCkscj1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gbmV3IEwocil9cmVhZEJpZ0ludCgpe2lmKHRoaXMucG9zKzg+dGhpcy5kYXRhLmxlbmd0aClyZXR1cm4gYyg3KTtsZXQgZT1uZXcgRGF0YVZpZXcodGhpcy5kYXRhLmJ1ZmZlcix0aGlzLmRhdGEuYnl0ZU9mZnNldCt0aGlzLnBvcykuZ2V0QmlnVWludDY0KDAsITEpO3JldHVybiB0aGlzLnBvcys9OCxwKGUpfXJlYWREYXRlKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIHAobmV3IERhdGUoZSkpfXJlYWRWYXJJbnQoKXtsZXRbZSx0XT1zbyh0aGlzLmRhdGEsdGhpcy5wb3MpO2lmKHQhPT0wKXJldHVybiBjKHQpO3RoaXMucG9zKz1lLmJ5dGVzUmVhZDtsZXQgcj1lLnZhbHVlO3JldHVybiBwKHR5cGVvZiByPT09ImJpZ2ludCI/TnVtYmVyKHIpOnIpfXJlYWRWYXJTdHJpbmcoKXtsZXRbZSx0XT10aGlzLnJlYWRWYXJJbnQoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz1uZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocik7cmV0dXJuIHAocyl9cmVhZEJ5dGVzKGUpe2lmKGU8MClyZXR1cm4gYygxMCk7aWYodGhpcy5wb3MrZT50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBjKDIzKTtsZXQgdD10aGlzLmRhdGEuc2xpY2UodGhpcy5wb3MsdGhpcy5wb3MrZSk7cmV0dXJuIHRoaXMucG9zKz1lLHAodCl9cmVhZFZhckJ5dGVzKCl7bGV0W2UsdF09dGhpcy5yZWFkVmFySW50KCk7aWYodCE9PTApcmV0dXJuIGModCk7cmV0dXJuIHRoaXMucmVhZEJ5dGVzKGUpfXJlYWRTdHJ1Y3QoZSl7cmV0dXJuIGUuZGVjb2RlKHRoaXMpfXJlYWRTdHJ1Y3RzKGUpe2xldCB0PVtdO3doaWxlKCF0aGlzLmRvbmUoKSl7bGV0W3Isbl09dGhpcy5yZWFkU3RydWN0KGUpO2lmKG4hPT0wKXJldHVybiBjKG4pO3QucHVzaChyKX1yZXR1cm4gcCh0KX1yZWFkQnl0ZXNTZXEoZSl7bGV0IHQ9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbcixuXT10aGlzLnJlYWRCeXRlcyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTt0LnB1c2gocil9cmV0dXJuIHAodCl9ZG9uZSgpe3JldHVybiB0aGlzLnBvcz49dGhpcy5kYXRhLmxlbmd0aH1jb25zdW1lZCgpe3JldHVybiB0aGlzLnBvc319Y2xhc3MgS3twYXJ0cz1bXTt3cml0ZUJpZ0ludChlKXtsZXQgdD1uZXcgVWludDhBcnJheSg4KTtuZXcgRGF0YVZpZXcodC5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLGUsITEpLHRoaXMucGFydHMucHVzaCh0KX13cml0ZURhdGUoZSl7bGV0IHQ9ZS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMud3JpdGVWYXJJbnQodCl9d3JpdGVWYXJJbnQoZSl7bGV0W3Qscl09bm8oZSk7aWYociE9PTApcmV0dXJuIHI7cmV0dXJuIHRoaXMucGFydHMucHVzaCh0KSwwfXdyaXRlVmFyU3RyaW5nKGUpe2xldCB0PW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShlKSxyPXRoaXMud3JpdGVWYXJJbnQodC5sZW5ndGgpO2lmKHIhPT0wKXJldHVybiByO3JldHVybiB0aGlzLndyaXRlQnl0ZXModCksMH1wcmVwZW5kQnl0ZXMoZSl7dGhpcy5wYXJ0cy51bnNoaWZ0KGUuc2xpY2UoKSl9d3JpdGVCeXRlcyhlKXt0aGlzLnBhcnRzLnB1c2goZS5zbGljZSgpKX13cml0ZVZhckJ5dGVzKGUpe2xldCB0PXRoaXMud3JpdGVWYXJJbnQoZS5sZW5ndGgpO2lmKHQhPT0wKXJldHVybiB0O3JldHVybiB0aGlzLndyaXRlQnl0ZXMoZSksMH13cml0ZVN0cnVjdChlLHQpe3JldHVybiBlLmVuY29kZSh0aGlzLHQpfXdyaXRlU3RydWN0cyhlLHQpe2ZvcihsZXQgciBvZiB0KXtsZXQgbj10aGlzLndyaXRlU3RydWN0KGUscik7aWYobiE9PTApcmV0dXJuIG59cmV0dXJuIDB9d3JpdGVCeXRlc1NlcShlKXtmb3IobGV0IHQgb2YgZSl0aGlzLndyaXRlQnl0ZXModCl9cmVzdWx0KCl7bGV0IGU9dGhpcy5wYXJ0cy5yZWR1Y2UoKG4scyk9Pm4rcy5sZW5ndGgsMCksdD1uZXcgVWludDhBcnJheShlKSxyPTA7Zm9yKGxldCBuIG9mIHRoaXMucGFydHMpdC5zZXQobixyKSxyKz1uLmxlbmd0aDtyZXR1cm4gdH13aXBlKCl7Zm9yKGxldCBlIG9mIHRoaXMucGFydHMpZS5maWxsKDApO3RoaXMucGFydHMubGVuZ3RoPTB9KnNjYW4oKXtmb3IobGV0IGUgb2YgdGhpcy5wYXJ0cyl5aWVsZCBlfX1hc3luYyBmdW5jdGlvbiBFcihlLHQpe2xldCByPW5ldyBLLG49ci53cml0ZURhdGUodCk7aWYobiE9PTApcmV0dXJuIGMobik7bGV0IHM9ci5yZXN1bHQoKSxpPWF3YWl0IGUuc2lnbihzKTtyZXR1cm4gcCh7cHViS2V5OmUucHVibGljS2V5LHNpZzppLHRpbWVzdGFtcDp0fSl9YXN5bmMgZnVuY3Rpb24gRGUoZSx0LHIpe2xldCBuPXIubm93KCkuZ2V0VGltZSgpLHM9ZS50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKG4tcyk+Um4pcmV0dXJuIDQ7bGV0IG89bmV3IEs7by53cml0ZURhdGUoZS50aW1lc3RhbXApO2xldCBhPW8ucmVzdWx0KCk7aWYoIWF3YWl0IHQuY2hlY2tTaWdFZDI1NTE5KGUuc2lnLGEsZS5wdWJLZXkpKXJldHVybiAzO3JldHVybiAwfXZhciBhZT17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckJ5dGVzKHQuaWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudHMpO2lmKG4hPT0wKXJldHVybiBuO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyQnl0ZXMoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWREYXRlKCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2lkOnQsdHM6bn0pfX07ZnVuY3Rpb24gVHQoZSl7bGV0IHQ9bmV3IEsscj10LndyaXRlU3RydWN0KGFlLGUpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXQucmVzdWx0KCk7cmV0dXJuIHAobil9dmFyIGRlPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5laWQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5vZmYpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJJbnQodC5jdHIpO2lmKHMhPT0wKXJldHVybiBzO2xldCBpPWUud3JpdGVWYXJJbnQodC5sZW4pO2lmKGkhPT0wKXJldHVybiBpO2lmKHQuaHNoKWUud3JpdGVCeXRlcyh0LmhzaCk7cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJCeXRlcygpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPW5ldyBMKHQpLFssc109YWUuZGVjb2RlKG4pO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldFthLGRdPWUucmVhZFZhckludCgpO2lmKGQhPT0wKXJldHVybiBjKGQpO2xldFt1LGxdPWUucmVhZFZhckludCgpO2lmKGwhPT0wKXJldHVybiBjKGwpO2xldCBmO2lmKHU+MCl7bGV0W2gseV09ZS5yZWFkQnl0ZXMoVXQpO2lmKHkhPT0wKXJldHVybiBjKHkpO2Y9aH1yZXR1cm4gcCh7ZWlkOnQsb2ZmOmksY3RyOmEsbGVuOnUsaHNoOmZ9KX19O2Z1bmN0aW9uIGhlKGUpe3JldHVybiBBcnJheS5mcm9tKGUpLm1hcCgocik9PnIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiIil9ZnVuY3Rpb24gam4oZSl7aWYoZS5sZW5ndGglMiE9PTApdGhyb3cgRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO2xldCB0PW5ldyBVaW50OEFycmF5KGUubGVuZ3RoLzIpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cis9Mil0W3IvMl09TnVtYmVyLnBhcnNlSW50KGUuc3Vic3RyKHIsMiksMTYpO3JldHVybiB0fWZ1bmN0aW9uIFgoZSx0KXtpZihlPT09dClyZXR1cm4hMDtpZihlLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7cmV0dXJuIGUuZXZlcnkoKHIsbik9PnI9PT10W25dKX12YXIgQztpZih0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQ9PT0iZnVuY3Rpb24iKUM9KGUpPT5lLnRvQmFzZTY0KCk7ZWxzZSBDPShlKT0+YnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmUpKTt2YXIgZmU7aWYodHlwZW9mIFVpbnQ4QXJyYXkuZnJvbUJhc2U2ND09PSJmdW5jdGlvbiIpZmU9KGUpPT5VaW50OEFycmF5LmZyb21CYXNlNjQoZSk7ZWxzZSBmZT0oZSk9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKGUpLCh0KT0+dC5jaGFyQ29kZUF0KDApKTtmdW5jdGlvbiAkbihlKXtsZXQgdD1lLmxlbmd0aCU0PT09MD8iIjoiPSIucmVwZWF0KDQtZS5sZW5ndGglNCkscj1lLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpK3Q7cmV0dXJuIGZlKHIpfWZ1bmN0aW9uIHllKGUsdCl7bGV0IHI9bmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgrdC5sZW5ndGgpO3JldHVybiByLnNldChlLDApLHIuc2V0KHQsZS5sZW5ndGgpLHJ9ZnVuY3Rpb24gR24oZSx0LHIpe3JldHVybiByLmNoZWNrU2lnRWQyNTUxOShlLnNpZyxlLmhlYWRDcGgsdCl9YXN5bmMgZnVuY3Rpb24gUW4oZSx0LHIsbil7bGV0IHM7aWYoZS5ib2QmJmUubGVuPjApcz1hd2FpdCByLmJsYWtlMyhlLmJvZCk7bGV0IGk9bmV3IEssbz1kZS5lbmNvZGUoaSx7Li4uZSxoc2g6c30pO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhPWkucmVzdWx0KCksZD1hd2FpdCB0LmtkbUZvcihhKSx1PW4uZGVyaXZlQ2lwaGVyKGQsImVuY3J5cHQiKSxsPWF3YWl0IHUuZW5jcnlwdChhKSxmPWUuYm9kP2F3YWl0IHUuZW5jcnlwdChlLmJvZCk6bmV3IFVpbnQ4QXJyYXkoMCksaD1hd2FpdCB0LnNpZ24obCk7cmV0dXJuIHAoe3NpZzpoLGtkbTpkLGhlYWRDcGg6bCxib2R5Q3BoOmZ9KX1hc3luYyBmdW5jdGlvbiBBcihlLHQscixuLHMpe2xldCBpPW5ldyBMKGUpLFtvLGFdPWRlLmRlY29kZShpKTtpZihhIT09MClyZXR1cm4gYygxNCk7bGV0IGQ7dHJ5e2Q9dCYmdC5sZW5ndGg+MD9hd2FpdCByLmRlY3J5cHQodCk6dm9pZCAwfWNhdGNoe3JldHVybiBjKDIwKX1sZXQgdT1vLmhzaCYmZD09PXZvaWQgMCxsPW8uaHNoPT09dm9pZCAwJiZkIT09dm9pZCAwO2lmKHV8fGwpcmV0dXJuIGMoMTkpO2lmKG8uaHNoJiZkKXtsZXQgaD1hd2FpdCBuLmJsYWtlMyhkKTtpZighWChoLG8uaHNoKSlyZXR1cm4gYygxOSl9bGV0IGY9cz8/YXdhaXQgbi5ibGFrZTMoZSk7cmV0dXJuIHAoe21zZ0hlYWQ6byxib2Q6ZCxoZWFkSGFzaDpmfSl9Y2xhc3MgUHJ7bm93KCl7cmV0dXJuIG5ldyBEYXRlfX1mdW5jdGlvbiBZbihlLHQscixuKXtsZXQgcz10LmdldFRpbWUoKS1lLmdldFRpbWUoKSxpPXIuZ2V0VGltZSgpLW4uZ2V0VGltZSgpO3JldHVybihzK2kpLzJ9dmFyIHB0PXtlbmNvZGUoZSx0KXtpZihlLndyaXRlVmFySW50KHQucXVvdGEpLHQucXVvdGE+MCl7aWYodC51c2FnZT09PXZvaWQgMClyZXR1cm4gOTtlLndyaXRlVmFySW50KHQudXNhZ2UpfXJldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0IG47aWYodD4wKXtsZXRbcyxpXT1lLnJlYWRWYXJJbnQoKTtpZihpIT09MClyZXR1cm4gYyhpKTtuPXN9cmV0dXJuIHAoe3F1b3RhOnQsdXNhZ2U6bn0pfX07dmFyIFVyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW3Quc3RhdHVzXSkpO2xldCByPWUud3JpdGVEYXRlKHQudGltZVJjdmQpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVEYXRlKHQudGltZVNlbnQpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJJbnQodC5zdWJzY3JpcHRpb24udGVybSk7aWYocyE9PTApcmV0dXJuIHM7bGV0IGk9ZS53cml0ZVZhckludCh0LnN1YnNjcmlwdGlvbi5lbGFwc2VkKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1lLndyaXRlU3RydWN0KHB0LHQuc3Vic2NyaXB0aW9uLnN0YXQpO2lmKG8hPT0wKXJldHVybiBvO2xldCBhPWUud3JpdGVTdHJ1Y3QocHQsdC5zdWJzY3JpcHRpb24uZHluKTtpZihhIT09MClyZXR1cm4gYTtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKDEpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXRbMF0sW3MsaV09ZS5yZWFkRGF0ZSgpO2lmKGkhPT0wKXJldHVybiBjKGkpO2xldFtvLGFdPWUucmVhZERhdGUoKTtpZihhIT09MClyZXR1cm4gYyhhKTtsZXRbZCx1XT1lLnJlYWRWYXJJbnQoKTtpZih1IT09MClyZXR1cm4gYyh1KTtsZXRbbCxmXT1lLnJlYWRWYXJJbnQoKTtpZihmIT09MClyZXR1cm4gYyhmKTtsZXRbaCx5XT1lLnJlYWRTdHJ1Y3QocHQpO2lmKHkhPT0wKXJldHVybiBjKHkpO2xldFtnLG1dPWUucmVhZFN0cnVjdChwdCk7aWYobSE9PTApcmV0dXJuIGMobSk7cmV0dXJuIHAoe3N0YXR1czpuLHRpbWVSY3ZkOnMsdGltZVNlbnQ6byxzdWJzY3JpcHRpb246e3Rlcm06ZCxlbGFwc2VkOmwsc3RhdDpoLGR5bjpnfX0pfX07dmFyIGtyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuc2VxKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckJ5dGVzKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFySW50KCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2hlYWRDcGg6dCxzZXE6bn0pfX07dmFyIGNlPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5wdWJLZXkpLGUud3JpdGVCeXRlcyh0LnNpZyk7bGV0IHI9ZS53cml0ZURhdGUodC50aW1lc3RhbXApO2lmKHIhPT0wKXJldHVybiByO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkQnl0ZXMoTW4pO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZEJ5dGVzKEJlKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWREYXRlKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe3B1YktleTp0LHNpZzpuLHRpbWVzdGFtcDppfSl9fTt2YXIgSm49e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe2xldCBpPXMud3JpdGVTdHJ1Y3QoY2Uscik7aWYoaSE9PTApcmV0dXJuIGk7Zm9yKGxldCBvIG9mIG4pcy53cml0ZVZhckludChvKTtyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOml9PWUsW28sYV09dC5yZWFkU3RydWN0KGNlKTtpZihhIT09MClyZXR1cm4gYTtsZXQgZD1hd2FpdCBEZShvLHMsbik7aWYoZCE9PTApcmV0dXJuIGQ7bGV0e3B1YktleTp1fT1vLFtsLGZdPWF3YWl0IGkuaGFzVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtpZighbClyZXR1cm4gNTtsZXRbaCx5XT10LnJlYWRWYXJJbnQoKTtpZih5IT09MClyZXR1cm4geTtpZighdC5kb25lKCkpcmV0dXJuIDg7bGV0W2csbV09YXdhaXQgaS5saXN0SGVhZHModSxoKTtpZihtIT09MClyZXR1cm4gbTtyZXR1cm4gci53cml0ZVN0cnVjdHMoa3IsZyl9LGRlY29kZVJlc3AoZSl7cmV0dXJuIGUucmVhZFN0cnVjdHMoa3IpfX07dmFyIEJyPXtlbmNvZGUoZSx0KXtlLndyaXRlVmFySW50KHQuc2VxKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5ib2R5Q3BoKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZFZhckludCgpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldFtuLHNdPWUucmVhZFZhckJ5dGVzKCk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe3NlcTp0LGJvZHlDcGg6bn0pfX07dmFyIFpuPXthc3luYyBlbmNvZGVSZXEoZSx0LHIsbixzKXtsZXQgaT1zLndyaXRlU3RydWN0KGNlLHIpO2lmKGkhPT0wKXJldHVybiBpO2ZvcihsZXQgbyBvZiBuKXtsZXQgYT1zLndyaXRlVmFySW50KG8pO2lmKGEhPT0wKXJldHVybiBhfXJldHVybiAwfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6aX09ZSxbbyxhXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGEhPT0wKXJldHVybiBhO2xldCBkPWF3YWl0IERlKG8scyxuKTtpZihkIT09MClyZXR1cm4gZDtsZXR7cHViS2V5OnV9PW8sW2wsZl09YXdhaXQgaS5oYXNVc2VyKHUpO2lmKGYhPT0wKXJldHVybiBmO2lmKCFsKXJldHVybiA1O2xldCBoPVtdO3doaWxlKCF0LmRvbmUoKSl7bGV0W20sU109dC5yZWFkVmFySW50KCk7aWYoUyE9PTApcmV0dXJuIFM7aC5wdXNoKG0pfWNvbnNvbGUuaW5mbyhgUFVMTDogJHtoLmxlbmd0aH0gYmFnc2ApO2xldFt5LGddPWF3YWl0IGkuZ2V0Qm9kaWVzKHUsaCk7aWYoZyE9PTApcmV0dXJuIGc7aWYoIXkpcmV0dXJuIDE3O2ZvcihsZXR7c2VxOm0sYm9keUNwaDpTfW9mIHkpe2xldCB4PXtzZXE6bSxib2R5Q3BoOlN9LGI9ci53cml0ZVN0cnVjdChCcix4KTtpZihiIT09MClyZXR1cm4gYn1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhCcil9fTt2YXIgdnI9e2VuY29kZShlLHQpe2Uud3JpdGVCeXRlcyh0LnNpZyksZS53cml0ZUJ5dGVzKHQua2RtKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFyQnl0ZXModC5ib2R5Q3BoKTtpZihuIT09MClyZXR1cm4gbjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKEJlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyh2ZSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFyQnl0ZXMoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXRbYSxkXT1lLnJlYWRWYXJCeXRlcygpO2lmKGQhPT0wKXJldHVybiBjKGQpO3JldHVybiBwKHtzaWc6dCxrZG06bixoZWFkQ3BoOmksYm9keUNwaDphfSl9fTt2YXIgSHQ9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJJbnQodC5zZXEpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPXQuYm9keUNwaD90LmJvZHlDcGgubGVuZ3RoOjAsaT1lLndyaXRlVmFySW50KHMpO2lmKGkhPT0wKXJldHVybiBpO2lmKHM+MCl7aWYoIXQuYm9keUNwaClyZXR1cm4gMTA7ZS53cml0ZUJ5dGVzKHQuYm9keUNwaCl9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckludCgpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldCBhO2lmKGk+MCl7bGV0W2QsdV09ZS5yZWFkQnl0ZXMoaSk7aWYodSE9PTApcmV0dXJuIGModSk7YT1kfXJldHVybiBwKHtzZXE6dCxoZWFkQ3BoOm4sYm9keUNwaDphfSl9fTt2YXIgTXQ9e2VuY29kZShlLHQpe2Uud3JpdGVCeXRlcyh0LnNpZyksZS53cml0ZUJ5dGVzKHQua2RtKTtsZXQgcj1lLndyaXRlVmFyQnl0ZXModC5oZWFkQ3BoKTtpZihyIT09MClyZXR1cm4gcjtyZXR1cm4gMH0sZGVjb2RlKGUpe2xldFt0LHJdPWUucmVhZEJ5dGVzKEJlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRCeXRlcyh2ZSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFyQnl0ZXMoKTtpZihvIT09MClyZXR1cm4gYyhvKTtyZXR1cm4gcCh7c2lnOnQsa2RtOm4saGVhZENwaDppfSl9fTt2YXIgUnQ9e2VuY29kZShlLHQpe2lmKGUud3JpdGVWYXJJbnQodC5pZHgpLGUud3JpdGVCeXRlcyhuZXcgVWludDhBcnJheShbdC5zdGF0dXNdKSksdC5zdGF0dXM9PT0wKWUud3JpdGVWYXJJbnQodC5zZXEpO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFySW50KCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkQnl0ZXMoMSk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0IGk9blswXTtpZihpIT09MClyZXR1cm4gcCh7aWR4OnQsc3RhdHVzOml9KTtsZXRbbyxhXT1lLnJlYWRWYXJJbnQoKTtpZihhIT09MClyZXR1cm4gYyhhKTtyZXR1cm4gcCh7aWR4OnQsc3RhdHVzOmksc2VxOm99KX19O3ZhciBlcz17YXN5bmMgZW5jb2RlUmVxKGUsdCxyLG4scyl7bGV0IGk9cy53cml0ZVN0cnVjdChjZSxyKTtpZihpIT09MClyZXR1cm4gaTtsZXQgbz1zLndyaXRlU3RydWN0cyh2cixuKTtpZihvIT09MClyZXR1cm4gbztyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKGUsdCxyKXtsZXR7Y2xvY2s6bixjcnlwdG86cyxzdG9yYWdlOmksbm90aWZpZXI6b309ZSxbYSxkXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGQhPT0wKXJldHVybiBkO2xldCB1PWF3YWl0IERlKGEscyxuKTtpZih1IT09MClyZXR1cm4gdTtsZXR7cHViS2V5Omx9PWEsW2YsaF09YXdhaXQgaS5oYXNVc2VyKGwpO2lmKGghPT0wKXJldHVybiBoO2lmKCFmKXJldHVybiA1O2xldFt5LGddPXQucmVhZFN0cnVjdHModnIpO2lmKGchPT0wKXJldHVybiBnO2NvbnNvbGUuaW5mbyhgUFVTSDogJHt5Lmxlbmd0aH0gYmFnc2ApO2xldCBtPVtdLFM9W107Zm9yKGxldCB3PTA7dzx5Lmxlbmd0aDt3Kyspe2xldCBBPXlbd107aWYoIWF3YWl0IEduKEEsbCxzKSl7bGV0IEQ9e2lkeDp3LHN0YXR1czozfSxIPXIud3JpdGVTdHJ1Y3QoUnQsRCk7aWYoSCE9PTApcmV0dXJuIEg7Y29udGludWV9bS5wdXNoKHcpLFMucHVzaChBKX1sZXRbeCxiXT1hd2FpdCBpLnNldEJhZ3MobCxTKTtpZihiIT09MClyZXR1cm4gYjtpZigheHx8eC5sZW5ndGghPT1TLmxlbmd0aClyZXR1cm4gMTc7bGV0IEU9W107Zm9yKGxldCB3PTA7dzxTLmxlbmd0aDt3Kyspe2xldCBBPVNbd10sQj1tW3ddLEQ9eFt3XSxIPW5ldyBLLFQ9SC53cml0ZVN0cnVjdChNdCxBKTtpZihUIT09MClyZXR1cm4gVDtsZXQgTz1ILnJlc3VsdCgpLE49e3NlcTpELGhlYWRDcGg6T307aWYoeS5sZW5ndGg9PT0xJiZBLmJvZHlDcGgubGVuZ3RoPD1MbilOLmJvZHlDcGg9QS5ib2R5Q3BoO0UucHVzaChOKTtsZXQgXz17aWR4OkIsc3RhdHVzOjAsc2VxOkR9LEk9ci53cml0ZVN0cnVjdChSdCxfKTtpZihJIT09MClyZXR1cm4gSX1pZihFLmxlbmd0aD4wKXtsZXQgdz1uZXcgSyxBPXcud3JpdGVTdHJ1Y3RzKEh0LEUpO2lmKEEhPT0wKXJldHVybiBBO2xldCBCPXcucmVzdWx0KCk7YXdhaXQgUHJvbWlzZS5yZXNvbHZlKG8ucHVzaChsLEIpKX1yZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gZS5yZWFkU3RydWN0cyhSdCl9fTt2YXIgdHM9e2FzeW5jIGVuY29kZVJlcShlLHQscixuLHMpe3JldHVybiBzLndyaXRlU3RydWN0KGNlLHIpfSxhc3luYyBoYW5kbGVSZXEoZSx0LHIpe2xldHtjbG9jazpuLGNyeXB0bzpzLHN0b3JhZ2U6aX09ZSxbbyxhXT10LnJlYWRTdHJ1Y3QoY2UpO2lmKGEhPT0wKXJldHVybiBhO2xldCBkPWF3YWl0IERlKG8scyxuKTtpZihkIT09MClyZXR1cm4gZDtsZXR7cHViS2V5OnV9PW87aWYoIXQuZG9uZSgpKXJldHVybiA4O2xldFtsLGZdPWF3YWl0IGkuYWRkVXNlcih1KTtpZihmIT09MClyZXR1cm4gZjtyZXR1cm4gMH0sZGVjb2RlUmVzcChlKXtyZXR1cm4gcCh2b2lkIDApfX07Y2xhc3MgRHJ7dXJsO3dlYnNvY2tldDtjb25zdHJ1Y3RvcihlKXt0aGlzLnVybD1lfWNvbm5lY3RlZCgpe3JldHVybiB0aGlzLndlYnNvY2tldCE9PXZvaWQgMCYmdGhpcy53ZWJzb2NrZXQucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOfWFzeW5jIGNvbm5lY3QoZSx0LHI9KCk9Pnt9LG49KCk9Pnt9KXtsZXR7dXJsOnN9PXRoaXM7aWYodGhpcy53ZWJzb2NrZXQpdGhpcy53ZWJzb2NrZXQuY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDA7bGV0IGk9bmV3IEs7aS53cml0ZVN0cnVjdChjZSxlKTtsZXQgbz1pLnJlc3VsdCgpLGE9aGUobyk7cmV0dXJuIHMuc2VhcmNoUGFyYW1zLnNldCgidCIsYSksdGhpcy53ZWJzb2NrZXQ9bmV3IFdlYlNvY2tldChzKSx0aGlzLndlYnNvY2tldC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsdGhpcy53ZWJzb2NrZXQub25vcGVuPSgpPT57Y29uc29sZS5sb2coIkNPTk5FQ1RFRCIpLG4oKX0sdGhpcy53ZWJzb2NrZXQub25jbG9zZT0oKT0+e2NvbnNvbGUubG9nKCJESVNDT05ORUNURUQiKSx0aGlzLndlYnNvY2tldD12b2lkIDAscigpfSx0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2U9KGQpPT57bGV0IHU9bmV3IFVpbnQ4QXJyYXkoZC5kYXRhKTt0KHUpfSx0aGlzLndlYnNvY2tldC5vbmVycm9yPShkKT0+e2NvbnNvbGUubG9nKGBFUlJPUjogJHtKU09OLnN0cmluZ2lmeShkKX1gKSx0aGlzLndlYnNvY2tldD12b2lkIDAscigpfSxQcm9taXNlLnJlc29sdmUoMCl9ZGlzY29ubmVjdCgpe3RoaXMud2Vic29ja2V0Py5jbG9zZSgpLHRoaXMud2Vic29ja2V0PXZvaWQgMH19dmFyIFk9e3VzZXI6e3BhdGg6Ii91c2VyIixlbmRwb2ludDp0cyxuYW1lOjB9LHB1c2g6e3BhdGg6Ii9wdXNoIixlbmRwb2ludDplcyxuYW1lOjJ9LHBlZWs6e3BhdGg6Ii9wZWVrIixlbmRwb2ludDpKbixuYW1lOjF9LHB1bGw6e3BhdGg6Ii9wdWxsIixlbmRwb2ludDpabixuYW1lOjN9fSxpbz17MDpZLnVzZXIsMjpZLnB1c2gsMTpZLnBlZWssMzpZLnB1bGx9LEZ1PXtbWS51c2VyLnBhdGhdOlkudXNlcixbWS5wdXNoLnBhdGhdOlkucHVzaCxbWS5wZWVrLnBhdGhdOlkucGVlayxbWS5wdWxsLnBhdGhdOlkucHVsbH07Y2xhc3MgcnN7dXJsO2xpc3RlbmVyO2NvbnN0cnVjdG9yKGUpe3RoaXMudXJsPWU7dGhpcy5saXN0ZW5lcj1uZXcgRHIoZSl9YXN5bmMgY2FsbChlLHQpe2xldHtwYXRoOnJ9PWlvW2VdLG49bmV3IFVSTChyLHRoaXMudXJsKTt0cnl7cmV0dXJuIGF3YWl0IG9vKG4sdCl9Y2F0Y2h7cmV0dXJuIGMoMjUpfX19dmFyIG5zPShlKT0+bmV3IHJzKGUuaGFuZGxlKTthc3luYyBmdW5jdGlvbiBvbyhlLHQpe2xldCByPWF3YWl0IGZldGNoKGUse21ldGhvZDoiUE9TVCIsYm9keTp0LnJlc3VsdCgpLnNsaWNlKCl9KTtpZighci5vaylyZXR1cm4gYygyNCk7bGV0IG49YXdhaXQgTC5mcm9tUmVzcG9uc2Uocik7cmV0dXJuIHAobil9Y2xhc3MgTHR7ZW5jbGF2ZTtjcnlwdG87aG9zdDtjbG9jazt0cmFuc3BvcnQ7dXBkYXRlSG9zdE1ldGE7Y29uc3RydWN0b3IoZSx0LHIsbixzLGkpe3RoaXMuZW5jbGF2ZT1lO3RoaXMuY3J5cHRvPXQ7dGhpcy5ob3N0PXI7dGhpcy5jbG9jaz1uO3RoaXMudHJhbnNwb3J0PXM7dGhpcy51cGRhdGVIb3N0TWV0YT1pfWFzeW5jIGNhbGwoZSx0KXtsZXR7Y2xvY2s6cix0cmFuc3BvcnQ6bn09dGhpcyx7ZW5kcG9pbnQ6cyxuYW1lOml9PWUsbz1hd2FpdCB0aGlzLmlkZW50aXR5KCksYT1yLm5vdygpLFtkLHVdPWF3YWl0IEVyKG8sYSk7aWYodSE9PTApcmV0dXJuIGModSk7bGV0IGw9bmV3IEssZj1hd2FpdCBzLmVuY29kZVJlcSh0aGlzLG8sZCx0LGwpO2lmKGYhPT0wKXJldHVybiBjKGYpO2xldCBoPXIubm93KCksW3ksZ109YXdhaXQgbi5jYWxsKGksbCksbT1yLm5vdygpO2lmKGchPT0wKXJldHVybiBjKGcpO2xldFtTLHhdPXkucmVhZFN0cnVjdChVcik7aWYoeCE9PTApcmV0dXJuIGMoeCk7aWYoUy5zdGF0dXMhPT0wKXJldHVybiBjKFMuc3RhdHVzKTtsZXQgRT17Y2xvY2tPZmZzZXQ6WW4oaCxTLnRpbWVSY3ZkLFMudGltZVNlbnQsbSksc3Vic2NyaXB0aW9uOlMuc3Vic2NyaXB0aW9ufSx3PWF3YWl0IHRoaXMudXBkYXRlSG9zdE1ldGEoRSk7aWYodyE9PTApcmV0dXJuIGModyk7cmV0dXJuIHMuZGVjb2RlUmVzcCh5KX1pZGVudGl0eT0oKT0+e2xldHtob3N0OmUsZW5jbGF2ZTp0fT10aGlzO3JldHVybiB0LmRlcml2ZUlkZW50aXR5KGUubGFiZWwsZS5pZHg/PzApfTtzZWFsPWFzeW5jKGUpPT57bGV0e2NyeXB0bzp0LGVuY2xhdmU6cn09dGhpcyxuPWF3YWl0IHRoaXMuaWRlbnRpdHkoKTtyZXR1cm4gUW4oZSxuLHQscil9O3JlZ2lzdGVyPSgpPT50aGlzLmNhbGwoWS51c2VyLFtdKTtwZWVrPShlKT0+dGhpcy5jYWxsKFkucGVlayxbZV0pO3B1c2g9KGUpPT50aGlzLmNhbGwoWS5wdXNoLGUpO3B1bGw9KGUpPT50aGlzLmNhbGwoWS5wdWxsLGUpO2xpc3Rlbj1hc3luYyhlLHQscik9PntsZXR7Y2xvY2s6bix0cmFuc3BvcnQ6c309dGhpcyx7bGlzdGVuZXI6aX09cyxvPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxhPW4ubm93KCksW2QsdV09YXdhaXQgRXIobyxhKTtpZih1IT09MClyZXR1cm4gdTtyZXR1cm4gYXdhaXQgaS5jb25uZWN0KGQsZSx0LHIpfTtpc0Nvbm5lY3RlZCgpe2xldCBlPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZihlJiZ0eXBlb2YgZS5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiBlLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19dmFyIENyPXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlVmFyU3RyaW5nKHQubGJsKTtpZihyIT09MClyZXR1cm4gcjtsZXQgbj1lLndyaXRlVmFySW50KHQuaWR4KTtpZihuIT09MClyZXR1cm4gbjtsZXQgcz1lLndyaXRlVmFySW50KHQubnVtKTtpZihzIT09MClyZXR1cm4gcztyZXR1cm4gZS53cml0ZUJ5dGVzKHQuaHNoKSxlLndyaXRlQnl0ZXModC5zaWcpLDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJTdHJpbmcoKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJJbnQoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXRbYSxkXT1lLnJlYWRCeXRlcyhVdCk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0W3UsbF09ZS5yZWFkQnl0ZXMoQmUpO2lmKGwhPT0wKXJldHVybiBjKGwpO3JldHVybiBwKHtsYmw6dCxpZHg6bixudW06aSxoc2g6YSxzaWc6dX0pfX07dmFyIEt0PXtlbmNvZGUoZSx0KXtsZXQgcj1lLndyaXRlU3RydWN0KENyLHQuaGVhZCk7aWYociE9PTApcmV0dXJuIHI7bGV0IG49ZS53cml0ZVZhckJ5dGVzKHQuaW5kZXhFbmMpO2lmKG4hPT0wKXJldHVybiBuO2xldCBzPWUud3JpdGVWYXJCeXRlcyh0LmJvZHlFbmMpO2lmKHMhPT0wKXJldHVybiBzO3JldHVybiAwfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkU3RydWN0KENyKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1lLnJlYWRWYXJCeXRlcygpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldFtpLG9dPWUucmVhZFZhckJ5dGVzKCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe2hlYWQ6dCxpbmRleEVuYzpuLGJvZHlFbmM6aX0pfX07dmFyIFRyPXtlbmNvZGUoZSx0KXtlLndyaXRlQnl0ZXModC5rZG0pO2xldCByPWUud3JpdGVWYXJCeXRlcyh0LmhlYWRDcGgpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJJbnQodC5sZW5Cb2R5KTtpZihuIT09MClyZXR1cm4gbjtpZih0LmxlbkJvZHk+MCYmdC5vZmZCb2R5IT09dm9pZCAwKXtsZXQgcz1lLndyaXRlVmFySW50KHQub2ZmQm9keSk7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRCeXRlcyh2ZSk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFyQnl0ZXMoKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXRbaSxvXT1lLnJlYWRWYXJJbnQoKTtpZihvIT09MClyZXR1cm4gYyhvKTtsZXQgYTtpZihpPjApe2xldFtkLHVdPWUucmVhZFZhckludCgpO2lmKHUhPT0wKXJldHVybiBjKHUpO2E9ZH1yZXR1cm4gcCh7a2RtOnQsaGVhZENwaDpuLGxlbkJvZHk6aSxvZmZCb2R5OmF9KX19O3ZhciBPdDsoKHNzKT0+e3NzLmRlZmF1bHRGaWxlRXh0ZW5zaW9uPSJkcGwiO2FzeW5jIGZ1bmN0aW9uIHQocyxpLG8sYSxkKXtsZXQgdT1hd2FpdCBkLmRlcml2ZUlkZW50aXR5KHMsaSksbD1uZXcgSyxmPW5ldyBLLGg9MCx5PTA7Zm9yKGxldCBBIG9mIG8pe2xldCBCPW5ldyBLLEQ9Qi53cml0ZVN0cnVjdChkZSxBLmhlYWQpO2lmKEQhPT0wKXJldHVybiBjKEQpO2xldCBIPUIucmVzdWx0KCksVD1hd2FpdCB1LmtkbUZvcihIKSxPPWQuZGVyaXZlQ2lwaGVyKFQsImVuY3J5cHQiKSxOPWF3YWl0IE8uZW5jcnlwdChIKSxfPUEuYm9keT9hd2FpdCBPLmVuY3J5cHQoQS5ib2R5KTpuZXcgVWludDhBcnJheSgwKSxJPUEuaGVhZC5sZW4+MCYmQS5oZWFkLmhzaCE9PXZvaWQgMD9fLmxlbmd0aDowLHY9e2tkbTpULGhlYWRDcGg6TixsZW5Cb2R5Okksb2ZmQm9keTpJPjA/eTp2b2lkIDB9LFI9bC53cml0ZVN0cnVjdChUcix2KTtpZihSIT09MClyZXR1cm4gYyhSKTtpZihBLmJvZHkpZi53cml0ZUJ5dGVzKF8pLHkrPV8ubGVuZ3RoO2grK31sZXQgZz1mLnJlc3VsdCgpLG09bC5yZXN1bHQoKSxTPWF3YWl0IGEuYmxha2UzKG0pLHg9YXdhaXQgdS5zaWduKFMpLGI9e2xibDpzLGlkeDppLG51bTpoLGhzaDpTLHNpZzp4fSxFPW5ldyBLO0Uud3JpdGVTdHJ1Y3QoS3Qse2hlYWQ6YixpbmRleEVuYzptLGJvZHlFbmM6Z30pO2xldCB3PUUucmVzdWx0KCk7cmV0dXJuIHAodyl9c3MuZW5jb2RlRmlsZT10O2FzeW5jIGZ1bmN0aW9uIHIocyxpLG8pe2xldFthLGRdPUt0LmRlY29kZShuZXcgTChzKSk7aWYoZCE9PTApcmV0dXJuIGMoZCk7bGV0e2hlYWQ6dSxpbmRleEVuYzpsLGJvZHlFbmM6Zn09YSxoPWF3YWl0IG8uZGVyaXZlSWRlbnRpdHkodS5sYmwsdS5pZHgpO2lmKCFhd2FpdCBpLmNoZWNrU2lnRWQyNTUxOSh1LnNpZyx1LmhzaCxoLnB1YmxpY0tleSkpcmV0dXJuIGMoMyk7bGV0IGc9YXdhaXQgaS5ibGFrZTMobCk7aWYoIVgoZyx1LmhzaCkpcmV0dXJuIGMoMTkpO2xldCBtPW5ldyBMKGwpLFM9W107Zm9yKGxldCBiPTA7Yjx1Lm51bTtiKyspe2xldFtFLHddPW0ucmVhZFN0cnVjdChUcik7aWYodyE9PTApcmV0dXJuIGModyk7Uy5wdXNoKEUpfWlmKFMubGVuZ3RoIT09dS5udW0pcmV0dXJuIGMoMTQpO2xldCB4PVtdO2ZvcihsZXQgYiBvZiBTKXtsZXQgRT1vLmRlcml2ZUNpcGhlcihiLmtkbSwiZGVjcnlwdCIpLHc7dHJ5e3c9YXdhaXQgRS5kZWNyeXB0KGIuaGVhZENwaCl9Y2F0Y2h7cmV0dXJuIGMoMjApfWxldFtBLEJdPWRlLmRlY29kZShuZXcgTCh3KSk7aWYoQiE9PTApcmV0dXJuIGMoQik7bGV0IEQ7aWYoYi5sZW5Cb2R5PjAmJmIub2ZmQm9keSE9PXZvaWQgMCl7aWYoQS5oc2g9PT12b2lkIDApcmV0dXJuIGMoMTQpO2xldCBIPWYuc2xpY2UoYi5vZmZCb2R5LGIub2ZmQm9keStiLmxlbkJvZHkpO3RyeXtEPWF3YWl0IEUuZGVjcnlwdChIKX1jYXRjaHtyZXR1cm4gYygyMCl9bGV0IFQ9YXdhaXQgaS5ibGFrZTMoRCk7aWYoIVgoVCxBLmhzaCkpcmV0dXJuIGMoMTkpfXgucHVzaCh7aGVhZDpBLGJvZHk6RH0pfXJldHVybiBwKHgpfXNzLmRlY29kZUZpbGU9cjthc3luYyBmdW5jdGlvbiBuKHMsaSxvLGEsZCl7bGV0W3UsbF09YXdhaXQgcihzLGksbyk7aWYobCE9PTApcmV0dXJuIGMobCk7bGV0W2YsaF09S3QuZGVjb2RlKG5ldyBMKHMpKTtpZihoIT09MClyZXR1cm4gYyhoKTtyZXR1cm4gdChmLmhlYWQubGJsLGYuaGVhZC5pZHgsZCh1KSxpLGEpfXNzLm1pZ3JhdGVGaWxlPW59KShPdHx8PXt9KTthc3luYyBmdW5jdGlvbiBpcyh7bm93OmUsYm9kOnQsY3J5cHRvOnJ9KXtsZXQgbj1hd2FpdCByLmdlblJhbmRvbUJ5dGVzKDgpLHM9bmV3IEssaT1zLndyaXRlU3RydWN0KGFlLHtpZDpuLHRzOmV9KTtpZihpIT09MClyZXR1cm4gYyhpKTtsZXQgbz1zLnJlc3VsdCgpO3JldHVybiBWdCh7bm93OmUsZWlkOm8sY3RyOjAsYm9kOnQsY3J5cHRvOnJ9KX1hc3luYyBmdW5jdGlvbiBWdCh7bm93OmUsZWlkOnQsY3RyOnIsYm9kOm4sY3J5cHRvOnN9KXtsZXQgaT1uZXcgTCh0KSxbbyxhXT1hZS5kZWNvZGUoaSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7bGV0IGQ9ZS5nZXRUaW1lKCktby50cy5nZXRUaW1lKCksdSxsPW4/Lmxlbmd0aD8/MDtpZihuJiZsPjApdT1hd2FpdCBzLmJsYWtlMyhuKTtyZXR1cm4gcCh7ZWlkOnQsb2ZmOmQsY3RyOnIsbGVuOmwsaHNoOnV9KX1mdW5jdGlvbiBhbyhlLHQpe2xldCByPWUubGVuZ3RoPHQubGVuZ3RoP2UubGVuZ3RoOnQubGVuZ3RoO2ZvcihsZXQgbj0wO248cjtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuIGVbbl0tdFtuXTtyZXR1cm4gZS5sZW5ndGgtdC5sZW5ndGh9YXN5bmMgZnVuY3Rpb24gaHQoZSx0KXtsZXQgcj1BcnJheS5mcm9tKGUpO3Iuc29ydChhbyk7bGV0IG49MDtmb3IobGV0IG8gb2YgciluKz1vLmxlbmd0aDtsZXQgcz1uZXcgVWludDhBcnJheShuKSxpPTA7Zm9yKGxldCBvIG9mIHIpcy5zZXQobyxpKSxpKz1vLmxlbmd0aDtyZXR1cm4gdC5ibGFrZTMocyl9ZnVuY3Rpb24gY28oZSl7bGV0IHQ9bmV3IEsscj10LndyaXRlVmFyQnl0ZXMoZS5laWQpO2lmKHIhPT0wKXJldHVybiBjKHIpO2xldCBuPXQud3JpdGVEYXRlKGUudXBkYXRlZEF0KTtpZihuIT09MClyZXR1cm4gYyhuKTtsZXQgcz10LndyaXRlVmFySW50KGUuY3RyKTtpZihzIT09MClyZXR1cm4gYyhzKTtyZXR1cm4gcCh0LnJlc3VsdCgpKX1hc3luYyBmdW5jdGlvbiBfdChlLHQpe2xldCByPVtdO2ZvcihsZXQgbiBvZiBlKXtsZXRbcyxpXT1jbyhuKTtpZihpIT09MHx8IXMpcmV0dXJuIGMoaSk7ci5wdXNoKHMpfXJldHVybiBwKGF3YWl0IGh0KHIsdCkpfXZhciBMbD1TeW1ib2woIk1hc3RlclNlZWQiKSxLbD1TeW1ib2woIlNlYWxlZE1hc3RlcktleSIpLG1lPTMyLG9zPTI0K21lKzE2O2Z1bmN0aW9uIExlKGUpe2lmKGUuYnl0ZUxlbmd0aCE9PW9zKXJldHVybiBjKDEwKTtyZXR1cm4gcChlKX12YXIgVmw9U3ltYm9sKCJFbnRpdHlJRCIpO2Z1bmN0aW9uIGFzKGUpe3JldHVybiJ0eXBlImluIGV9dmFyIF9sPVN5bWJvbCgiRGVyaXZhdGlvblNlZWQiKSxObD1TeW1ib2woIlB1YmxpY0tleSIpLHFsPVN5bWJvbCgiUHJpdmF0ZUtleSIpLEZsPVN5bWJvbCgiSG9zdFNwZWNpZmljS2V5UGFpciIpLFdsPVN5bWJvbCgiSGFzaCIpO2Z1bmN0aW9uIHVvKGUpe2lmKCFlKXJldHVybiExO2lmKHR5cGVvZiBlIT09Im9iamVjdCIpcmV0dXJuITE7aWYoImJvZHkiaW4gZT09PSExKXJldHVybiExO2lmKCJ0eXBlImluIGU9PT0hMSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBsbyhlKXtpZighZS5ib2R8fGUuYm9kLmxlbmd0aD09PTApe2xldCBuPXtvZmY6ZS5vZmYsY3RyOmUuY3RyLGVpZDplLmVpZH07cmV0dXJuIHAobil9bGV0IHQ9eHIoZS5ib2QpO2lmKHVvKHQpPT09ITEpcmV0dXJuIGNvbnNvbGUud2FybigibXNnIGJvZHkgaW52YWxpZCIsdCksYygxNCk7bGV0IHI9e29mZjplLm9mZixjdHI6ZS5jdHIsZWlkOmUuZWlkLHBpZDp0LnBpZCx0YWdzOnQudGFncyx0eXBlOnQudHlwZSxib2R5OnQuYm9keX07cmV0dXJuIHAocil9Y2xhc3MgTnR7YXBwbGllcjtlbWl0dGVyPW5ldyBmdDtjbGVhcmVyO29uRGlydHlFaWRzO2NhY2hlRHJpdmVuO3BlZXJJbmdlc3Q7Y29uc3RydWN0b3IoZSx0LHIsbil7dGhpcy5hcHBsaWVyPWU7dGhpcy5jbGVhcmVyPXQsdGhpcy5vbkRpcnR5RWlkcz1yLHRoaXMuY2FjaGVEcml2ZW49bj8uY2FjaGVEcml2ZW4/PyExLHRoaXMucGVlckluZ2VzdD1uPy5wZWVySW5nZXN0fWFwcGx5PWFzeW5jKGUpPT57bGV0IHQ9W10scj1bXTtmb3IobGV0IGEgb2YgZSl7bGV0W2QsdV09bG8oYSk7aWYoci5wdXNoKHUpLHUhPT0wKWNvbnRpbnVlO3QucHVzaChkKX1sZXR7c3RhdHM6bix0eXBlczpzLGVpZHM6aX09YXdhaXQgdGhpcy5hcHBsaWVyKHQpLG89W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2xldCBkPXJbYV0sdT1uW2FdO2lmKGQhPT0wKXtvLnB1c2goZCk7Y29udGludWV9aWYodSE9PTApe28ucHVzaCh1KTtjb250aW51ZX1vLnB1c2goMCl9aWYoIXRoaXMuY2FjaGVEcml2ZW4pZm9yKGxldCBhIG9mIHMpdGhpcy5lbWl0dGVyLmVtaXQoYSxudWxsKTtpZihpLmxlbmd0aD4wKXRoaXMub25EaXJ0eUVpZHM/LihpKTtyZXR1cm4gb307Y2xlYXI9YXN5bmMoKT0+e2xldCBlPWF3YWl0IHRoaXMuY2xlYXJlcigpO2lmKGUhPT0wKXJldHVybiBlO3JldHVybiB0aGlzLmVtaXR0ZXIuZW1pdEFsbChudWxsKSxlfTtub3RpZnk9KGUpPT57Zm9yKGxldCB0IG9mIGUpdGhpcy5lbWl0dGVyLmVtaXQodCxudWxsKX07cmVmcmVzaD1hc3luYyhlKT0+e2lmKHRoaXMucGVlckluZ2VzdCl7YXdhaXQgdGhpcy5wZWVySW5nZXN0KGUpO3JldHVybn19O29uPShlLHQpPT57dGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoZSx0KX07b2ZmPShlLHQpPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0KX19dmFyIGo9ImVudGl0aWVzIixxdD0iZW50aXR5X3R5cGVfY3JlYXRlZF9hdCIsTXI9ImVudGl0eV90eXBlX3VwZGF0ZWRfYXQiLFJyPSJlbnRpdHlfdHlwZV9wYXJlbnRfaWQiLEplPSJlbnRpdHlfdGFncyIsY3M9ImVudGl0eV90eXBlX2dyb3VwX2lkIixkcz0iZGIiLHVzPTE0O2Z1bmN0aW9uIGZvKGUpe3JldHVybiJ0eXAiaW4gZX1mdW5jdGlvbiBwbyhlKXtsZXQgdD17Ym9kOmUuYm9keSxjcmQ6ZS5jcmVhdGVkQXQsLi4uZS5jdHIhPT0wP3tjdHI6ZS5jdHJ9Ont9LGVpZDpDKGUuZWlkKSxwaWQ6ZS5waWQ/QyhlLnBpZCk6dm9pZCAwLHRnczplLnRhZ3MsdHlwOmUudHlwZSx1cGQ6ZS51cGRhdGVkQXR9O2lmKHQucGlkPT09dm9pZCAwKWRlbGV0ZSB0LnBpZDtpZih0LnRncz09PXZvaWQgMClkZWxldGUgdC50Z3M7aWYodC5jdHI9PT12b2lkIDApZGVsZXRlIHQuY3RyO3JldHVybiB0fWZ1bmN0aW9uIGhvKGUpe2lmKCFGKGUpKXJldHVybntlaWQ6QyhlLmVpZCksdXBkOmUudXBkYXRlZEF0LC4uLmUuY3RyIT09MD97Y3RyOmUuY3RyfTp7fX07cmV0dXJuIHBvKGUpfWZ1bmN0aW9uIFplKGUpe3JldHVybntib2R5OmUuYm9kLGNyZWF0ZWRBdDplLmNyZCx1cGRhdGVkQXQ6ZS51cGQsY3RyOmUuY3RyPz8wLHR5cGU6ZS50eXAsZWlkOmZlKGUuZWlkKSxwaWQ6ZS5waWQ/ZmUoZS5waWQpOnZvaWQgMCwuLi5lLnRncyE9PXZvaWQgMD97dGFnczplLnRnc306e319fWZ1bmN0aW9uIEhyKGUpe2lmKGZvKGUpKXJldHVybiBaZShlKTtyZXR1cm57ZWlkOmZlKGUuZWlkKSx1cGRhdGVkQXQ6ZS51cGQsY3RyOmUuY3RyPz8wfX1mdW5jdGlvbiB5byhlLHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBJREJLZXlSYW5nZS5vbmx5KFtlLHRdKTtsZXQgcj10LnJhbmdlO3JldHVybiBJREJLZXlSYW5nZS5ib3VuZChbZSxyLnN0YXJ0XSxbZSxyLmVuZF0sci5leGNsdWRlU3RhcnQ9PT0hMCxyLmV4Y2x1ZGVFbmQ9PT0hMCl9ZnVuY3Rpb24gbW8oZSl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIilyZXR1cm4gSURCS2V5UmFuZ2Uub25seShlKTtpZigicmFuZ2UiaW4gZSl7bGV0IHQ9ZS5yYW5nZTtyZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQodC5zdGFydCx0LmVuZCx0LmV4Y2x1ZGVTdGFydD09PSEwLHQuZXhjbHVkZUVuZD09PSEwKX1yZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoZS5wcmVmaXgsZS5wcmVmaXgrIu+/vyIpfWZ1bmN0aW9uIGdvKGUsdCxyKXtsZXQgbj1bXTtpZih0eXBlb2Ygcj09PSJzdHJpbmciKXtmb3IobGV0IG8gb2YgZSlpZihvLnR5cD09PXQpbi5wdXNoKFplKG8pKTtyZXR1cm4gbn1sZXQgcz1uZXcgU2V0LGk9InByZWZpeCJpbiByP3IucHJlZml4OnZvaWQgMDtmb3IobGV0IG8gb2YgZSl7aWYoby50eXAhPT10KWNvbnRpbnVlO2lmKHMuaGFzKG8uZWlkKSljb250aW51ZTtpZihpIT09dm9pZCAwKXtsZXQgYT1vLnRncztpZighYXx8IWEuc29tZSgoZCk9PmQuc3RhcnRzV2l0aChpKSkpY29udGludWV9cy5hZGQoby5laWQpLG4ucHVzaChaZShvKSl9cmV0dXJuIG59Y2xhc3MgbHN7ZGI7b3BlbmluZzthc3luYyBpbml0KCl7YXdhaXQgdGhpcy5lbnN1cmVEYigpfWFzeW5jIGVuc3VyZURiKCl7aWYodGhpcy5kYilyZXR1cm4gdGhpcy5kYjtpZih0aGlzLm9wZW5pbmcpcmV0dXJuIHRoaXMub3BlbmluZztyZXR1cm4gdGhpcy5vcGVuaW5nPWJvKCkudGhlbigoZSk9PihlLm9udmVyc2lvbmNoYW5nZT0oKT0+e2lmKGUuY2xvc2UoKSx0aGlzLmRiPT09ZSl0aGlzLmRiPXZvaWQgMH0sdGhpcy5kYj1lLHRoaXMub3BlbmluZz12b2lkIDAsZSksKGUpPT57dGhyb3cgdGhpcy5vcGVuaW5nPXZvaWQgMCxlfSksdGhpcy5vcGVuaW5nfWFwcGx5PWFzeW5jKGUpPT57bGV0IHQ9bmV3IFNldCxyPVtdLG47dHJ5e249YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybntzdGF0czplLm1hcCgoKT0+MTYpLHR5cGVzOnQsZWlkczpyfX1sZXQgcz1uLnRyYW5zYWN0aW9uKGosInJlYWR3cml0ZSIpLGk9cy5vYmplY3RTdG9yZShqKTtyZXR1cm4gbmV3IFByb21pc2UoKG8pPT57bGV0IGE9QXJyYXkoZS5sZW5ndGgpLmZpbGwoMCk7aWYoZS5sZW5ndGg8MSl7byh7c3RhdHM6W10sdHlwZXM6dCxlaWRzOnJ9KTtyZXR1cm59cy5vbmNvbXBsZXRlPSgpPT57byh7c3RhdHM6YSx0eXBlczp0LGVpZHM6cn0pfSxzLm9uZXJyb3I9KCk9Pntmb3IobGV0IHU9MDt1PGEubGVuZ3RoO3UrKylpZihhW3VdPT09dm9pZCAwKWFbdV09MTg7byh7c3RhdHM6YSx0eXBlczp0LGVpZHM6cn0pfTtsZXQgZD1uZXcgTWFwO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSsrKXtsZXQgbD1lW3VdLGY9QyhsLmVpZCksaD17b3A6bCxpbmRleDp1fSx5PWQuZ2V0KGYpO2lmKHkpeS5wdXNoKGgpO2Vsc2UgZC5zZXQoZixbaF0pfWZvcihsZXRbdSxsXW9mIGQpe2lmKGwubGVuZ3RoPDEpY29udGludWU7bGV0IGY9aS5nZXQodSk7Zi5vbnN1Y2Nlc3M9KCk9PntsZXQgaD1mLnJlc3VsdCx5PWg/SHIoaCk6dm9pZCAwLGc9ITE7Zm9yKGxldHtvcDptLGluZGV4OlN9b2YgbCl7bGV0W3gsYl09ZXQoeSxtKTtpZihiIT09MCl7YVtTXT1iO2NvbnRpbnVlfWlmKHg9PT12b2lkIDApe2FbU109MTI7Y29udGludWV9Zz0hMDtmb3IobGV0IEUgb2YgdHQoeSx4KSl0LmFkZChFKTt5PXh9aWYoZylyLnB1c2gobFswXS5vcC5laWQpO2lmKHkpe2xldCBtPWkucHV0KGhvKHkpKTttLm9uZXJyb3I9KFMpPT57Uy5wcmV2ZW50RGVmYXVsdCgpO2ZvcihsZXR7aW5kZXg6eH1vZiBsKWFbeF09MTh9fX0sZi5vbmVycm9yPSgpPT57Zm9yKGxldHtpbmRleDpofW9mIGwpYVtoXT0xOH19fSl9O2FzeW5jIGNsZWFyKCl7bGV0IGU7dHJ5e2U9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiAxNn1sZXQgdD1lLnRyYW5zYWN0aW9uKGosInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShqKTtyZXR1cm4gbmV3IFByb21pc2UoKG4pPT57dC5vbmNvbXBsZXRlPSgpPT5uKDApLHQub25lcnJvcj0oKT0+bigxOCksci5jbGVhcigpfSl9YXN5bmMgZ2V0Um93KGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IHI9QyhlKSxzPXQudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89cy5nZXQocik7by5vbnN1Y2Nlc3M9KCk9PntsZXQgYT1vLnJlc3VsdDtpZighYSlpKHAodm9pZCAwKSk7ZWxzZSBpKHAoSHIoYSkpKX0sby5vbmVycm9yPSgpPT5pKGMoMTgpKX0pfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhRih0KSlyZXR1cm4gcCh2b2lkIDApO3JldHVybiBwKHQpfWFzeW5jIGdldEJ5VXBkYXRlZEF0KGUsdCl7bGV0W3Isbl09eXQodCk7aWYobiE9PTApcmV0dXJuIGMobik7aWYoIXIpcmV0dXJuIHAoW10pO2xldCBzO3RyeXtzPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG89cy50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KE1yKSxhPXlvKGUsdCk7cmV0dXJuIG5ldyBQcm9taXNlKChkKT0+e2xldCB1PW8uZ2V0QWxsKGEpO3Uub25zdWNjZXNzPSgpPT57bGV0IGw9dS5yZXN1bHQ7ZChwKGwubWFwKFplKSkpfSx1Lm9uZXJyb3I9KCk9PmQoYygxOCkpfSl9YXN5bmMgZ2V0QWxsT2ZUeXBlKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG49dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KHF0KTtyZXR1cm4gbmV3IFByb21pc2UoKHMpPT57bGV0IGk9bi5nZXRBbGwoSURCS2V5UmFuZ2UuYm91bmQoW2VdLFtlLFtdXSkpO2kub25zdWNjZXNzPSgpPT57bGV0IG89aS5yZXN1bHQ7cyhwKG8ubWFwKFplKSkpfSxpLm9uZXJyb3I9KCk9PnMoYygxOCkpfSl9YXN5bmMgZ2V0QnlUYWcoZSx0KXtsZXRbcixuXT1tdCh0KTtpZihuIT09MClyZXR1cm4gYyhuKTtpZighcilyZXR1cm4gcChbXSk7bGV0IHM7dHJ5e3M9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBjKDE2KX1sZXQgaT1tbyh0KSxhPXMudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKS5pbmRleChKZSk7cmV0dXJuIG5ldyBQcm9taXNlKChkKT0+e2xldCB1PWEuZ2V0QWxsKGkpO3Uub25zdWNjZXNzPSgpPT57bGV0IGw9dS5yZXN1bHQ7ZChwKGdvKGwsZSx0KSkpfSx1Lm9uZXJyb3I9KCk9PmQoYygxOCkpfSl9YXN5bmMgZ2V0QWxsRW50aXRpZXMoZSl7aWYoInBpZCJpbiBlKXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCByPUMoZS5waWQpLHM9dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLmluZGV4KFJyKTtyZXR1cm4gbmV3IFByb21pc2UoKGkpPT57bGV0IG89cy5nZXRBbGwoSURCS2V5UmFuZ2Uub25seShbZS50eXBlLHJdKSk7by5vbnN1Y2Nlc3M9KCk9PntsZXQgZD1vLnJlc3VsdC5tYXAoWmUpO2kocChkKSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX1lbHNlIGlmKCJ0YWciaW4gZSlyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVRhZyhlLnR5cGUsZS50YWcpO2Vsc2UgaWYoInVwZGF0ZWRBdCJpbiBlKXJldHVybiBhd2FpdCB0aGlzLmdldEJ5VXBkYXRlZEF0KGUudHlwZSxlLnVwZGF0ZWRBdCk7cmV0dXJuIGF3YWl0IHRoaXMuZ2V0QWxsT2ZUeXBlKGUudHlwZSl9YXN5bmMgZ2V0RW50aXRpZXMoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtyZXR1cm4gcCh0KX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtsZXQgdDt0cnl7dD1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIGMoMTYpfWxldCBuPXQudHJhbnNhY3Rpb24oaiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShqKS5pbmRleChxdCk7cmV0dXJuIG5ldyBQcm9taXNlKChzKT0+e2xldCBpPUlEQktleVJhbmdlLmJvdW5kKFtlXSxbZSxbXV0pLG89bi5jb3VudChpKTtvLm9uc3VjY2Vzcz0oKT0+cyhwKG8ucmVzdWx0KSksby5vbmVycm9yPSgpPT5zKGMoMTgpKX0pfWFzeW5jIGNoZWNrc3VtKGUpe2xldCB0O3RyeXt0PWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gYygxNil9bGV0IG49dC50cmFuc2FjdGlvbihqLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKGopLHM9W107cmV0dXJuIG5ldyBQcm9taXNlKChpKT0+e2xldCBvPW4ub3BlbkN1cnNvcigpO28ub25zdWNjZXNzPSgpPT57bGV0IGE9by5yZXN1bHQ7aWYoYSl7bGV0IGQ9YS52YWx1ZTtzLnB1c2goRnQoSHIoZCkpKSxhLmNvbnRpbnVlKCl9ZWxzZSBfdChzLGUpLnRoZW4oaSl9LG8ub25lcnJvcj0oKT0+aShjKDE4KSl9KX19ZnVuY3Rpb24gU28oZSx0KXtpZighZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGopKWUuY3JlYXRlT2JqZWN0U3RvcmUoaix7a2V5UGF0aDoiZWlkIixhdXRvSW5jcmVtZW50OiExfSk7bGV0IHI9dC5vYmplY3RTdG9yZShqKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKHF0KSlyLmNyZWF0ZUluZGV4KHF0LFsidHlwIiwiY3JkIl0se3VuaXF1ZTohMX0pO2lmKCFyLmluZGV4TmFtZXMuY29udGFpbnMoTXIpKXIuY3JlYXRlSW5kZXgoTXIsWyJ0eXAiLCJ1cGQiXSx7dW5pcXVlOiExfSk7aWYoci5pbmRleE5hbWVzLmNvbnRhaW5zKGNzKSlyLmRlbGV0ZUluZGV4KGNzKTtpZighci5pbmRleE5hbWVzLmNvbnRhaW5zKFJyKSlyLmNyZWF0ZUluZGV4KFJyLFsidHlwIiwicGlkIl0se3VuaXF1ZTohMX0pO2lmKHIuaW5kZXhOYW1lcy5jb250YWlucyhKZSkpe2lmKHIuaW5kZXgoSmUpLmtleVBhdGghPT0idGdzIilyLmRlbGV0ZUluZGV4KEplKX1pZighci5pbmRleE5hbWVzLmNvbnRhaW5zKEplKSlyLmNyZWF0ZUluZGV4KEplLCJ0Z3MiLHt1bmlxdWU6ITEsbXVsdGlFbnRyeTohMH0pfWZ1bmN0aW9uIGJvKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57bGV0IHI9aW5kZXhlZERCLm9wZW4oZHMsdXMpO3Iub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpuLHRyYW5zYWN0aW9uOnN9PXI7aWYoIXMpe3QoRXJyb3IoIlRyYW5zYWN0aW9uIGlzIG51bGwgZHVyaW5nIEVudERCIHVwZ3JhZGUiKSk7cmV0dXJufXRyeXtTbyhuLHMpfWNhdGNoKGkpe3QoaSBpbnN0YW5jZW9mIEVycm9yP2k6RXJyb3IoU3RyaW5nKGkpKSl9fSxyLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIEVudERCIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7ZHN9IOKGkiB2JHt1c30pOyB3YWl0aW5nIGZvciBvdGhlciBjb25uZWN0aW9ucyB0byBjbG9zZWApfSxyLm9uc3VjY2Vzcz0oKT0+ZShyLnJlc3VsdCksci5vbmVycm9yPSgpPT50KHIuZXJyb3I/P0Vycm9yKCJFbnREQiBJbmRleGVkREIgb3BlbiBmYWlsZWQiKSl9KX1hc3luYyBmdW5jdGlvbiBmcygpe2xldCBlPW5ldyBscztyZXR1cm4gYXdhaXQgZS5pbml0KCksZX1jbGFzcyBPcntlbnRzPW5ldyBNYXA7dXNlSW5kZXg7YnlUeXBlPW5ldyBNYXA7YnlUeXBlUGlkPW5ldyBNYXA7YnlUeXBlVGFnPW5ldyBNYXA7Y29uc3RydWN0b3IoZT1bXSx0KXt0aGlzLnVzZUluZGV4PXQ/LmluZGV4ZXMhPT0hMTtmb3IobGV0IHIgb2YgZSl0aGlzLnB1dChyKX1wdXQoZSl7bGV0IHQ9QyhlLmVpZCkscj10aGlzLmVudHMuZ2V0KHQpO2lmKHIhPT12b2lkIDAmJkYocikpdGhpcy51bmluZGV4KHQscik7aWYodGhpcy5lbnRzLnNldCh0LGUpLEYoZSkpdGhpcy5pbmRleCh0LGUpfWRlbChlKXtsZXQgdD10aGlzLmVudHMuZ2V0KGUpO2lmKHQ9PT12b2lkIDApcmV0dXJuO2lmKEYodCkpdGhpcy51bmluZGV4KGUsdCk7dGhpcy5lbnRzLmRlbGV0ZShlKX1pbmRleChlLHQpe2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgcj10aGlzLmJ5VHlwZS5nZXQodC50eXBlKTtpZighcilyPW5ldyBNYXAsdGhpcy5ieVR5cGUuc2V0KHQudHlwZSxyKTtpZihyLnNldChlLHQpLHQucGlkKXtsZXQgbj1DKHQucGlkKSxzPXRoaXMuYnlUeXBlUGlkLmdldCh0LnR5cGUpO2lmKCFzKXM9bmV3IE1hcCx0aGlzLmJ5VHlwZVBpZC5zZXQodC50eXBlLHMpO2xldCBpPXMuZ2V0KG4pO2lmKCFpKWk9bmV3IE1hcCxzLnNldChuLGkpO2kuc2V0KGUsdCl9aWYodC50YWdzKXtsZXQgbj10aGlzLmJ5VHlwZVRhZy5nZXQodC50eXBlKTtpZighbiluPW5ldyBNYXAsdGhpcy5ieVR5cGVUYWcuc2V0KHQudHlwZSxuKTtmb3IobGV0IHMgb2YgdC50YWdzKXtsZXQgaT1uLmdldChzKTtpZighaSlpPW5ldyBNYXAsbi5zZXQocyxpKTtpLnNldChlLHQpfX19dW5pbmRleChlLHQpe2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgcj10aGlzLmJ5VHlwZS5nZXQodC50eXBlKTtpZihyKXtpZihyLmRlbGV0ZShlKSxyLnNpemU9PT0wKXRoaXMuYnlUeXBlLmRlbGV0ZSh0LnR5cGUpfWlmKHQucGlkKXtsZXQgbj1DKHQucGlkKSxzPXRoaXMuYnlUeXBlUGlkLmdldCh0LnR5cGUpLGk9cz8uZ2V0KG4pO2lmKGkpe2lmKGkuZGVsZXRlKGUpLGkuc2l6ZT09PTApcz8uZGVsZXRlKG4pfWlmKHMmJnMuc2l6ZT09PTApdGhpcy5ieVR5cGVQaWQuZGVsZXRlKHQudHlwZSl9aWYodC50YWdzKXtsZXQgbj10aGlzLmJ5VHlwZVRhZy5nZXQodC50eXBlKTtpZihuKXtmb3IobGV0IHMgb2YgdC50YWdzKXtsZXQgaT1uLmdldChzKTtpZihpKXtpZihpLmRlbGV0ZShlKSxpLnNpemU9PT0wKW4uZGVsZXRlKHMpfX1pZihuLnNpemU9PT0wKXRoaXMuYnlUeXBlVGFnLmRlbGV0ZSh0LnR5cGUpfX19Y2xlYXJJbmRleGVzKCl7dGhpcy5ieVR5cGUuY2xlYXIoKSx0aGlzLmJ5VHlwZVBpZC5jbGVhcigpLHRoaXMuYnlUeXBlVGFnLmNsZWFyKCl9YnVja2V0TGlzdChlKXtpZighZXx8ZS5zaXplPT09MClyZXR1cm5bXTtsZXQgdD1bXTtmb3IobGV0IHIgb2YgZS52YWx1ZXMoKSl0LnB1c2gocik7cmV0dXJuIHR9YnlUYWdTcGVjKGUsdCl7bGV0W3Isbl09bXQodCk7aWYobiE9PTApcmV0dXJuIGMobik7aWYoIXIpcmV0dXJuIHAoW10pO2lmKHR5cGVvZiB0PT09InN0cmluZyIpcmV0dXJuIHAodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlVGFnLmdldChlKT8uZ2V0KHQpKSk7bGV0IHM9dGhpcy5ieVR5cGVUYWcuZ2V0KGUpO2lmKCFzKXJldHVybiBwKFtdKTtsZXQgaT1uZXcgU2V0LG89W107Zm9yKGxldFthLGRdb2Ygcyl7aWYoIUtyKGEsdCkpY29udGludWU7Zm9yKGxldFt1LGxdb2YgZCl7aWYoaS5oYXModSkpY29udGludWU7aS5hZGQodSksby5wdXNoKGwpfX1yZXR1cm4gcChvKX1ieURhdGVTcGVjKGUsdCl7bGV0W3Isbl09eXQodCk7aWYobiE9PTApcmV0dXJuIGMobik7aWYoIXIpcmV0dXJuIHAoW10pO2xldCBzPVtdLGk9dGhpcy5ieVR5cGUuZ2V0KGUpO2lmKGkpe2ZvcihsZXQgbyBvZiBpLnZhbHVlcygpKWlmKExyKG8udXBkYXRlZEF0LHQpKXMucHVzaChvKX1yZXR1cm4gcChzKX1hc3luYyBhcHBseShlKXtsZXQgdD1uZXcgU2V0LHI9W10sbj1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IGk9QyhzLmVpZCksbz10aGlzLmVudHMuZ2V0KGkpLFthLGRdPWV0KG8scyk7aWYoZCE9PTApe24ucHVzaChkKTtjb250aW51ZX1pZihhPT09dm9pZCAwKXtuLnB1c2goMTIpO2NvbnRpbnVlfWZvcihsZXQgdSBvZiB0dChvLGEpKXQuYWRkKHUpO3RoaXMucHV0KGEpLHIucHVzaChzLmVpZCksbi5wdXNoKDApfXJldHVybntzdGF0czpuLHR5cGVzOnQsZWlkczpyfX1hc3luYyBjbGVhcigpe3JldHVybiB0aGlzLmVudHMuY2xlYXIoKSx0aGlzLmNsZWFySW5kZXhlcygpLDB9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUMoZSkscj10aGlzLmVudHMuZ2V0KHQpO3JldHVybiBwKHIpfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhRih0KSlyZXR1cm4gcCh2b2lkIDApO3JldHVybiBwKHQpfWFzeW5jIGdldEFsbEVudGl0aWVzKGUpe2xldHt0eXBlOnR9PWU7aWYodGhpcy51c2VJbmRleCl7aWYoInBpZCJpbiBlKXtsZXQgbj1DKGUucGlkKTtyZXR1cm4gcCh0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVQaWQuZ2V0KHQpPy5nZXQobikpKX1pZigidGFnImluIGUpcmV0dXJuIHRoaXMuYnlUYWdTcGVjKHQsZS50YWcpO2lmKCJ1cGRhdGVkQXQiaW4gZSlyZXR1cm4gdGhpcy5ieURhdGVTcGVjKHQsZS51cGRhdGVkQXQpO3JldHVybiBwKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZS5nZXQodCkpKX1sZXQgcj1bXTtpZigicGlkImluIGUpe2ZvcihsZXQgbiBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRihuKSYmbi50eXBlPT09dCYmbi5waWQmJlgobi5waWQsZS5waWQpKXIucHVzaChuKX1lbHNlIGlmKCJ0YWciaW4gZSl7bGV0IG49ZS50YWcsW3MsaV09bXQobik7aWYoaSE9PTApcmV0dXJuIGMoaSk7aWYoIXMpcmV0dXJuIHAocik7Zm9yKGxldCBvIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihGKG8pJiZvLnR5cGU9PT10JiZvLnRhZ3MmJm8udGFncy5zb21lKChhKT0+S3IoYSxuKSkpci5wdXNoKG8pfWVsc2UgaWYoInVwZGF0ZWRBdCJpbiBlKXtsZXQgbj1lLnVwZGF0ZWRBdCxbcyxpXT15dChuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZighcylyZXR1cm4gcChyKTtmb3IobGV0IG8gb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEYobykmJm8udHlwZT09PXQmJkxyKG8udXBkYXRlZEF0LG4pKXIucHVzaChvKX1lbHNlIGZvcihsZXQgbiBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoRihuKSYmbi50eXBlPT09dClyLnB1c2gobik7cmV0dXJuIHAocil9YXN5bmMgZ2V0RW50aXRpZXMoZSl7bGV0W3Qscl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtyZXR1cm4gcCh0KX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOmV9KXtpZih0aGlzLnVzZUluZGV4KXJldHVybiBwKHRoaXMuYnlUeXBlLmdldChlKT8uc2l6ZT8/MCk7bGV0IHQ9MDtmb3IobGV0IHIgb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKEYocikmJnIudHlwZT09PWUpdCs9MTtyZXR1cm4gcCh0KX1hc3luYyBjaGVja3N1bShlKXtsZXQgdD1bXTtmb3IobGV0IHIgb2YgdGhpcy5lbnRzLnZhbHVlcygpKXQucHVzaChGdChyKSk7cmV0dXJuIF90KHQsZSl9fWFzeW5jIGZ1bmN0aW9uIHlzKGUpe2xldCB0PWF3YWl0IGZzKCk7aWYoZT8uY2FjaGU9PT0hMSlyZXR1cm4gdDtyZXR1cm4gbmV3IFZyKHQsdm9pZCAwLHtpbmRleGVzOmU/LmluZGV4ZXMsb3B0aW1pc3RpYzplPy5vcHRpbWlzdGljfSl9Y2xhc3MgVnJ7bWVtO2R1cmFibGU7d2FybWVkPW5ldyBTZXQ7bGlzdGVuZXJzPW5ldyBTZXQ7Y2hhaW49UHJvbWlzZS5yZXNvbHZlKCk7b3B0aW1pc3RpYztjb25zdHJ1Y3RvcihlLHQscil7aWYodGhpcy5kdXJhYmxlPWUsdGhpcy5vcHRpbWlzdGljPXI/Lm9wdGltaXN0aWMhPT0hMSx0aGlzLm1lbT1uZXcgT3IodD8/W10se2luZGV4ZXM6cj8uaW5kZXhlc30pLHQpZm9yKGxldCBuIG9mIHQpdGhpcy53YXJtZWQuYWRkKG4udHlwZSl9c3Vic2NyaWJlKGUpe3JldHVybiB0aGlzLmxpc3RlbmVycy5hZGQoZSksKCk9Pnt0aGlzLmxpc3RlbmVycy5kZWxldGUoZSl9fWVtaXQoZSl7aWYoZS5zaXplPDEpcmV0dXJuO2ZvcihsZXQgdCBvZiB0aGlzLmxpc3RlbmVycyl0KGUpfXJ1bihlKXtsZXQgdD10aGlzLmNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5jaGFpbj10LnRoZW4oKCk9PntyZXR1cm59LCgpPT57cmV0dXJufSksdH1hcHBseShlKXtsZXQgdDtpZih0aGlzLm9wdGltaXN0aWMpe3RoaXMuZW1pdChQbyh0aGlzLm1lbSxlKS50eXBlcyksdD1uZXcgTWFwO2ZvcihsZXQgciBvZiBlKXtsZXQgbj1DKHIuZWlkKTt0LnNldChuLGhzKHRoaXMubWVtLmVudHMuZ2V0KG4pKSl9fXJldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0IHI9YXdhaXQgdGhpcy5kdXJhYmxlLmFwcGx5KGUpLHtjaGFuZ2VkOm4sc3RhdHVzOnN9PWF3YWl0IHRoaXMucHVsbEVpZHMoZS5tYXAoKGkpPT5pLmVpZCksdCk7aWYodGhpcy5lbWl0KG4pLHMhPT0wKXJldHVybntzdGF0czplLm1hcCgoKT0+cyksdHlwZXM6ci50eXBlcyxlaWRzOnIuZWlkc307cmV0dXJuIHJ9KX1jbGVhcigpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0IGU9YXdhaXQgdGhpcy5kdXJhYmxlLmNsZWFyKCk7aWYoZSE9PTApcmV0dXJuIGU7bGV0IHQ9dGhpcy5tZW0uZW50cy5zaXplPjA7cmV0dXJuIGF3YWl0IHRoaXMubWVtLmNsZWFyKCksdGhpcy53YXJtZWQuY2xlYXIoKSwwfSl9aW5nZXN0RnJvbUR1cmFibGUoZSl7cmV0dXJuIHRoaXMucnVuKGFzeW5jKCk9PntsZXR7Y2hhbmdlZDp0LHN0YXR1czpyfT1hd2FpdCB0aGlzLnB1bGxFaWRzKGUpO3JldHVybiB0aGlzLmVtaXQodCkscn0pfWFzeW5jIHB1bGxFaWRzKGUsdCl7bGV0IHI9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGxldCBzIG9mIGUpe2xldCBpPUMocyk7aWYobi5oYXMoaSkpY29udGludWU7bi5hZGQoaSk7bGV0W28sYV09YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhzKTtpZihhIT09MClyZXR1cm57Y2hhbmdlZDpyLHN0YXR1czphfTtsZXQgZD10aGlzLm1lbS5lbnRzLmdldChpKTtpZihkIT09dm9pZCAwJiZvIT09dm9pZCAwJiZwcyhkLG8pKWNvbnRpbnVlO2lmKHQpe2lmKCFBbyhocyhkKSx0LmdldChpKSkpY29udGludWV9aWYobyl7aWYodGhpcy5tZW0ucHV0KG8pLCFkfHwhd28oZCxvKSl7aWYoRihvKSlyLmFkZChvLnR5cGUpO2lmKGQhPT12b2lkIDAmJkYoZCkpci5hZGQoZC50eXBlKX19ZWxzZSBpZihkIT09dm9pZCAwKXtpZih0aGlzLm1lbS5kZWwoaSksRihkKSlyLmFkZChkLnR5cGUpfX1yZXR1cm57Y2hhbmdlZDpyLHN0YXR1czowfX1hc3luYyB3YXJtVHlwZShlKXtpZih0aGlzLndhcm1lZC5oYXMoZSkpcmV0dXJuIDA7bGV0W3Qscl09YXdhaXQgdGhpcy5kdXJhYmxlLmdldEVudGl0aWVzKHt0eXBlOmV9KTtpZihyIT09MClyZXR1cm4gcjtpZih0KWZvcihsZXQgbiBvZiB0KXtsZXQgcz1DKG4uZWlkKSxpPXRoaXMubWVtLmVudHMuZ2V0KHMpO2lmKCFpfHxwcyhuLGkpKXRoaXMubWVtLnB1dChuKX1yZXR1cm4gdGhpcy53YXJtZWQuYWRkKGUpLDB9YXN5bmMgZ2V0Um93KGUpe2xldCB0PUMoZSk7aWYodGhpcy5tZW0uZW50cy5oYXModCkpcmV0dXJuIHRoaXMubWVtLmdldFJvdyhlKTtyZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2lmKHRoaXMubWVtLmVudHMuaGFzKHQpKXJldHVybiB0aGlzLm1lbS5nZXRSb3coZSk7bGV0W3Isbl09YXdhaXQgdGhpcy5kdXJhYmxlLmdldFJvdyhlKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyKXRoaXMubWVtLnB1dChyKTtyZXR1cm4gcChyKX0pfWFzeW5jIGdldEVudChlKXtsZXRbdCxyXT1hd2FpdCB0aGlzLmdldFJvdyhlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHwhRih0KSlyZXR1cm4gcCh2b2lkIDApO3JldHVybiBwKHQpfWFzeW5jIGdldEVudGl0aWVzKGUpe2lmKCF0aGlzLndhcm1lZC5oYXMoZS50eXBlKSl7bGV0IHQ9YXdhaXQgdGhpcy5ydW4oKCk9PnRoaXMud2FybVR5cGUoZS50eXBlKSk7aWYodCE9PTApcmV0dXJuIGModCl9cmV0dXJuIHRoaXMubWVtLmdldEVudGl0aWVzKGUpfWFzeW5jIGNvdW50RW50aXRpZXMoe3R5cGU6ZX0pe2lmKCF0aGlzLndhcm1lZC5oYXMoZSkpe2xldCB0PWF3YWl0IHRoaXMucnVuKCgpPT50aGlzLndhcm1UeXBlKGUpKTtpZih0IT09MClyZXR1cm4gYyh0KX1yZXR1cm4gdGhpcy5tZW0uY291bnRFbnRpdGllcyh7dHlwZTplfSl9YXN5bmMgY2hlY2tzdW0oZSl7cmV0dXJuIHRoaXMuZHVyYWJsZS5jaGVja3N1bShlKX19ZnVuY3Rpb24gd28oZSx0KXtpZihGKGUpIT09Rih0KSlyZXR1cm4hMTtpZihlLmN0ciE9PXQuY3RyKXJldHVybiExO2lmKGUudXBkYXRlZEF0LmdldFRpbWUoKSE9PXQudXBkYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZighWChlLmVpZCx0LmVpZCkpcmV0dXJuITE7aWYoIUYoZSl8fCFGKHQpKXJldHVybiEwO2lmKGUuY3JlYXRlZEF0LmdldFRpbWUoKSE9PXQuY3JlYXRlZEF0LmdldFRpbWUoKSlyZXR1cm4hMTtpZihlLnR5cGUhPT10LnR5cGUpcmV0dXJuITE7aWYoIXhvKGUucGlkLHQucGlkKSlyZXR1cm4hMTtpZighSW8oZS50YWdzLHQudGFncykpcmV0dXJuITE7cmV0dXJuIEVvKGUuYm9keSx0LmJvZHkpfWZ1bmN0aW9uIElvKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYoZT09PXZvaWQgMHx8dD09PXZvaWQgMClyZXR1cm4hMTtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl0hPT10W3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHhvKGUsdCl7aWYoZT09PXZvaWQgMCYmdD09PXZvaWQgMClyZXR1cm4hMDtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiExO3JldHVybiBYKGUsdCl9ZnVuY3Rpb24gRW8oZSx0KXtpZihPYmplY3QuaXMoZSx0KSlyZXR1cm4hMDtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIFgoZSx0KTtpZihlIGluc3RhbmNlb2YgRGF0ZSYmdCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7dHJ5e3JldHVybiBYKE1lKGUpLE1lKHQpKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gcHMoZSx0KXtsZXQgcj1lLnVwZGF0ZWRBdC5nZXRUaW1lKCksbj10LnVwZGF0ZWRBdC5nZXRUaW1lKCk7aWYociE9PW4pcmV0dXJuIHI+bjtyZXR1cm4gZS5jdHI+dC5jdHJ9ZnVuY3Rpb24gaHMoZSl7aWYoZT09PXZvaWQgMClyZXR1cm47cmV0dXJue3Q6ZS51cGRhdGVkQXQuZ2V0VGltZSgpLGN0cjplLmN0cn19ZnVuY3Rpb24gQW8oZSx0KXtpZihlPT09dm9pZCAwfHx0PT09dm9pZCAwKXJldHVybiBlPT09dDtyZXR1cm4gZS50PT09dC50JiZlLmN0cj09PXQuY3RyfWZ1bmN0aW9uIFBvKGUsdCl7bGV0IHI9bmV3IFNldCxuPVtdO2ZvcihsZXQgcyBvZiB0KXtsZXQgaT1DKHMuZWlkKSxvPWUuZW50cy5nZXQoaSksW2EsZF09ZXQobyxzKTtpZihkIT09MCl7bi5wdXNoKGQpO2NvbnRpbnVlfWlmKGE9PT12b2lkIDApe24ucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCB1IG9mIHR0KG8sYSkpci5hZGQodSk7ZS5wdXQoYSksbi5wdXNoKDApfXJldHVybntzdGF0czpuLHR5cGVzOnJ9fWZ1bmN0aW9uIEYoZSl7cmV0dXJuInR5cGUiaW4gZX1mdW5jdGlvbiBVbyhlLHQpe2xldCByPXQuZXhjbHVkZVN0YXJ0P2U+dC5zdGFydDplPj10LnN0YXJ0LG49dC5leGNsdWRlRW5kP2U8dC5lbmQ6ZTw9dC5lbmQ7cmV0dXJuIHImJm59ZnVuY3Rpb24geXQoZSl7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHAoITApO2lmKGUucmFuZ2Uuc3RhcnQ+ZS5yYW5nZS5lbmQpcmV0dXJuIGMoMTApO3JldHVybiBwKCEwKX1mdW5jdGlvbiBMcihlLHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO3JldHVybiBVbyhlLHQucmFuZ2UpfWZ1bmN0aW9uIGtvKGUsdCl7bGV0IHI9dC5leGNsdWRlU3RhcnQ/ZT50LnN0YXJ0OmU+PXQuc3RhcnQsbj10LmV4Y2x1ZGVFbmQ/ZTx0LmVuZDplPD10LmVuZDtyZXR1cm4gciYmbn1mdW5jdGlvbiBtdChlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKXJldHVybiBwKGUubGVuZ3RoPjApO2lmKCJyYW5nZSJpbiBlKXtpZihlLnJhbmdlLnN0YXJ0PmUucmFuZ2UuZW5kKXJldHVybiBjKDEwKTtyZXR1cm4gcCghMCl9cmV0dXJuIHAoZS5wcmVmaXgubGVuZ3RoPjApfWZ1bmN0aW9uIEtyKGUsdCl7aWYodHlwZW9mIHQ9PT0ic3RyaW5nIilyZXR1cm4gZT09PXQ7aWYoInJhbmdlImluIHQpcmV0dXJuIGtvKGUsdC5yYW5nZSk7aWYodC5wcmVmaXgubGVuZ3RoPT09MClyZXR1cm4hMTtyZXR1cm4gZS5zdGFydHNXaXRoKHQucHJlZml4KX1mdW5jdGlvbiBCbyhlKXtpZighQXJyYXkuaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wKXJldHVybjtsZXQgdD1uZXcgU2V0LHI9W107Zm9yKGxldCBuIG9mIGUpe2lmKHR5cGVvZiBuIT09InN0cmluZyJ8fG4ubGVuZ3RoPT09MCljb250aW51ZTtpZih0LmhhcyhuKSljb250aW51ZTt0LmFkZChuKSxyLnB1c2gobil9cmV0dXJuIHIubGVuZ3RoPjA/cjp2b2lkIDB9ZnVuY3Rpb24gRnQoZSl7cmV0dXJue2VpZDplLmVpZCxjdHI6ZS5jdHIsdXBkYXRlZEF0OmUudXBkYXRlZEF0fX1mdW5jdGlvbiBtcyhlKXtsZXQgdD1uZXcgTChlLmVpZCksW3Isbl09dC5yZWFkU3RydWN0KGFlKTtpZihuIT09MClyZXR1cm4gYyhuKTtyZXR1cm4gcCh7ZWlkOmUuZWlkLGN0cjplLmN0cix1cGRhdGVkQXQ6bmV3IERhdGUoci50cy5nZXRUaW1lKCkrZS5vZmYpfSl9ZnVuY3Rpb24gZXQoZSx0KXtsZXQgcj1uZXcgTCh0LmVpZCksW24sc109ci5yZWFkU3RydWN0KGFlKTtpZihzIT09MClyZXR1cm4gYyhzKTtsZXQgaT1uZXcgRGF0ZShuLnRzLmdldFRpbWUoKSt0Lm9mZik7aWYoZSE9PXZvaWQgMCYmaTw9ZS51cGRhdGVkQXQpcmV0dXJuIGMoMTUpO2lmKGFzKHQpKXtsZXQgbz1Cbyh0LnRhZ3MpO3JldHVybiBwKHtlaWQ6dC5laWQscGlkOnQucGlkLC4uLm8hPT12b2lkIDA/e3RhZ3M6b306e30sdHlwZTp0LnR5cGUsY3JlYXRlZEF0Om4udHMsdXBkYXRlZEF0OmksY3RyOnQuY3RyLGJvZHk6dC5ib2R5fSl9cmV0dXJuIHAoe2VpZDp0LmVpZCx1cGRhdGVkQXQ6aSxjdHI6dC5jdHJ9KX1mdW5jdGlvbiB0dChlLHQpe2xldCByPW5ldyBTZXQ7aWYoZSE9PXZvaWQgMCYmRihlKSlyLmFkZChlLnR5cGUpO2lmKEYodCkpci5hZGQodC50eXBlKTtyZXR1cm5bLi4ucl19Y2xhc3MgV3R7aW5mbGlnaHQ9bnVsbDthZ2Fpbj0hMTtydW4oZSl7aWYodGhpcy5hZ2Fpbj0hMCx0aGlzLmluZmxpZ2h0KXJldHVybiB0aGlzLmluZmxpZ2h0O3JldHVybiB0aGlzLmluZmxpZ2h0PXRoaXMuZHJhaW4oZSksdGhpcy5pbmZsaWdodH1hc3luYyBmbHVzaCgpe2lmKCF0aGlzLmluZmxpZ2h0KXJldHVybjt0cnl7YXdhaXQgdGhpcy5pbmZsaWdodH1jYXRjaHt9fWFzeW5jIGRyYWluKGUpe3RyeXt0aGlzLmFnYWluPSExO2xldCB0PWF3YWl0IGUoKTt3aGlsZSh0aGlzLmFnYWluKXRoaXMuYWdhaW49ITEsdD1hd2FpdCBlKCk7cmV0dXJuIHR9ZmluYWxseXt0aGlzLmluZmxpZ2h0PW51bGx9fX12YXIgZ3M9MTAwO2NsYXNzIF9ye3RpbWVyPW51bGw7ZGVsYXlNczt3b3JrO3RhaWw9bmV3IFd0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kZWxheU1zPWU8MD8wOmUsdGhpcy53b3JrPXR9c2NoZWR1bGUoKXtpZih0aGlzLmRlbGF5TXM8PTApe3RoaXMuZmlyZSgpO3JldHVybn1pZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lcik7dGhpcy50aW1lcj1zZXRUaW1lb3V0KCgpPT57dGhpcy50aW1lcj1udWxsLHRoaXMuZmlyZSgpfSx0aGlzLmRlbGF5TXMpfWFzeW5jIGZsdXNoKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKTthd2FpdCB0aGlzLnRhaWwuZmx1c2goKX1jYW5jZWwoKXtpZih0aGlzLnRpbWVyIT09bnVsbCljbGVhclRpbWVvdXQodGhpcy50aW1lciksdGhpcy50aW1lcj1udWxsfWZpcmUoKXtyZXR1cm4gdGhpcy50YWlsLnJ1bih0aGlzLndvcmspfX1mdW5jdGlvbiBTcyhlKXtsZXQgdD1uZXcgTChlLmVpZCksW3Isbl09YWUuZGVjb2RlKHQpO2lmKG4hPT0wKXJldHVybjtyZXR1cm4gci50cy5nZXRUaW1lKCkrZS5vZmZ9ZnVuY3Rpb24gdm8oZSx0KXtsZXQgcj1TcyhlKSxuPVNzKHQpO2lmKHI9PT12b2lkIDAmJm49PT12b2lkIDApcmV0dXJuIDA7aWYocj09PXZvaWQgMClyZXR1cm4gMTtpZihuPT09dm9pZCAwKXJldHVybi0xO2lmKG4hPT1yKXJldHVybiBuLXI7cmV0dXJuIHQuY3RyLWUuY3RyfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIGUuc2xpY2UoKS5zb3J0KChyLG4pPT52byh0KHIpLHQobikpKX12YXIgTnI9e3BoYXNlOiJpZGxlIn0sZ3Q9NTA7ZnVuY3Rpb24gcXIoZSx0LHIpe2lmKGU8PTB8fHQ8PTApcmV0dXJuITE7aWYoZT09PTF8fGU9PT10KXJldHVybiEwO3JldHVybiBlJXI9PT0wfWZ1bmN0aW9uIGJzKGUsdCl7aWYodHlwZW9mIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iPT09ImZ1bmN0aW9uIil7bmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoZSx0KTtyZXR1cm59bGV0IHI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtuLmhyZWY9cixuLmRvd25sb2FkPXQsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSxuLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKSxVUkwucmV2b2tlT2JqZWN0VVJMKHIpfWZ1bmN0aW9uIHdzKGUsdCxyKXtsZXQgbj1bXSxzPVtdLGk9MDtmb3IobGV0IG8gb2YgZSl7bGV0IGE9dChvKTtpZihzLmxlbmd0aD4wJiZpK2E+ciluLnB1c2gocykscz1bXSxpPTA7aWYocy5wdXNoKG8pLGkrPWEsaT49ciluLnB1c2gocykscz1bXSxpPTB9aWYocy5sZW5ndGg+MCluLnB1c2gocyk7cmV0dXJuIG59YXN5bmMgZnVuY3Rpb24gRnIoZSx0LHIpe2xldCBuPWUubGVuZ3RoO2lmKG48MSlyZXR1cm5bXTtsZXQgcz1BcnJheShuKSxpPTAsbz1NYXRoLm1pbihNYXRoLm1heCgxLHQpLG4pLGE9YXN5bmMoKT0+e3doaWxlKCEwKXtsZXQgdT1pO2lmKGkrPTEsdT49bilyZXR1cm47c1t1XT1hd2FpdCByKGVbdV0sdSl9fSxkPVtdO2ZvcihsZXQgdT0wO3U8bzt1KyspZC5wdXNoKGEoKSk7cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGQpLHN9YXN5bmMgZnVuY3Rpb24genQoZSx0LHIsbil7bGV0IHM9bmV3IEwoZS5oZWFkQ3BoKSxbaSxvXT1zLnJlYWRTdHJ1Y3QoTXQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2xldHtzaWc6YSxrZG06ZCxoZWFkQ3BoOnV9PWk7aWYoIWF3YWl0IG4uY2hlY2tTaWdFZDI1NTE5KGEsdSx0KSlyZXR1cm4gYygzKTtsZXQgZj1yLmRlcml2ZUNpcGhlcihkLCJkZWNyeXB0IiksaDt0cnl7aD1hd2FpdCBmLmRlY3J5cHQodSl9Y2F0Y2h7cmV0dXJuIGMoMjApfXJldHVybiBwKHtrZG06ZCxoZWFkRW5jOmh9KX12YXIgc3Q9ImYiLFh0PSJ0IixudD0iZSI7ZnVuY3Rpb24gRG8oZSl7aWYoZT09PSEwfHxlPT09WHQpcmV0dXJuIFh0O2lmKGU9PT1udClyZXR1cm4gbnQ7cmV0dXJuIHN0fWZ1bmN0aW9uIElzKGUpe3JldHVybiBlIT09MCYmZSE9PTE1JiZlIT09MTgmJmUhPT0xN31mdW5jdGlvbiBXcihlLHQscil7aWYoZS5hcGxkPXQsdD09PW50JiZyIT09dm9pZCAwKWUuZXJyPXI7ZWxzZSBkZWxldGUgZS5lcnJ9YXN5bmMgZnVuY3Rpb24ganQoZSx0LHIsbil7bGV0IHM9bj8uYm9keSE9PSExLGk9RG8odC5hcGxkKSxvPXQuYm9keSxhPW8/Lmxlbmd0aD8/MCxkO2lmKHMmJm8mJmE+MClkPWF3YWl0IHIuYmxha2UzKG8pO2xldCB1PXtlaWQ6dC5laWQsb2ZmOnQub2ZmPz8wLGN0cjp0LmN0cj8/MCxsZW46YSxoc2g6ZH0sbD17aGFzaDplLGhlYWQ6dSxhcGxkOml9O2lmKHMmJm8hPT12b2lkIDApbC5ib2R5PW87aWYoaT09PW50JiZ0LmVyciE9PXZvaWQgMClsLmVycj10LmVycjtyZXR1cm4gbH12YXIgenI9MTA0ODU3NixYcj0xMDQ4NTc2LEVzPTY0O2Z1bmN0aW9uIENvKGUpe3JldHVybiBlLnNpZy5sZW5ndGgrZS5rZG0ubGVuZ3RoK2UuaGVhZENwaC5sZW5ndGgrZS5ib2R5Q3BoLmxlbmd0aH1hc3luYyBmdW5jdGlvbiBUbyhlLHQscixuLHMpe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIDA7bGV0W2ksb109YXdhaXQgZS5wdXNoKG4pO2lmKG8hPT0wKXJldHVybiBvO2lmKCFpKXJldHVybiAyNztmb3IobGV0IGQgb2YgaSl7aWYoZC5zdGF0dXMhPT0wKXtjb25zb2xlLmVycm9yKCJwdXNoIGVyciIsZCk7Y29udGludWV9bGV0IHU9c1tkLmlkeF07aWYoIXUpe2NvbnNvbGUuZXJyb3IoIm5vIGhhc2giLGQpO2NvbnRpbnVlfWF3YWl0IHQudXBsb2Fkcy5kZXEocixbdV0pfWxldCBhPWF3YWl0IHQuaG9zdHMuZ2V0KHIpO2lmKGEpe2xldCBkPWEubGFzdFNlcSx1PWQsbD1bXTtmb3IobGV0IGYgb2YgaSlpZihmLnN0YXR1cz09PTApbC5wdXNoKGYuc2VxKTtsLnNvcnQoKGYsaCk9PmYtaCk7Zm9yKGxldCBmIG9mIGwpaWYoZj09PWQrMSlkPWY7aWYoZD51KWF3YWl0IHQuaG9zdHMudG91Y2gocixkKX1yZXR1cm4gMH1hc3luYyBmdW5jdGlvbiB4cyhlLHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuIHAoW10pO2xldCByPW5ldyBNYXAsbj1bXTtmb3IobGV0IGEgb2YgdClyLnNldChhLnNlcSxhKSxuLnB1c2goYS5zZXEpO2xldFtzLGldPWF3YWl0IGUucHVsbChuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZighcylyZXR1cm4gYygyNyk7bGV0IG89W107Zm9yKGxldHtzZXE6YSxib2R5Q3BoOmR9b2Ygcyl7bGV0IHU9ci5nZXQoYSk7aWYoIXUpY29udGludWU7by5wdXNoKHtkbDp1LGJvZHlDcGg6ZH0pfXJldHVybiBwKG8pfWFzeW5jIGZ1bmN0aW9uIEhvKGUsdCxyLG4pe2lmKG4ubGVuZ3RoPDEpcmV0dXJuIHAoe3BhcnRzOltdLGhhc2hlczpbXX0pO2xldCBzPVtdLGk9W10sbz1bXSxhPW5ldyBNYXA7Zm9yKGxldHtkbDp1LGJvZHlDcGg6bH1vZiBuKXtsZXR7aGVhZDpmLGtkbTpoLHNlcTp5LGhvc3Q6Z309dSxbbSxTXT1hd2FpdCBBcyh1LHIpO2lmKFMhPT0wfHwhbSl7bGV0IFQ9YS5nZXQoZyk/P1tdO1QucHVzaCh5KSxhLnNldChnLFQpO2NvbnRpbnVlfWxldHtoZWFkRW5jOngsaGVhZEVuY0hhc2g6Yn09bSxFPXQuZGVyaXZlQ2lwaGVyKGgsImRlY3J5cHQiKSxbdyxBXT1hd2FpdCBBcih4LGwsRSxyLGIpO2lmKEEhPT0wfHwhdyl7bGV0IFQ9YS5nZXQoZyk/P1tdO1QucHVzaCh5KSxhLnNldChnLFQpO2NvbnRpbnVlfWxldCBCPXtoZWFkOmYsYm9keTp3LmJvZH0sRD13LmhlYWRIYXNoO28ucHVzaCh7a2V5OkQsZGF0YTprcyhCKX0pLHMucHVzaChCKSxpLnB1c2goRCk7bGV0IEg9YS5nZXQoZyk/P1tdO0gucHVzaCh5KSxhLnNldChnLEgpfWxldCBkPWF3YWl0IGUubWVzc2FnZXMuYWRkKG8pO2ZvcihsZXRbdSxsXW9mIGEpYXdhaXQgZS5kb3dubG9hZHMuZGVxKHUsbCk7Zm9yKGxldCB1PTA7dTxkLmxlbmd0aDt1Kyspe2xldCBsPWRbdV07aWYobCE9PTAmJmwhPT0xNSljb25zb2xlLmVycm9yKCJFUlIgc3RvcmluZyIsVVtsXSwiZm9yIG1lc3NhZ2UiLHUpfXJldHVybiBwKHtwYXJ0czpzLGhhc2hlczppfSl9YXN5bmMgZnVuY3Rpb24gQXMoZSx0KXtsZXQgcj1lLmhlYWRFbmM7aWYoIXIpe2xldCBzPW5ldyBLLGk9cy53cml0ZVN0cnVjdChkZSxlLmhlYWQpO2lmKGkhPT0wKXJldHVybiBjKGkpO3I9cy5yZXN1bHQoKX1pZihlLmhlYWRFbmNIYXNoKXJldHVybiBwKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6ZS5oZWFkRW5jSGFzaH0pO2xldCBuPWF3YWl0IHQuYmxha2UzKHIpO3JldHVybiBwKHtoZWFkRW5jOnIsaGVhZEVuY0hhc2g6bn0pfWFzeW5jIGZ1bmN0aW9uIFBzKGUsdCxyKXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgbyBvZiB0KW4uYWRkKEMobykpO2lmKG4uc2l6ZTwxKXJldHVybjtsZXQgcz1BcnJheS5mcm9tKGF3YWl0IGUuZG93bmxvYWRzLmxpc3QoKSk7aWYocy5sZW5ndGg8MSlyZXR1cm47bGV0IGk9bmV3IE1hcDtmb3IobGV0IG8gb2Ygcyl7bGV0IGE7aWYoby5oZWFkRW5jSGFzaClhPUMoby5oZWFkRW5jSGFzaCk7ZWxzZXtsZXRbdSxsXT1hd2FpdCBBcyhvLHIpO2lmKGwhPT0wfHwhdSljb250aW51ZTthPUModS5oZWFkRW5jSGFzaCl9aWYoIW4uaGFzKGEpKWNvbnRpbnVlO2xldCBkPWkuZ2V0KG8uaG9zdCk/P1tdO2QucHVzaChvLnNlcSksaS5zZXQoby5ob3N0LGQpfWZvcihsZXRbbyxhXW9mIGkpYXdhaXQgZS5kb3dubG9hZHMuZGVxKG8sYSl9YXN5bmMgZnVuY3Rpb24ganIoe2Nvbm46ZSxzdG9yZTp0LGVuY2xhdmU6cixob3N0Om4sY3J5cHRvOnMsb25Qcm9ncmVzczppLHBlZWtQcm9ncmVzc0V2ZXJ5Om8scGVla0NvbmN1cnJlbmN5OmF9KXtsZXQgZD1hd2FpdCBlLmlkZW50aXR5KCksdT1bXSxbbCxmXT1hd2FpdCBlLnBlZWsobi5sYXN0U2VxKTtpZihmIT09MClyZXR1cm4gZjtsZXQgaD1sLmxlbmd0aCx5PW8/P2d0LGc9YT8/RXM7aWYoaSYmaD4wKWkoe3BoYXNlOiJwZWVrIixob3N0Om4ubGFiZWwsZG9uZTowLHRvdGFsOmh9KTtsZXQgbT0wLFM9YXdhaXQgRnIobCxnLGFzeW5jKGIpPT57bGV0W0Usd109YXdhaXQgenQoYixkLnB1YmxpY0tleSxyLHMpLEE7aWYodyE9PTB8fCFFKUE9e29rOiExLHNlcTpiLnNlcSxzdGF0Ond9O2Vsc2V7bGV0IEI9YXdhaXQgcy5ibGFrZTMoRS5oZWFkRW5jKTtBPXtvazohMCxzZXE6Yi5zZXEsa2RtOkUua2RtLGhlYWRFbmM6RS5oZWFkRW5jLGhlYWRFbmNIYXNoOkJ9fWlmKG0rPTEsaSYmcXIobSxoLHkpKWkoe3BoYXNlOiJwZWVrIixob3N0Om4ubGFiZWwsZG9uZTptLHRvdGFsOmh9KTtyZXR1cm4gQX0pLHg9bmV3IFNldDtmb3IobGV0IGIgb2YgUyl7aWYoIWIub2spe2NvbnNvbGUuZXJyb3IoInBlZWs6IGRlY3J5cHRpbmcgaXRlbSBoZWFkIixiLnN0YXQpO2NvbnRpbnVlfWxldCBFPUMoYi5oZWFkRW5jSGFzaCk7aWYoYXdhaXQgdC5tZXNzYWdlcy5oYXMoYi5oZWFkRW5jSGFzaCkpe2NvbnNvbGUuaW5mbygicGVlazogbG9jYWwgbXNnOyBza2lwIGRvd25sb2FkLCBkZXEgdXBsb2FkIiksYXdhaXQgdC51cGxvYWRzLmRlcShuLmxhYmVsLFtiLmhlYWRFbmNIYXNoXSksYXdhaXQgdC5kb3dubG9hZHMuZGVxKG4ubGFiZWwsW2Iuc2VxXSk7Y29udGludWV9aWYoeC5oYXMoRSkpe2F3YWl0IHQuZG93bmxvYWRzLmRlcShuLmxhYmVsLFtiLnNlcV0pO2NvbnRpbnVlfWxldCBBPW5ldyBMKGIuaGVhZEVuYyksW0IsRF09QS5yZWFkU3RydWN0KGRlKTtpZihEIT09MCl7Y29uc29sZS5lcnJvcigicGVlazogcmVhZGluZyBpdGVtIGhlYWQiLEQpO2NvbnRpbnVlfXguYWRkKEUpLHUucHVzaCh7a2RtOmIua2RtLGhlYWQ6QixzZXE6Yi5zZXEsaG9zdDpuLmxhYmVsLGhlYWRFbmM6Yi5oZWFkRW5jLGhlYWRFbmNIYXNoOmIuaGVhZEVuY0hhc2h9KX1pZihhd2FpdCB0LmRvd25sb2Fkcy5lbnEodSksbC5sZW5ndGg+MCl7bGV0IGI9TWF0aC5tYXgoLi4ubC5tYXAoKEUpPT5FLnNlcSkpO2F3YWl0IHQuaG9zdHMucmVjb3JkU3RhdHMobi5sYWJlbCx7bGFzdFNlcTpifSl9aWYoaSlpKHtwaGFzZToicGVlayIsaG9zdDpuLmxhYmVsLGRvbmU6aCx0b3RhbDpofSk7cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gVXMoe2Nvbm46ZSxzdG9yZTp0LGhvc3Q6cixtYXhQdXNoQnl0ZXM6bixvblByb2dyZXNzOnN9KXtsZXQgaT1uPz96cixvPWF3YWl0IHQudXBsb2Fkcy5saXN0KHIubGFiZWwpLGE9by5sZW5ndGgsZD0wO2lmKHMmJmE+MClzKHtwaGFzZToicHVzaCIsaG9zdDpyLmxhYmVsLGRvbmU6MCx0b3RhbDphfSk7bGV0IHU9W10sbD1bXSxmPTAsaD1hc3luYygpPT57aWYodS5sZW5ndGg8MSlyZXR1cm4gMDtsZXQgeT11Lmxlbmd0aCxnPWF3YWl0IFRvKGUsdCxyLmxhYmVsLHUsbCk7aWYodT1bXSxsPVtdLGY9MCxnPT09MCl7aWYoZCs9eSxzKXMoe3BoYXNlOiJwdXNoIixob3N0OnIubGFiZWwsZG9uZTpkLHRvdGFsOmF9KX1yZXR1cm4gZ307Zm9yKGxldCB5IG9mIG8pe2xldCBnPWF3YWl0IHQubWVzc2FnZXMuZ2V0KHkpO2lmKCFnKXtkKz0xO2NvbnRpbnVlfWxldCBtPXsuLi5nLmhlYWQsYm9kOmcuYm9keX0sW1MseF09YXdhaXQgZS5zZWFsKG0pO2lmKHghPT0wKXJldHVybiB4O2lmKCFTKXJldHVybiAxMjtsZXQgYj1DbyhTKTtpZih1Lmxlbmd0aD4wJiZmK2I+aSl7bGV0IEU9YXdhaXQgaCgpO2lmKEUhPT0wKXJldHVybiBFfWlmKHUucHVzaChTKSxsLnB1c2goeSksZis9YixmPj1pKXtsZXQgRT1hd2FpdCBoKCk7aWYoRSE9PTApcmV0dXJuIEV9fXJldHVybiBoKCl9YXN5bmMgZnVuY3Rpb24gJHIoe2Nvbm46ZSxzdG9yZTp0LGVuY2xhdmU6cixob3N0Om4sY3J5cHRvOnMsbWF4UHVsbEJ5dGVzOmksb25Qcm9ncmVzczpvfSxhKXtsZXQgZD1pPz9Ycix1PWF3YWl0IHQuZG93bmxvYWRzLmxpc3QoKSxsPUFycmF5LmZyb20odSkuZmlsdGVyKChTKT0+Uy5ob3N0PT09bi5sYWJlbCk7aWYobC5sZW5ndGg8MSlyZXR1cm4gMTU7bGV0IGY9cnQobCwoUyk9PlMuaGVhZCksaD13cyhmLChTKT0+Uy5oZWFkLmxlbixkKSx5PWYubGVuZ3RoLGc9MDtpZihvKW8oe3BoYXNlOiJwdWxsIixob3N0Om4ubGFiZWwsZG9uZTowLHRvdGFsOnl9KTtsZXQgbT14cyhlLGhbMF0pO2ZvcihsZXQgUz0wO1M8aC5sZW5ndGg7UysrKXtsZXRbeCxiXT1hd2FpdCBtO2lmKGIhPT0wfHwheClyZXR1cm4gYjtpZihnKz1oW1NdLmxlbmd0aCxvKW8oe3BoYXNlOiJwdWxsIixob3N0Om4ubGFiZWwsZG9uZTpnLHRvdGFsOnl9KTtsZXQgRT1oW1MrMV07aWYoRSltPXhzKGUsRSk7aWYobylvKHtwaGFzZToib3BlbiIsaG9zdDpuLmxhYmVsLGRvbmU6Zyx0b3RhbDp5fSk7bGV0IHc9cnQoeCwoQik9PkIuZGwuaGVhZCksWyxBXT1hd2FpdCBIbyh0LHIscyx3KTtpZihBIT09MClyZXR1cm4gQTtpZihhKXtpZihvKW8oe3BoYXNlOiJleGVjIixob3N0Om4ubGFiZWwsZG9uZTpnLHRvdGFsOnl9KTthd2FpdCBhKCl9fXJldHVybiAwfWZ1bmN0aW9uIGtzKHtoZWFkOmUsYm9keTp0fSl7bGV0IHI9e2VpZDplLmVpZCxib2R5OnQsYXBsZDpzdH07aWYoZS5vZmYhPT0wKXIub2ZmPWUub2ZmO2lmKGUuY3RyIT09MClyLmN0cj1lLmN0cjtyZXR1cm4gcn1hc3luYyBmdW5jdGlvbiBCcyhlLHtjb25uOnQsc3RvcmU6cixlbmNsYXZlOm4saG9zdDpzLGNyeXB0bzppLG9uUHJvZ3Jlc3M6b30sYSl7bGV0IGQ9cy5sYWJlbCx1PWF3YWl0IHQuaWRlbnRpdHkoKSxsPW5ldyBMKGUpLFtmLGhdPWwucmVhZFN0cnVjdHMoSHQpO2lmKGghPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgZGVjb2Rpbmcgbm90aWYiLFVbaF0pO3JldHVybn1sZXQgeT0hMSxtPShhd2FpdCByLmhvc3RzLmdldChkKSk/Lmxhc3RTZXEsUz1bXSx4PSExO2ZvcihsZXQgdyBvZiBmKXtsZXRbQSxCXT1hd2FpdCB6dCh7c2VxOncuc2VxLGhlYWRDcGg6dy5oZWFkQ3BofSx1LnB1YmxpY0tleSxuLGkpO2lmKEIhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgZGVjcnlwdGluZyBub3RpZiIsVVtCXSk7Y29udGludWV9bGV0IEQ9YXdhaXQgaS5ibGFrZTMoQS5oZWFkRW5jKTtpZihhd2FpdCByLm1lc3NhZ2VzLmhhcyhEKSljb250aW51ZTtsZXQgSD1uZXcgTChBLmhlYWRFbmMpLFtULE9dPUgucmVhZFN0cnVjdChkZSk7aWYoTyE9PTApe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBoZWFkIixVW09dKTtjb250aW51ZX1pZighdy5ib2R5Q3BoJiZULmxlbj4wKXg9ITAsYXdhaXQgci5kb3dubG9hZHMuZW5xKFt7c2VxOncuc2VxLGhvc3Q6ZCxrZG06QS5rZG0saGVhZDpULGhlYWRFbmM6QS5oZWFkRW5jLGhlYWRFbmNIYXNoOkR9XSk7ZWxzZSBTLnB1c2goey4uLkEsaGVhZDpULGJvZHlDcGg6dy5ib2R5Q3BoLGhlYWRFbmNIYXNoOkR9KTtpZihtPT09dm9pZCAwfHx3LnNlcSE9PW0rMSljb25zb2xlLmxvZygib3V0IG9mIHNlcSIsdy5zZXEsbSkseT0hMDtlbHNlIG09dy5zZXF9aWYobSE9PXZvaWQgMClhd2FpdCByLmhvc3RzLnRvdWNoKHMubGFiZWwsbSk7bGV0IGI9W107Zm9yKGxldCB3IG9mIFMpe2xldCBBPW4uZGVyaXZlQ2lwaGVyKHcua2RtLCJkZWNyeXB0IiksW0IsRF09YXdhaXQgQXIody5oZWFkRW5jLHcuYm9keUNwaCxBLGkpO2lmKEQhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gb3BlbiBib2R5IixVW0RdKTtjb250aW51ZX1iLnB1c2goe2tleTp3LmhlYWRFbmNIYXNoLGRhdGE6a3Moe2hlYWQ6dy5oZWFkLGJvZHk6Qi5ib2R9KX0pfWxldCBFPWF3YWl0IHIubWVzc2FnZXMuYWRkKGIpO2ZvcihsZXQgdz0wO3c8RS5sZW5ndGg7dysrKXtsZXQgQT1FW3ddO2lmKEEhPT0wJiZBIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLFVbQV0sImZvciBtZXNzYWdlIix3KX1pZihvJiZiLmxlbmd0aD4wKW8oe3BoYXNlOiJvcGVuIixob3N0OnMubGFiZWwsZG9uZTpiLmxlbmd0aCx0b3RhbDpiLmxlbmd0aH0pO2lmKHl8fHh8fGIubGVuZ3RoPjApYSgpfWFzeW5jIGZ1bmN0aW9uIEdyKGUsdD17fSl7bGV0IHI9dC5wdWxsIT09ITEsbj10LnB1c2g9PT0hMCx7Y29ubjpzLHN0b3JlOmksZW5jbGF2ZTpvLGhvc3Q6YSxjcnlwdG86ZCxvblByb2dyZXNzOnUscGVla1Byb2dyZXNzRXZlcnk6bCxwZWVrQ29uY3VycmVuY3k6Zn09ZSxoPWF3YWl0IHMuaWRlbnRpdHkoKSxbeSxnXT1hd2FpdCBzLnBlZWsoMCk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0IG09eS5sZW5ndGgsUz1sPz9ndCx4PWY/P0VzO2lmKHUmJm0+MCl1KHtwaGFzZToicGVlayIsaG9zdDphLmxhYmVsLGRvbmU6MCx0b3RhbDptfSk7bGV0IGI9MCxFPWF3YWl0IEZyKHkseCxhc3luYyh2KT0+e2xldFtSLE1dPWF3YWl0IHp0KHYsaC5wdWJsaWNLZXksbyxkKSxxO2lmKE0hPT0wfHwhUilxPXtvazohMSxzZXE6di5zZXEsc3RhdDpNfTtlbHNle2xldCBrPWF3YWl0IGQuYmxha2UzKFIuaGVhZEVuYyk7cT17b2s6ITAsc2VxOnYuc2VxLGtkbTpSLmtkbSxoZWFkRW5jOlIuaGVhZEVuYyxoZWFkRW5jSGFzaDprfX1pZihiKz0xLHUmJnFyKGIsbSxTKSl1KHtwaGFzZToicGVlayIsaG9zdDphLmxhYmVsLGRvbmU6Yix0b3RhbDptfSk7cmV0dXJuIHF9KSx3PW5ldyBNYXA7Zm9yKGxldCB2IG9mIEUpe2lmKCF2Lm9rKWNvbnRpbnVlO2xldCBSPUModi5oZWFkRW5jSGFzaCksTT13LmdldChSKTtpZihNKU0uY291bnQrPTE7ZWxzZSB3LnNldChSLHtoYXNoOnYuaGVhZEVuY0hhc2gsY291bnQ6MSxzYW1wbGU6dn0pfWxldCBBPTAsQj1bXTtmb3IobGV0IHYgb2Ygdy52YWx1ZXMoKSl7aWYodi5jb3VudD4xKUErPXYuY291bnQtMTtCLnB1c2godi5oYXNoKX1sZXQgRD15Lmxlbmd0aCxIPXcuc2l6ZSxUPWF3YWl0IGh0KEIsZCksTz1bXSxOPTA7Zm9yKGxldCB2IG9mIHcudmFsdWVzKCkpe2lmKGF3YWl0IGkubWVzc2FnZXMuaGFzKHYuaGFzaCkpe2F3YWl0IGkudXBsb2Fkcy5kZXEoYS5sYWJlbCxbdi5oYXNoXSk7Y29udGludWV9aWYoTis9MSwhciljb250aW51ZTtsZXQgTT12LnNhbXBsZSxxPW5ldyBMKE0uaGVhZEVuYyksW2ssR109cS5yZWFkU3RydWN0KGRlKTtpZihHIT09MCl7Y29uc29sZS5lcnJvcigicmVjb25jaWxlOiByZWFkaW5nIG1zZyBoZWFkZXIiLEcpO2NvbnRpbnVlfU8ucHVzaCh7a2RtOk0ua2RtLGhlYWQ6ayxzZXE6TS5zZXEsaG9zdDphLmxhYmVsLGhlYWRFbmM6TS5oZWFkRW5jLGhlYWRFbmNIYXNoOk0uaGVhZEVuY0hhc2h9KX1pZihPLmxlbmd0aD4wKWF3YWl0IGkuZG93bmxvYWRzLmVucShPKTtsZXQgXz0wO2lmKG4pe2xldCB2PWF3YWl0IGkubWVzc2FnZXMubGlzdEtleXMoKSxSPW5ldyBTZXQody5rZXlzKCkpLE09W107Zm9yKGxldCBxIG9mIHYpaWYoIVIuaGFzKEMocSkpKV8rPTEsTS5wdXNoKHEpO2lmKE0ubGVuZ3RoPjApYXdhaXQgaS51cGxvYWRzLmVucShhLmxhYmVsLE0pfWVsc2V7bGV0IHY9YXdhaXQgaS5tZXNzYWdlcy5saXN0S2V5cygpLFI9bmV3IFNldCh3LmtleXMoKSk7Zm9yKGxldCBNIG9mIHYpaWYoIVIuaGFzKEMoTSkpKV8rPTF9bGV0IEk9eS5sZW5ndGg+MD9NYXRoLm1heCguLi55Lm1hcCgodik9PnYuc2VxKSk6MDtpZihhd2FpdCBpLmhvc3RzLnJlY29yZFN0YXRzKGEubGFiZWwse3NldExhc3RTZXE6SX0pLHUpdSh7cGhhc2U6InBlZWsiLGhvc3Q6YS5sYWJlbCxkb25lOm0sdG90YWw6bX0pO3JldHVybiBwKHttc2djaGVjazpULG51bUJhZ3M6RCx1bmlxdWVNc2dzOkgsbnVtRHVwZXM6QSxtaXNzaW5nTG9jYWw6TixtaXNzaW5nSG9zdDpffSl9ZnVuY3Rpb24gTW8oZSl7cmV0dXJuIGUubWFwKCh7aGVhZDp0LGJvZHk6cn0pPT4oey4uLnQsYm9kOnJ9KSl9Y2xhc3MgUXJ7Y2xvY2s7c3RhdGU7c3RvcmU7dHJhbnNwb3J0O2NyeXB0bztmb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdDtvblNjaGVkdWxlU3luYztjb25uZWN0aW9ucz1uZXcgTWFwO2FwcGx5Q2hhaW49UHJvbWlzZS5yZXNvbHZlKCk7c3luY1J1bnM9bmV3IFd0O2NsaWVudFN0YXRlO3hmZXJTdGF0ZTttYXhQdXNoQnl0ZXM7bWF4UHVsbEJ5dGVzO3BlZWtQcm9ncmVzc0V2ZXJ5PWd0O2xhc3RQcm9ncmVzcz1OcjtzY2hlZHVsZWRTeW5jO2NvbnN0cnVjdG9yKGUsdCxyLG4scyxpPSEwLG89enIsYT1YcixkKXt0aGlzLmNsb2NrPWU7dGhpcy5zdGF0ZT10O3RoaXMuc3RvcmU9cjt0aGlzLnRyYW5zcG9ydD1uO3RoaXMuY3J5cHRvPXM7dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdD1pO3RoaXMub25TY2hlZHVsZVN5bmM9ZDt0aGlzLm1heFB1c2hCeXRlcz1vLHRoaXMubWF4UHVsbEJ5dGVzPWEsdGhpcy5jbGllbnRTdGF0ZT1uZXcgUmUoKCk9PnRoaXMuZ2V0Q2xpZW50U3RhdGUoKSksdGhpcy54ZmVyU3RhdGU9bmV3IFJlKCgpPT50aGlzLmdldFhmZXJTdGF0ZSgpKSx0aGlzLnNjaGVkdWxlZFN5bmM9bmV3IF9yKGdzLGFzeW5jKCk9Pnt0cnl7Y29uc29sZS5pbmZvKCJSdW5uaW5nIHNjaGVkdWxlZCBzeW5jIiksYXdhaXQgdGhpcy5zeW5jKCl9Y2F0Y2godSl7Y29uc29sZS5lcnJvcigiRGVib3VuY2VkIHN5bmMgZmFpbGVkOiIsdSl9fSl9ZW1pdFByb2dyZXNzPShlKT0+e3RoaXMubGFzdFByb2dyZXNzPWUsdGhpcy54ZmVyU3RhdGUuZW1pdCgpfTthc3luYyBzZXRTZWVkKGUsdCl7YXdhaXQgdGhpcy5zdG9yZS5zZWVkLnNhdmUoZSx0KSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKX1hc3luYyBnZXRDbGllbnRTdGF0ZSgpe2xldHtzdG9yZTplLGNvbm5lY3Rpb25zOnR9PXRoaXMscj1hd2FpdCBlLnNlZWQubG9hZCgpLG49YXdhaXQgZS5ob3N0cy5saXN0KCkscz0hMTtmb3IobGV0IGkgb2YgdC52YWx1ZXMoKSlpZihpLmlzQ29ubmVjdGVkKCkpe3M9ITA7YnJlYWt9cmV0dXJue2hhc1NlZWQ6ciE9PXZvaWQgMCxoYXNIb3N0OkFycmF5LmZyb20obikubGVuZ3RoPjAsY29ubmVjdGVkOnN9fWFzeW5jIGdldFhmZXJTdGF0ZSgpe2xldHt1cGxvYWRzOmUsZG93bmxvYWRzOnR9PXRoaXMuc3RvcmUscj1hd2FpdCBlLmNvdW50KCk7cmV0dXJue251bURvd25sb2Fkczphd2FpdCB0LmNvdW50KCksbnVtVXBsb2FkczpyLHByb2dyZXNzOnRoaXMubGFzdFByb2dyZXNzfX1hcHBseT0oZSx0KT0+dGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseShlLHQpKTthc3luYyBkb0FwcGx5KGUsdD17ZW5xdWV1ZVVwbG9hZDohMCx0cmlnZ2VyVXBsb2FkOiEwfSl7bGV0IHI9dGhpcy5zdGF0ZS5hcHBseShNbyhlKSksbj1bXSxzPVtdO2ZvcihsZXR7aGVhZDpvLGJvZHk6YX1vZiBlKXtsZXQgZD1uZXcgSztkLndyaXRlU3RydWN0KGRlLG8pO2xldCB1PWQucmVzdWx0KCksbD1hd2FpdCB0aGlzLmNyeXB0by5ibGFrZTModSksZj17ZWlkOm8uZWlkLGJvZHk6YSxhcGxkOnN0fTtpZihvLm9mZiE9PTApZi5vZmY9by5vZmY7aWYoby5jdHIhPT0wKWYuY3RyPW8uY3RyO24ucHVzaChsKSxzLnB1c2goe2tleTpsLGRhdGE6Zn0pfWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMuYWRkKHMpLGF3YWl0IFBzKHRoaXMuc3RvcmUsbix0aGlzLmNyeXB0byk7bGV0IGk9YXdhaXQgcjtpZihhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKG4saSksdC5lbnF1ZXVlVXBsb2FkKXtsZXQgbz1bXTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKyl7bGV0IGQ9aVthXTtpZihkPT09MHx8ZD09PTE1KW8ucHVzaChuW2FdKX1pZihvLmxlbmd0aD4wKXtsZXQgYT1hd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKTtmb3IobGV0IGQgb2YgYSlhd2FpdCB0aGlzLnN0b3JlLnVwbG9hZHMuZW5xKGQubGFiZWwsbyk7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfX1pZih0LnRyaWdnZXJVcGxvYWQpdGhpcy5zY2hlZHVsZVN5bmMoKTtyZXR1cm4gaX1lbnF1ZXVlQXBwbHlKb2IoZSl7bGV0IHQ9dGhpcy5hcHBseUNoYWluLnRoZW4oZSxlKTtyZXR1cm4gdGhpcy5hcHBseUNoYWluPXQudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSx0fWRyYWluQXBwbHlRdWV1ZSgpe3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0RyYWluQXBwbHlRdWV1ZSgpKX1hc3luYyBkb0RyYWluQXBwbHlRdWV1ZSgpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdCh7YXBsZDpzdH0pO2lmKGUubGVuZ3RoPDEpcmV0dXJuW107bGV0IHQ9cnQoZSwocik9PnIuaGVhZCk7cmV0dXJuIHRoaXMuYXBwbHlTdG9yZWQodCl9YXBwbHlIYXNoZXM9KGUpPT50aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0FwcGx5SGFzaGVzKGUpKTthc3luYyBkb0FwcGx5SGFzaGVzKGUpe2xldCB0PVtdO2ZvcihsZXQgcyBvZiBlKXtsZXQgaT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmdldChzKTtpZihpKXQucHVzaChpKX1sZXQgcj1hd2FpdCB0aGlzLmFwcGx5U3RvcmVkKHQpLG49bmV3IE1hcDtmb3IobGV0IHM9MDtzPHQubGVuZ3RoO3MrKyluLnNldChDKHRbc10uaGFzaCkscltzXT8/MTIpO3JldHVybiBlLm1hcCgocyk9Pm4uZ2V0KEMocykpPz8xMyl9YXN5bmMgYXBwbHlTdG9yZWQoZSl7aWYoZS5sZW5ndGg8MSlyZXR1cm5bXTtsZXQgdD1lLm1hcCgobik9Pih7Li4ubi5oZWFkLGJvZDpuLmJvZHl9KSkscj1hd2FpdCB0aGlzLnN0YXRlLmFwcGx5KHQpO3JldHVybiBhd2FpdCB0aGlzLm1hcmtBcHBseVN0YXRzKGUubWFwKChuKT0+bi5oYXNoKSxyKSxyfWFzeW5jIG1hcmtBcHBseVN0YXRzKGUsdCl7bGV0IHI9W10sbj1bXTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7bGV0IGk9dFtzXTtpZihpPT09MHx8aT09PTE1KXIucHVzaChlW3NdKTtlbHNlIGlmKGkhPT12b2lkIDAmJklzKGkpKW4ucHVzaCh7a2V5OmVbc10sZXJyOml9KX1pZihyLmxlbmd0aD4wKWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubWFya0FwcGxpZWQocik7aWYobi5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtGYWlsZWQobil9YXN5bmMgaW5zZXJ0UmF3KGUpe2xldHtjbG9jazp0LGNyeXB0bzpyfT10aGlzLFtuLHNdPWF3YWl0IGlzKHtub3c6dC5ub3coKSxib2Q6ZSxjcnlwdG86cn0pO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBvPShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDpuLGJvZHk6ZX1dKSlbMF07aWYobyE9PTAmJm8hPT0xNSlyZXR1cm4gYyhvPz8xMik7cmV0dXJuIHAobil9YXN5bmMgbWFrZVVwZGF0ZShlLHQpe2xldHtjbG9jazpyLGNyeXB0bzpufT10aGlzLHM9ci5ub3coKTtpZihlLnVwZGF0ZWRBdC5nZXRUaW1lKCk+cy5nZXRUaW1lKCkpcmV0dXJuIGMoNCk7bGV0IGk9ZS5jdHIrMSxbbyxhXT1hd2FpdCBWdCh7bm93OnMsZWlkOmUuZWlkLGN0cjppLGJvZDp0LGNyeXB0bzpufSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7cmV0dXJuIHAoe2hlYWQ6byxib2R5OnR9KX1hc3luYyB1cGRhdGVXaXRoU2tldyhlLHQscil7aWYocj09PSExKXJldHVybiBjKDQpO2xldHtjbG9jazpuLGNyeXB0bzpzfT10aGlzLGk9bi5ub3coKSxvPW5ldyBMKGUuZWlkKSxbYSxkXT1vLnJlYWRTdHJ1Y3QoYWUpO2lmKGQhPT0wKXJldHVybiBjKGQpO2xldCB1PWUudXBkYXRlZEF0LmdldFRpbWUoKS1hLnRzLmdldFRpbWUoKSxsPXtlaWQ6ZS5laWQsb2ZmOnUrMSxjdHI6ZS5jdHIrMSxsZW46MH0saD0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6bCxib2R5OnZvaWQgMH1dKSlbMF07aWYoaCE9PTAmJmghPT0xNSlyZXR1cm4gYyhoPz8xMik7aWYodD09PXZvaWQgMClyZXR1cm4gcChsKTtsZXRbeSxnXT1UdCh7aWQ6YS5pZCx0czppfSk7aWYoZyE9PTApcmV0dXJuIGMoZyk7bGV0W20sU109YXdhaXQgVnQoe25vdzppLGVpZDp5LGN0cjowLGJvZDp0LGNyeXB0bzpzfSk7aWYoUyE9PTApcmV0dXJuIGMoUyk7bGV0IGI9KGF3YWl0IHRoaXMuYXBwbHkoW3toZWFkOm0sYm9keTp0fV0pKVswXTtpZihiIT09MCYmYiE9PTE1KXJldHVybiBjKGI/PzEyKTtyZXR1cm4gcChtKX1hc3luYyB1cGRhdGVSYXcoZSx0LHI9dGhpcy5mb3JjZVNrZXdIYW5kbGluZ0J5RGVmYXVsdCl7aWYoZS51cGRhdGVkQXQuZ2V0VGltZSgpPnRoaXMuY2xvY2subm93KCkuZ2V0VGltZSgpKXJldHVybiB0aGlzLnVwZGF0ZVdpdGhTa2V3KGUsdCxyKTtyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoYXN5bmMoKT0+e2xldFtuLHNdPWF3YWl0IHRoaXMubWFrZVVwZGF0ZShlLHQpO2lmKHMhPT0wKXJldHVybiBjKHMpO2xldCBvPShhd2FpdCB0aGlzLmRvQXBwbHkoW25dKSlbMF07aWYobyE9PTAmJm8hPT0xNSlyZXR1cm4gYyhvPz8xMik7cmV0dXJuIHAobi5oZWFkKX0pfWFzeW5jIGluc2VydChlKXtsZXR7Ym9keTp0LHR5cGU6cixwaWQ6bix0YWdzOnN9PWUsbz1NZSh7Ym9keTp0LHR5cGU6cixwaWQ6bix0YWdzOnN9KTtyZXR1cm4gdGhpcy5pbnNlcnRSYXcobyl9YXN5bmMgdXBkYXRlKGUpe2xldHtwcmlvcjp0LGJvZHk6cix0eXBlOm4scGlkOnMsdGFnczppLGZvcmNlOm99PWUsZD1NZSh7Ym9keTpyLHR5cGU6bixwaWQ6cyx0YWdzOml9KTtyZXR1cm4gdGhpcy51cGRhdGVSYXcodCxkLG8/P3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQpfWFzeW5jIGRlbGV0ZShlKXtsZXQgdD1lLmZvcmNlPz8hMDtpZigicHJpb3IiaW4gZSlyZXR1cm4gdGhpcy51cGRhdGVSYXcoZS5wcmlvcix2b2lkIDAsdCk7bGV0W3Isbl09YXdhaXQgdGhpcy5yZXZGcm9tQXJjaGl2ZShlLmVpZCk7aWYobiE9PTApcmV0dXJuIGMobik7cmV0dXJuIHRoaXMudXBkYXRlUmF3KHIsdm9pZCAwLHQpfWFzeW5jIHJldkZyb21BcmNoaXZlKGUpe2xldCB0PWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGFzdChlKTtpZih0KXJldHVybiBtcyh0LmhlYWQpO2xldCByPW5ldyBMKGUpLFtuLHNdPXIucmVhZFN0cnVjdChhZSk7aWYocyE9PTApcmV0dXJuIGMocyk7cmV0dXJuIHAoe2VpZDplLGN0cjotMSx1cGRhdGVkQXQ6bi50c30pfWFzeW5jIGdlbkVJRChlKXtsZXR7Y2xvY2s6dCxjcnlwdG86cn09dGhpcyxuPXQubm93KCk7aWYoZSE9PXZvaWQgMClyZXR1cm4gVHQoe2lkOmUsdHM6bn0pO2xldCBzPWF3YWl0IHIuZ2VuUmFuZG9tQnl0ZXMoOCk7cmV0dXJuIFR0KHtpZDpzLHRzOm59KX1zeW5jKCl7cmV0dXJuIHRoaXMuc3luY1J1bnMucnVuKCgpPT50aGlzLmRvU3luYygpKX1hc3luYyBkb1N5bmMoKXtsZXR7Y29ubmVjdGlvbnM6ZSxjcnlwdG86dCxzdG9yZTpyfT10aGlzLG49YXdhaXQgci5zZWVkLmxvYWQoKTtpZighbilyZXR1cm4gMjI7YXdhaXQgdGhpcy5kcmFpbkFwcGx5UXVldWUoKTtmb3IobGV0W3MsaV1vZiBlKXtsZXQgbz1hd2FpdCByLmhvc3RzLmdldChzKTtpZighbyljb250aW51ZTtsZXQgYT17Y29ubjppLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6byxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sZD1hd2FpdCBqcihhKTtpZihkIT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBlZWs6ICR7ZH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksZDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IHU9YXdhaXQgVXMoYSk7aWYodSE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwdXNoOiAke3V9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHU7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBsPWF3YWl0ICRyKGEsYXN5bmMoKT0+e2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCl9KTtpZihsIT09MCYmbCE9PTE1KXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVsbDogJHtsfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxsO3RoaXMueGZlclN0YXRlLmVtaXQoKX1yZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDB9YXN5bmMgcmVidWlsZChlKXtpZih0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpLGU/LmNoZWNrSG9zdD8/ITApe2xldCByPWF3YWl0IHRoaXMucmVwdWxsKCk7aWYociE9PTApcmV0dXJuIHJ9cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLnJlcGxheSgpKX1hc3luYyBtc2djaGVjaygpe2xldCBlPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdEtleXMoKTtyZXR1cm4gaHQoZSx0aGlzLmNyeXB0byl9bGlzdE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdChlKX1jb3VudE1zZ3MoZSl7cmV0dXJuIHRoaXMuc3RvcmUubWVzc2FnZXMuY291bnQoZSl9YXN5bmMgcmVjb25jaWxlKGUsdCl7dGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKTtsZXR7Y29ubmVjdGlvbnM6cixjcnlwdG86bixzdG9yZTpzfT10aGlzLGk9YXdhaXQgcy5zZWVkLmxvYWQoKTtpZighaSlyZXR1cm4gYygyMik7bGV0IG89YXdhaXQgcy5ob3N0cy5nZXQoZSk7aWYoIW8pcmV0dXJuIGMoMTMpO2xldCBhPXIuZ2V0KGUpO2lmKCFhfHwhYS5pc0Nvbm5lY3RlZCgpKXtpZihhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QobywhMSwhMSksbz1hd2FpdCBzLmhvc3RzLmdldChlKSwhbylyZXR1cm4gYygxMyk7YT1yLmdldChlKX1pZighYSlyZXR1cm4gYygxMik7bGV0IGQ9e2Nvbm46YSxzdG9yZTpzLGVuY2xhdmU6aSxjcnlwdG86bixtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sW3UsbF09YXdhaXQgR3Ioey4uLmQsaG9zdDpvfSx0KTtpZih0aGlzLnhmZXJTdGF0ZS5lbWl0KCksbCE9PTApcmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxjKGwpO2lmKCF1KXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksYygxMik7aWYodD8uc3luYz09PSExKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscCh1KTtsZXQgZj1hd2FpdCB0aGlzLnN5bmMoKTtpZihmIT09MClyZXR1cm4gYyhmKTtsZXQgaD1hd2FpdCBzLmhvc3RzLmdldChlKTtpZighaClyZXR1cm4gYygxMyk7bGV0W3ksZ109YXdhaXQgR3Ioey4uLmQsaG9zdDpofSx7cHVsbDohMSxwdXNoOiExfSk7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxnIT09MClyZXR1cm4gYyhnKTtpZigheSlyZXR1cm4gYygxMik7cmV0dXJuIHAoeSl9YXN5bmMgcmVwdWxsKCl7bGV0e2Nvbm5lY3Rpb25zOmUsY3J5cHRvOnQsc3RvcmU6cn09dGhpcyxuPWF3YWl0IHIuc2VlZC5sb2FkKCk7aWYoIW4pcmV0dXJuIDIyO2xldCBzPUFycmF5LmZyb20oYXdhaXQgci5ob3N0cy5saXN0KCkpO2lmKHMubGVuZ3RoPDEpcmV0dXJuIDA7Zm9yKGxldCBpIG9mIHMpe2xldCBvPWUuZ2V0KGkubGFiZWwpO2lmKCFvfHwhby5pc0Nvbm5lY3RlZCgpKWF3YWl0IHRoaXMuY29ubmVjdFRvSG9zdChpLCExLCExKX1mb3IobGV0W2ksb11vZiBlKXtsZXQgYT1hd2FpdCByLmhvc3RzLmdldChpKTtpZighYSljb250aW51ZTtsZXQgZD17Y29ubjpvLHN0b3JlOnIsZW5jbGF2ZTpuLGhvc3Q6ey4uLmEsbGFzdFNlcTowfSxjcnlwdG86dCxtYXhQdXNoQnl0ZXM6dGhpcy5tYXhQdXNoQnl0ZXMsbWF4UHVsbEJ5dGVzOnRoaXMubWF4UHVsbEJ5dGVzLG9uUHJvZ3Jlc3M6dGhpcy5lbWl0UHJvZ3Jlc3MscGVla1Byb2dyZXNzRXZlcnk6dGhpcy5wZWVrUHJvZ3Jlc3NFdmVyeX0sdT1hd2FpdCBqcihkKTtpZih1IT09MClyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHBlZWs6ICR7dX1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksdTt0aGlzLnhmZXJTdGF0ZS5lbWl0KCk7bGV0IGw9YXdhaXQgJHIoZCk7aWYobCE9PTAmJmwhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgcmVidWlsZDogZmFpbGVkIHRvIHB1bGw6ICR7bH1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksbDt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlcGxheSgpe2xldCBlPWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTtpZihlIT09MClyZXR1cm4gZTtsZXQgdD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoKSxyPXJ0KHQsKGkpPT5pLmhlYWQpLG49ci5sZW5ndGg7aWYobjwxKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMDtsZXQgcz0wO3doaWxlKHM8ci5sZW5ndGgpe2xldCBpPTAsbz0wLGE9cztmb3IobGV0IHU9czt1PHIubGVuZ3RoJiZvPDEwMCYmaTwxMDI0MDA7dSsrKWkrPXJbdV0uaGVhZC5sZW4sbysrLGE9dSsxO2xldCBkPXIuc2xpY2UocyxhKTthd2FpdCB0aGlzLmFwcGx5U3RvcmVkKGQpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiZXhlYyIsZG9uZTphLHRvdGFsOm59KSxzPWF9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHdpcGUoZSl7bGV0IHQ9ZT8ubXNncyE9PSExLHI9ZT8uZW50cyE9PSExLG49ZT8ubWV0YSE9PSExLHM9ZT8uc2VlZD09PSEwO3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e3N0b3JlOml9PXRoaXM7aWYobilhd2FpdCBpLmhvc3RzLndpcGUoKSxhd2FpdCBpLnVwbG9hZHMud2lwZSgpLGF3YWl0IGkuZG93bmxvYWRzLndpcGUoKTtpZih0KWF3YWl0IGkubWVzc2FnZXMud2lwZSgpO2lmKHMpYXdhaXQgaS5zZWVkLndpcGUoKTtpZihyKWF3YWl0IHRoaXMuc3RhdGUuY2xlYXIoKTt0aGlzLmxhc3RQcm9ncmVzcz1Ocix0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSx0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9aW1wb3J0PWFzeW5jKGUsdCk9PntsZXR7Y3J5cHRvOnIsc3RvcmU6bn09dGhpcyxzPXQ/Lm9uUHJvZ3Jlc3MsaT1hd2FpdCBuLnNlZWQubG9hZCgpO2lmKCFpKXJldHVybiAyMjtjb25zb2xlLnRpbWUoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCBvPWF3YWl0IGUuYnl0ZXMoKSxbYSxkXT1hd2FpdCBPdC5kZWNvZGVGaWxlKG8scixpKTtpZihkIT09MClyZXR1cm4gZDtjb25zb2xlLnRpbWVFbmQoImltcG9ydDogZGVjb2RpbmcgZmlsZS4uLiIpO2xldCB1PTA7d2hpbGUodTxhLmxlbmd0aCl7bGV0IGw9MCxmPTAsaD11O2ZvcihsZXQgbT11O208YS5sZW5ndGgmJmY8MTAwJiZsPDEwMjQwMDttKyspbCs9YVttXS5oZWFkLmxlbixmKyssaD1tKzE7bGV0IHk9YS5zbGljZSh1LGgpO2NvbnNvbGUudGltZShgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtsZXQgZz1hd2FpdCB0aGlzLmFwcGx5KHkse2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMX0pO2NvbnNvbGUudGltZUVuZChgaW1wb3J0OiBhcHBseWluZyBbJHt1fSwgJHtofV1gKTtmb3IobGV0IG09MDttPHkubGVuZ3RoO20rKyl7bGV0IFM9Z1ttXTtpZihTIT09MCYmUyE9PTE1KWNvbnNvbGUud2FybihgZmFpbGVkIHRvIGltcG9ydCBtc2cgJHt1K219OiAke1VbU119YCl9aWYocylxdWV1ZU1pY3JvdGFzaygoKT0+cyhoLGEubGVuZ3RoLDApKTt0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImltcG9ydCIsZG9uZTpoLHRvdGFsOmEubGVuZ3RofSksdT1ofXJldHVybiB0aGlzLnNjaGVkdWxlU3luYygpLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfTtzY2hlZHVsZVN5bmM9KCk9PntpZih0aGlzLm9uU2NoZWR1bGVTeW5jKXt0aGlzLm9uU2NoZWR1bGVTeW5jKCk7cmV0dXJufXRoaXMuc2NoZWR1bGVkU3luYy5zY2hlZHVsZSgpfTthc3luYyBleHBvcnRCeXRlcygpe2xldHtjcnlwdG86ZSxzdG9yZTp0fT10aGlzLHI9YXdhaXQgdC5zZWVkLmxvYWQoKTtpZighcilyZXR1cm4gYygyMik7bGV0IG49YXdhaXQgdC5tZXNzYWdlcy5saXN0KCk7cmV0dXJuIE90LmVuY29kZUZpbGUoImV4cG9ydCIsMCxuLGUscil9YXN5bmMgZXhwb3J0KGUpe2xldFt0LHJdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihyIT09MClyZXR1cm4gcjtpZighdClyZXR1cm4gMTI7bGV0IG49bmV3IEJsb2IoW3Quc2xpY2UoKV0pO3JldHVybiBicyhuLGUpLDB9YXN5bmMgbGluayhlLHQ9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKGUpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLHQpe2xldCByPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KGUubGFiZWwpO2lmKHIpYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KHIpfX1hc3luYyB1bmxpbmsoZSl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoZSksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgaG9zdHMoKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9Y29ubmVjdFRvSG9zdD1hc3luYyhlLHQ9ITAscj0hMCk9PntsZXR7Y2xvY2s6bixjb25uZWN0aW9uczpzLGNyeXB0bzppLHN0b3JlOm8sdHJhbnNwb3J0OmF9PXRoaXMsZD1zLmdldChlLmxhYmVsKTtpZihkKXtpZihkLmlzQ29ubmVjdGVkKCkpcmV0dXJuO3RyeXtkLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9cy5kZWxldGUoZS5sYWJlbCl9bGV0IHU9YXdhaXQgby5zZWVkLmxvYWQoKTtpZighdSlyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7ZS5oYW5kbGV9ICgke2UubGFiZWx9KWApO2xldCBsPW5ldyBMdCh1LGksZSxuLGEoZSksKGYpPT5vLmhvc3RzLnNldChlLmxhYmVsLGYpKTtpZihhd2FpdCBsLnJlZ2lzdGVyKCksdClhd2FpdCBsLmxpc3Rlbihhc3luYyhmKT0+e2xldCBoPXtjb25uOmwsc3RvcmU6byxlbmNsYXZlOnUsaG9zdDplLGNyeXB0bzppLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4gQnMoZixoLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYocy5zZXQoZS5sYWJlbCxsKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxyKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoZT0hMCx0PSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpyLHNjaGVkdWxlU3luYzpuLHN0b3JlOnN9PXRoaXM7aWYoIWF3YWl0IHMuc2VlZC5sb2FkKCkpcmV0dXJuO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7bGV0IG89YXdhaXQgcy5ob3N0cy5saXN0KCk7Zm9yKGxldCBhIG9mIG8pYXdhaXQgcihhLGUsITEpO2lmKHQpbigpfWRpc2Nvbm5lY3Q9YXN5bmMoKT0+e2ZvcihsZXQgZSBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKXRyeXtlLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9dGhpcy5jb25uZWN0aW9ucy5jbGVhcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfX12YXIgS2U9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMDtmdW5jdGlvbiAkdChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gWXIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBRKGUsLi4udCl7aWYoIVlyKGUpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIik7aWYodC5sZW5ndGg+MCYmIXQuaW5jbHVkZXMoZS5sZW5ndGgpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIG9mIGxlbmd0aCAiK3QrIiwgZ290IGxlbmd0aD0iK2UubGVuZ3RoKX1mdW5jdGlvbiBKcihlLHQ9ITApe2lmKGUuZGVzdHJveWVkKXRocm93IEVycm9yKCJIYXNoIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCIpO2lmKHQmJmUuZmluaXNoZWQpdGhyb3cgRXJyb3IoIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKX1mdW5jdGlvbiB2cyhlLHQpe1EoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBacihlKXtpZih0eXBlb2YgZSE9PSJib29sZWFuIil0aHJvdyBFcnJvcihgYm9vbGVhbiBleHBlY3RlZCwgbm90ICR7ZX1gKX0vKiEgbm9ibGUtY2lwaGVycyAtIE1JVCBMaWNlbnNlIChjKSAyMDIzIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL3ZhciBJZT0oZSk9Pm5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpO3ZhciBSbz1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pLmJ1ZmZlcilbMF09PT02ODtpZighUm8pdGhyb3cgRXJyb3IoIk5vbiBsaXR0bGUtZW5kaWFuIGhhcmR3YXJlIGlzIG5vdCBzdXBwb3J0ZWQiKTtmdW5jdGlvbiBMbyhlKXtpZih0eXBlb2YgZSE9PSJzdHJpbmciKXRocm93IEVycm9yKCJzdHJpbmcgZXhwZWN0ZWQiKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGUpKX1mdW5jdGlvbiBHdChlKXtpZih0eXBlb2YgZT09PSJzdHJpbmciKWU9TG8oZSk7ZWxzZSBpZihZcihlKSllPVF0KGUpO2Vsc2UgdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQsIGdvdCAiK3R5cGVvZiBlKTtyZXR1cm4gZX1mdW5jdGlvbiBEcyhlLHQpe2lmKHQ9PW51bGx8fHR5cGVvZiB0IT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBkZWZpbmVkIik7cmV0dXJuIE9iamVjdC5hc3NpZ24oZSx0KX1mdW5jdGlvbiBDcyhlLHQpe2lmKGUubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7bGV0IHI9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylyfD1lW25dXnRbbl07cmV0dXJuIHI9PT0wfXZhciBUcz0oZSx0KT0+e2Z1bmN0aW9uIHIobiwuLi5zKXtpZihRKG4pLGUubm9uY2VMZW5ndGghPT12b2lkIDApe2xldCBsPXNbMF07aWYoIWwpdGhyb3cgRXJyb3IoIm5vbmNlIC8gaXYgcmVxdWlyZWQiKTtpZihlLnZhclNpemVOb25jZSlRKGwpO2Vsc2UgUShsLGUubm9uY2VMZW5ndGgpfWxldCBpPWUudGFnTGVuZ3RoO2lmKGkmJnNbMV0hPT12b2lkIDApUShzWzFdKTtsZXQgbz10KG4sLi4ucyksYT0obCxmKT0+e2lmKGYhPT12b2lkIDApe2lmKGwhPT0yKXRocm93IEVycm9yKCJjaXBoZXIgb3V0cHV0IG5vdCBzdXBwb3J0ZWQiKTtRKGYpfX0sZD0hMTtyZXR1cm57ZW5jcnlwdChsLGYpe2lmKGQpdGhyb3cgRXJyb3IoImNhbm5vdCBlbmNyeXB0KCkgdHdpY2Ugd2l0aCBzYW1lIGtleSArIG5vbmNlIik7cmV0dXJuIGQ9ITAsUShsKSxhKG8uZW5jcnlwdC5sZW5ndGgsZiksby5lbmNyeXB0KGwsZil9LGRlY3J5cHQobCxmKXtpZihRKGwpLGkmJmwubGVuZ3RoPGkpdGhyb3cgRXJyb3IoImludmFsaWQgY2lwaGVydGV4dCBsZW5ndGg6IHNtYWxsZXIgdGhhbiB0YWdMZW5ndGg9IitpKTtyZXR1cm4gYShvLmRlY3J5cHQubGVuZ3RoLGYpLG8uZGVjcnlwdChsLGYpfX19cmV0dXJuIE9iamVjdC5hc3NpZ24ocixlKSxyfTtmdW5jdGlvbiBlbihlLHQscj0hMCl7aWYodD09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSk7aWYodC5sZW5ndGghPT1lKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrZSsiLCBnb3Q6ICIrdC5sZW5ndGgpO2lmKHImJiFLbyh0KSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiB0fWZ1bmN0aW9uIEtvKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gUXQoZSl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShlKX1mdW5jdGlvbiBnZSguLi5lKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLmZpbGwoMCl9ZnVuY3Rpb24gU3QoZT0zMil7aWYoS2UmJnR5cGVvZiBLZS5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBLZS5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoZSkpO2lmKEtlJiZ0eXBlb2YgS2UucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiBLZS5yYW5kb21CeXRlcyhlKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgTXM9KGUpPT5VaW50OEFycmF5LmZyb20oZS5zcGxpdCgiIikubWFwKCh0KT0+dC5jaGFyQ29kZUF0KDApKSksT289TXMoImV4cGFuZCAxNi1ieXRlIGsiKSxWbz1NcygiZXhwYW5kIDMyLWJ5dGUgayIpLF9vPUllKE9vKSxObz1JZShWbyk7ZnVuY3Rpb24gUChlLHQpe3JldHVybiBlPDx0fGU+Pj4zMi10fWZ1bmN0aW9uIHRuKGUpe3JldHVybiBlLmJ5dGVPZmZzZXQlND09PTB9dmFyIFl0PTY0LHFvPTE2LFJzPTQyOTQ5NjcyOTUsSHM9bmV3IFVpbnQzMkFycmF5O2Z1bmN0aW9uIEZvKGUsdCxyLG4scyxpLG8sYSl7bGV0IGQ9cy5sZW5ndGgsdT1uZXcgVWludDhBcnJheShZdCksbD1JZSh1KSxmPXRuKHMpJiZ0bihpKSxoPWY/SWUocyk6SHMseT1mP0llKGkpOkhzO2ZvcihsZXQgZz0wO2c8ZDtvKyspe2lmKGUodCxyLG4sbCxvLGEpLG8+PVJzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgbT1NYXRoLm1pbihZdCxkLWcpO2lmKGYmJm09PT1ZdCl7bGV0IFM9Zy80O2lmKGclNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgeD0wLGI7eDxxbzt4KyspYj1TK3gseVtiXT1oW2JdXmxbeF07Zys9WXQ7Y29udGludWV9Zm9yKGxldCBTPTAseDtTPG07UysrKXg9ZytTLGlbeF09c1t4XV51W1NdO2crPW19fWZ1bmN0aW9uIExzKGUsdCl7bGV0e2FsbG93U2hvcnRLZXlzOnIsZXh0ZW5kTm9uY2VGbjpuLGNvdW50ZXJMZW5ndGg6cyxjb3VudGVyUmlnaHQ6aSxyb3VuZHM6b309RHMoe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSx0KTtpZih0eXBlb2YgZSE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuICR0KHMpLCR0KG8pLFpyKGkpLFpyKHIpLChhLGQsdSxsLGY9MCk9PntRKGEpLFEoZCksUSh1KTtsZXQgaD11Lmxlbmd0aDtpZihsPT09dm9pZCAwKWw9bmV3IFVpbnQ4QXJyYXkoaCk7aWYoUShsKSwkdChmKSxmPDB8fGY+PVJzKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtpZihsLmxlbmd0aDxoKXRocm93IEVycm9yKGBhcng6IG91dHB1dCAoJHtsLmxlbmd0aH0pIGlzIHNob3J0ZXIgdGhhbiBkYXRhICgke2h9KWApO2xldCB5PVtdLGc9YS5sZW5ndGgsbSxTO2lmKGc9PT0zMil5LnB1c2gobT1RdChhKSksUz1ObztlbHNlIGlmKGc9PT0xNiYmciltPW5ldyBVaW50OEFycmF5KDMyKSxtLnNldChhKSxtLnNldChhLDE2KSxTPV9vLHkucHVzaChtKTtlbHNlIHRocm93IEVycm9yKGBhcng6IGludmFsaWQgMzItYnl0ZSBrZXksIGdvdCBsZW5ndGg9JHtnfWApO2lmKCF0bihkKSl5LnB1c2goZD1RdChkKSk7bGV0IHg9SWUobSk7aWYobil7aWYoZC5sZW5ndGghPT0yNCl0aHJvdyBFcnJvcigiYXJ4OiBleHRlbmRlZCBub25jZSBtdXN0IGJlIDI0IGJ5dGVzIik7bihTLHgsSWUoZC5zdWJhcnJheSgwLDE2KSkseCksZD1kLnN1YmFycmF5KDE2KX1sZXQgYj0xNi1zO2lmKGIhPT1kLmxlbmd0aCl0aHJvdyBFcnJvcihgYXJ4OiBub25jZSBtdXN0IGJlICR7Yn0gb3IgMTYgYnl0ZXNgKTtpZihiIT09MTIpe2xldCB3PW5ldyBVaW50OEFycmF5KDEyKTt3LnNldChkLGk/MDoxMi1kLmxlbmd0aCksZD13LHkucHVzaChkKX1sZXQgRT1JZShkKTtyZXR1cm4gRm8oZSxTLHgsRSx1LGwsZixvKSxnZSguLi55KSxsfX12YXIgSj0oZSx0KT0+ZVt0KytdJjI1NXwoZVt0KytdJjI1NSk8PDg7Y2xhc3MgS3N7Y29uc3RydWN0b3IoZSl7dGhpcy5ibG9ja0xlbj0xNix0aGlzLm91dHB1dExlbj0xNix0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5yPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5oPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5wYWQ9bmV3IFVpbnQxNkFycmF5KDgpLHRoaXMucG9zPTAsdGhpcy5maW5pc2hlZD0hMSxlPUd0KGUpLFEoZSwzMik7bGV0IHQ9SihlLDApLHI9SihlLDIpLG49SihlLDQpLHM9SihlLDYpLGk9SihlLDgpLG89SihlLDEwKSxhPUooZSwxMiksZD1KKGUsMTQpO3RoaXMuclswXT10JjgxOTEsdGhpcy5yWzFdPSh0Pj4+MTN8cjw8MykmODE5MSx0aGlzLnJbMl09KHI+Pj4xMHxuPDw2KSY3OTM5LHRoaXMuclszXT0obj4+Pjd8czw8OSkmODE5MSx0aGlzLnJbNF09KHM+Pj40fGk8PDEyKSYyNTUsdGhpcy5yWzVdPWk+Pj4xJjgxOTAsdGhpcy5yWzZdPShpPj4+MTR8bzw8MikmODE5MSx0aGlzLnJbN109KG8+Pj4xMXxhPDw1KSY4MDY1LHRoaXMucls4XT0oYT4+Pjh8ZDw8OCkmODE5MSx0aGlzLnJbOV09ZD4+PjUmMTI3O2ZvcihsZXQgdT0wO3U8ODt1KyspdGhpcy5wYWRbdV09SihlLDE2KzIqdSl9cHJvY2VzcyhlLHQscj0hMSl7bGV0IG49cj8wOjIwNDgse2g6cyxyOml9PXRoaXMsbz1pWzBdLGE9aVsxXSxkPWlbMl0sdT1pWzNdLGw9aVs0XSxmPWlbNV0saD1pWzZdLHk9aVs3XSxnPWlbOF0sbT1pWzldLFM9SihlLHQrMCkseD1KKGUsdCsyKSxiPUooZSx0KzQpLEU9SihlLHQrNiksdz1KKGUsdCs4KSxBPUooZSx0KzEwKSxCPUooZSx0KzEyKSxEPUooZSx0KzE0KSxIPXNbMF0rKFMmODE5MSksVD1zWzFdKygoUz4+PjEzfHg8PDMpJjgxOTEpLE89c1syXSsoKHg+Pj4xMHxiPDw2KSY4MTkxKSxOPXNbM10rKChiPj4+N3xFPDw5KSY4MTkxKSxfPXNbNF0rKChFPj4+NHx3PDwxMikmODE5MSksST1zWzVdKyh3Pj4+MSY4MTkxKSx2PXNbNl0rKCh3Pj4+MTR8QTw8MikmODE5MSksUj1zWzddKygoQT4+PjExfEI8PDUpJjgxOTEpLE09c1s4XSsoKEI+Pj44fEQ8PDgpJjgxOTEpLHE9c1s5XSsoRD4+PjV8biksaz0wLEc9aytIKm8rVCooNSptKStPKig1KmcpK04qKDUqeSkrXyooNSpoKTtrPUc+Pj4xMyxHJj04MTkxLEcrPUkqKDUqZikrdiooNSpsKStSKig1KnUpK00qKDUqZCkrcSooNSphKSxrKz1HPj4+MTMsRyY9ODE5MTtsZXQgWj1rK0gqYStUKm8rTyooNSptKStOKig1KmcpK18qKDUqeSk7az1aPj4+MTMsWiY9ODE5MSxaKz1JKig1KmgpK3YqKDUqZikrUiooNSpsKStNKig1KnUpK3EqKDUqZCksays9Wj4+PjEzLFomPTgxOTE7bGV0IG9lPWsrSCpkK1QqYStPKm8rTiooNSptKStfKig1KmcpO2s9b2U+Pj4xMyxvZSY9ODE5MSxvZSs9SSooNSp5KSt2Kig1KmgpK1IqKDUqZikrTSooNSpsKStxKig1KnUpLGsrPW9lPj4+MTMsb2UmPTgxOTE7bGV0IHo9aytIKnUrVCpkK08qYStOKm8rXyooNSptKTtrPXo+Pj4xMyx6Jj04MTkxLHorPUkqKDUqZykrdiooNSp5KStSKig1KmgpK00qKDUqZikrcSooNSpsKSxrKz16Pj4+MTMseiY9ODE5MTtsZXQgd2U9aytIKmwrVCp1K08qZCtOKmErXypvO2s9d2U+Pj4xMyx3ZSY9ODE5MSx3ZSs9SSooNSptKSt2Kig1KmcpK1IqKDUqeSkrTSooNSpoKStxKig1KmYpLGsrPXdlPj4+MTMsd2UmPTgxOTE7bGV0IFdlPWsrSCpmK1QqbCtPKnUrTipkK18qYTtrPVdlPj4+MTMsV2UmPTgxOTEsV2UrPUkqbyt2Kig1Km0pK1IqKDUqZykrTSooNSp5KStxKig1KmgpLGsrPVdlPj4+MTMsV2UmPTgxOTE7bGV0IHplPWsrSCpoK1QqZitPKmwrTip1K18qZDtrPXplPj4+MTMsemUmPTgxOTEsemUrPUkqYSt2Km8rUiooNSptKStNKig1KmcpK3EqKDUqeSksays9emU+Pj4xMyx6ZSY9ODE5MTtsZXQgWGU9aytIKnkrVCpoK08qZitOKmwrXyp1O2s9WGU+Pj4xMyxYZSY9ODE5MSxYZSs9SSpkK3YqYStSKm8rTSooNSptKStxKig1KmcpLGsrPVhlPj4+MTMsWGUmPTgxOTE7bGV0IGplPWsrSCpnK1QqeStPKmgrTipmK18qbDtrPWplPj4+MTMsamUmPTgxOTEsamUrPUkqdSt2KmQrUiphK00qbytxKig1Km0pLGsrPWplPj4+MTMsamUmPTgxOTE7bGV0ICRlPWsrSCptK1QqZytPKnkrTipoK18qZjtrPSRlPj4+MTMsJGUmPTgxOTEsJGUrPUkqbCt2KnUrUipkK00qYStxKm8says9JGU+Pj4xMywkZSY9ODE5MSxrPShrPDwyKStrfDAsaz1rK0d8MCxHPWsmODE5MSxrPWs+Pj4xMyxaKz1rLHNbMF09RyxzWzFdPVosc1syXT1vZSxzWzNdPXosc1s0XT13ZSxzWzVdPVdlLHNbNl09emUsc1s3XT1YZSxzWzhdPWplLHNbOV09JGV9ZmluYWxpemUoKXtsZXR7aDplLHBhZDp0fT10aGlzLHI9bmV3IFVpbnQxNkFycmF5KDEwKSxuPWVbMV0+Pj4xMztlWzFdJj04MTkxO2ZvcihsZXQgbz0yO288MTA7bysrKWVbb10rPW4sbj1lW29dPj4+MTMsZVtvXSY9ODE5MTtlWzBdKz1uKjUsbj1lWzBdPj4+MTMsZVswXSY9ODE5MSxlWzFdKz1uLG49ZVsxXT4+PjEzLGVbMV0mPTgxOTEsZVsyXSs9bixyWzBdPWVbMF0rNSxuPXJbMF0+Pj4xMyxyWzBdJj04MTkxO2ZvcihsZXQgbz0xO288MTA7bysrKXJbb109ZVtvXStuLG49cltvXT4+PjEzLHJbb10mPTgxOTE7cls5XS09ODE5MjtsZXQgcz0obl4xKS0xO2ZvcihsZXQgbz0wO288MTA7bysrKXJbb10mPXM7cz1+cztmb3IobGV0IG89MDtvPDEwO28rKyllW29dPWVbb10mc3xyW29dO2VbMF09KGVbMF18ZVsxXTw8MTMpJjY1NTM1LGVbMV09KGVbMV0+Pj4zfGVbMl08PDEwKSY2NTUzNSxlWzJdPShlWzJdPj4+NnxlWzNdPDw3KSY2NTUzNSxlWzNdPShlWzNdPj4+OXxlWzRdPDw0KSY2NTUzNSxlWzRdPShlWzRdPj4+MTJ8ZVs1XTw8MXxlWzZdPDwxNCkmNjU1MzUsZVs1XT0oZVs2XT4+PjJ8ZVs3XTw8MTEpJjY1NTM1LGVbNl09KGVbN10+Pj41fGVbOF08PDgpJjY1NTM1LGVbN109KGVbOF0+Pj44fGVbOV08PDUpJjY1NTM1O2xldCBpPWVbMF0rdFswXTtlWzBdPWkmNjU1MzU7Zm9yKGxldCBvPTE7bzw4O28rKylpPShlW29dK3Rbb118MCkrKGk+Pj4xNil8MCxlW29dPWkmNjU1MzU7Z2Uocil9dXBkYXRlKGUpe0pyKHRoaXMpO2xldHtidWZmZXI6dCxibG9ja0xlbjpyfT10aGlzO2U9R3QoZSk7bGV0IG49ZS5sZW5ndGg7Zm9yKGxldCBzPTA7czxuOyl7bGV0IGk9TWF0aC5taW4oci10aGlzLnBvcyxuLXMpO2lmKGk9PT1yKXtmb3IoO3I8PW4tcztzKz1yKXRoaXMucHJvY2VzcyhlLHMpO2NvbnRpbnVlfWlmKHQuc2V0KGUuc3ViYXJyYXkocyxzK2kpLHRoaXMucG9zKSx0aGlzLnBvcys9aSxzKz1pLHRoaXMucG9zPT09cil0aGlzLnByb2Nlc3ModCwwLCExKSx0aGlzLnBvcz0wfXJldHVybiB0aGlzfWRlc3Ryb3koKXtnZSh0aGlzLmgsdGhpcy5yLHRoaXMuYnVmZmVyLHRoaXMucGFkKX1kaWdlc3RJbnRvKGUpe0pyKHRoaXMpLHZzKGUsdGhpcyksdGhpcy5maW5pc2hlZD0hMDtsZXR7YnVmZmVyOnQsaDpyfT10aGlzLHtwb3M6bn09dGhpcztpZihuKXt0W24rK109MTtmb3IoO248MTY7bisrKXRbbl09MDt0aGlzLnByb2Nlc3ModCwwLCEwKX10aGlzLmZpbmFsaXplKCk7bGV0IHM9MDtmb3IobGV0IGk9MDtpPDg7aSsrKWVbcysrXT1yW2ldPj4+MCxlW3MrK109cltpXT4+Pjg7cmV0dXJuIGV9ZGlnZXN0KCl7bGV0e2J1ZmZlcjplLG91dHB1dExlbjp0fT10aGlzO3RoaXMuZGlnZXN0SW50byhlKTtsZXQgcj1lLnNsaWNlKDAsdCk7cmV0dXJuIHRoaXMuZGVzdHJveSgpLHJ9fWZ1bmN0aW9uIFdvKGUpe2xldCB0PShuLHMpPT5lKHMpLnVwZGF0ZShHdChuKSkuZGlnZXN0KCkscj1lKG5ldyBVaW50OEFycmF5KDMyKSk7cmV0dXJuIHQub3V0cHV0TGVuPXIub3V0cHV0TGVuLHQuYmxvY2tMZW49ci5ibG9ja0xlbix0LmNyZWF0ZT0obik9PmUobiksdH12YXIgcm49V28oKGUpPT5uZXcgS3MoZSkpO2Z1bmN0aW9uIHpvKGUsdCxyLG4scyxpPTIwKXtsZXQgbz1lWzBdLGE9dFswXSxkPXRbMV0sdT10WzJdLGw9dFszXSxmPWVbMV0saD1yWzBdLHk9clsxXSxnPXMsbT0wLFM9ZVsyXSx4PXRbNF0sYj10WzVdLEU9dFs2XSx3PXRbN10sQT1lWzNdLEI9byxEPWEsSD1kLFQ9dSxPPWwsTj1mLF89aCxJPXksdj1nLFI9bSxNPVMscT14LGs9YixHPUUsWj13LG9lPUE7Zm9yKGxldCB3ZT0wO3dlPGk7d2UrPTIpT149UChCK2t8MCw3KSx2Xj1QKE8rQnwwLDkpLGtePVAoditPfDAsMTMpLEJePVAoayt2fDAsMTgpLFJePVAoTitEfDAsNyksR149UChSK058MCw5KSxEXj1QKEcrUnwwLDEzKSxOXj1QKEQrR3wwLDE4KSxaXj1QKE0rX3wwLDcpLEhePVAoWitNfDAsOSksX149UChIK1p8MCwxMyksTV49UChfK0h8MCwxOCksVF49UChvZStxfDAsNyksSV49UChUK29lfDAsOSkscV49UChJK1R8MCwxMyksb2VePVAocStJfDAsMTgpLERePVAoQitUfDAsNyksSF49UChEK0J8MCw5KSxUXj1QKEgrRHwwLDEzKSxCXj1QKFQrSHwwLDE4KSxfXj1QKE4rT3wwLDcpLElePVAoXytOfDAsOSksT149UChJK198MCwxMyksTl49UChPK0l8MCwxOCkscV49UChNK1J8MCw3KSx2Xj1QKHErTXwwLDkpLFJePVAoditxfDAsMTMpLE1ePVAoUit2fDAsMTgpLGtePVAob2UrWnwwLDcpLEdePVAoaytvZXwwLDkpLFpePVAoRytrfDAsMTMpLG9lXj1QKForR3wwLDE4KTtsZXQgej0wO25beisrXT1vK0J8MCxuW3orK109YStEfDAsblt6KytdPWQrSHwwLG5beisrXT11K1R8MCxuW3orK109bCtPfDAsblt6KytdPWYrTnwwLG5beisrXT1oK198MCxuW3orK109eStJfDAsblt6KytdPWcrdnwwLG5beisrXT1tK1J8MCxuW3orK109UytNfDAsblt6KytdPXgrcXwwLG5beisrXT1iK2t8MCxuW3orK109RStHfDAsblt6KytdPXcrWnwwLG5beisrXT1BK29lfDB9ZnVuY3Rpb24gWG8oZSx0LHIsbil7bGV0IHM9ZVswXSxpPXRbMF0sbz10WzFdLGE9dFsyXSxkPXRbM10sdT1lWzFdLGw9clswXSxmPXJbMV0saD1yWzJdLHk9clszXSxnPWVbMl0sbT10WzRdLFM9dFs1XSx4PXRbNl0sYj10WzddLEU9ZVszXTtmb3IobGV0IEE9MDtBPDIwO0ErPTIpZF49UChzK1N8MCw3KSxoXj1QKGQrc3wwLDkpLFNePVAoaCtkfDAsMTMpLHNePVAoUytofDAsMTgpLHlePVAodStpfDAsNykseF49UCh5K3V8MCw5KSxpXj1QKHgreXwwLDEzKSx1Xj1QKGkreHwwLDE4KSxiXj1QKGcrbHwwLDcpLG9ePVAoYitnfDAsOSksbF49UChvK2J8MCwxMyksZ149UChsK298MCwxOCksYV49UChFK218MCw3KSxmXj1QKGErRXwwLDkpLG1ePVAoZithfDAsMTMpLEVePVAobStmfDAsMTgpLGlePVAocythfDAsNyksb149UChpK3N8MCw5KSxhXj1QKG8raXwwLDEzKSxzXj1QKGErb3wwLDE4KSxsXj1QKHUrZHwwLDcpLGZePVAobCt1fDAsOSksZF49UChmK2x8MCwxMyksdV49UChkK2Z8MCwxOCksbV49UChnK3l8MCw3KSxoXj1QKG0rZ3wwLDkpLHlePVAoaCttfDAsMTMpLGdePVAoeStofDAsMTgpLFNePVAoRStifDAsNykseF49UChTK0V8MCw5KSxiXj1QKHgrU3wwLDEzKSxFXj1QKGIreHwwLDE4KTtsZXQgdz0wO25bdysrXT1zLG5bdysrXT11LG5bdysrXT1nLG5bdysrXT1FLG5bdysrXT1sLG5bdysrXT1mLG5bdysrXT1oLG5bdysrXT15fXZhciBubj1Mcyh6byx7Y291bnRlclJpZ2h0OiEwLGV4dGVuZE5vbmNlRm46WG99KSxzbj1Ucyh7YmxvY2tTaXplOjY0LG5vbmNlTGVuZ3RoOjI0LHRhZ0xlbmd0aDoxNn0sKGUsdCk9Pih7ZW5jcnlwdChyLG4pe249ZW4oci5sZW5ndGgrMzIsbiwhMSk7bGV0IHM9bi5zdWJhcnJheSgwLDMyKSxpPW4uc3ViYXJyYXkoMzIpO24uc2V0KHIsMzIpLGdlKHMpLG5uKGUsdCxuLG4pO2xldCBvPXJuKGkscyk7cmV0dXJuIG4uc2V0KG8sMTYpLGdlKG4uc3ViYXJyYXkoMCwxNiksbyksbi5zdWJhcnJheSgxNil9LGRlY3J5cHQocixuKXtRKHIpLG49ZW4oci5sZW5ndGgrMzIsbiwhMSk7bGV0IHM9bi5zdWJhcnJheSgwLDMyKSxpPW4uc3ViYXJyYXkoMzIsNDgpLG89bi5zdWJhcnJheSg0OCk7bi5zZXQociwzMiksZ2Uocyk7bGV0IGE9bm4oZSx0LHMscyksZD1ybihvLGEpO2lmKCFDcyhpLGQpKXRocm93IEVycm9yKCJpbnZhbGlkIHRhZyIpO3JldHVybiBubihlLHQsbi5zdWJhcnJheSgxNiksbi5zdWJhcnJheSgxNikpLGdlKHMsaSxkKSxvfX0pKTsvKiEgbm9ibGUtaGFzaGVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovZnVuY3Rpb24gam8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJmUuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBidChlKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoZSl8fGU8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrZSl9ZnVuY3Rpb24gT2UoZSwuLi50KXtpZigham8oZSkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQiKTtpZih0Lmxlbmd0aD4wJiYhdC5pbmNsdWRlcyhlLmxlbmd0aCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoICIrdCsiLCBnb3QgbGVuZ3RoPSIrZS5sZW5ndGgpfWZ1bmN0aW9uIHd0KGUsdD0hMCl7aWYoZS5kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkIik7aWYodCYmZS5maW5pc2hlZCl0aHJvdyBFcnJvcigiSGFzaCNkaWdlc3QoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpfWZ1bmN0aW9uIEp0KGUsdCl7T2UoZSk7bGV0IHI9dC5vdXRwdXRMZW47aWYoZS5sZW5ndGg8cil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIityKX1mdW5jdGlvbiBPcyhlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIG5ldyBVaW50MzJBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcihlLmJ5dGVMZW5ndGgvNCkpfWZ1bmN0aW9uIG90KC4uLmUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uZmlsbCgwKX1mdW5jdGlvbiBJdChlLHQpe3JldHVybiBlPDwzMi10fGU+Pj50fXZhciBWcz0oKCk9Pm5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4KSgpO2Z1bmN0aW9uIF9zKGUpe3JldHVybiBlPDwyNCY0Mjc4MTkwMDgwfGU8PDgmMTY3MTE2ODB8ZT4+PjgmNjUyODB8ZT4+PjI0JjI1NX12YXIgTnM9VnM/KGUpPT5lOihlKT0+X3MoZSk7ZnVuY3Rpb24gJG8oZSl7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XT1fcyhlW3RdKTtyZXR1cm4gZX12YXIgdGU9VnM/KGUpPT5lOiRvO2Z1bmN0aW9uIEdvKGUpe2lmKHR5cGVvZiBlIT09InN0cmluZyIpdGhyb3cgRXJyb3IoInN0cmluZyBleHBlY3RlZCIpO3JldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSkpfWZ1bmN0aW9uIGF0KGUpe2lmKHR5cGVvZiBlPT09InN0cmluZyIpZT1HbyhlKTtyZXR1cm4gT2UoZSksZX1jbGFzcyBvbnt9ZnVuY3Rpb24gcXMoZSl7bGV0IHQ9KG4scyk9PmUocykudXBkYXRlKGF0KG4pKS5kaWdlc3QoKSxyPWUoe30pO3JldHVybiB0Lm91dHB1dExlbj1yLm91dHB1dExlbix0LmJsb2NrTGVuPXIuYmxvY2tMZW4sdC5jcmVhdGU9KG4pPT5lKG4pLHR9dmFyIEZzPVVpbnQzMkFycmF5LmZyb20oWzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSk7dmFyIFp0PUJpZ0ludCg0Mjk0OTY3Mjk1KSxXcz1CaWdJbnQoMzIpO2Z1bmN0aW9uIGFuKGUsdD0hMSl7aWYodClyZXR1cm57aDpOdW1iZXIoZSZadCksbDpOdW1iZXIoZT4+V3MmWnQpfTtyZXR1cm57aDpOdW1iZXIoZT4+V3MmWnQpfDAsbDpOdW1iZXIoZSZadCl8MH19ZnVuY3Rpb24geGUoZSx0LHIsbixzKXtyZXR1cm4gZT1lK3Qrc3wwLG49SXQobl5lLDE2KSxyPXIrbnwwLHQ9SXQodF5yLDEyKSx7YTplLGI6dCxjOnIsZDpufX1mdW5jdGlvbiBFZShlLHQscixuLHMpe3JldHVybiBlPWUrdCtzfDAsbj1JdChuXmUsOCkscj1yK258MCx0PUl0KHReciw3KSx7YTplLGI6dCxjOnIsZDpufX1jbGFzcyBjbiBleHRlbmRzIG9ue2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKTt0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMubGVuZ3RoPTAsdGhpcy5wb3M9MCxidChlKSxidCh0KSx0aGlzLmJsb2NrTGVuPWUsdGhpcy5vdXRwdXRMZW49dCx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheShlKSx0aGlzLmJ1ZmZlcjMyPWl0KHRoaXMuYnVmZmVyKX11cGRhdGUoZSl7d3QodGhpcyksZT1hdChlKSxPZShlKTtsZXR7YmxvY2tMZW46dCxidWZmZXI6cixidWZmZXIzMjpufT10aGlzLHM9ZS5sZW5ndGgsaT1lLmJ5dGVPZmZzZXQsbz1lLmJ1ZmZlcjtmb3IobGV0IGE9MDthPHM7KXtpZih0aGlzLnBvcz09PXQpdGUobiksdGhpcy5jb21wcmVzcyhuLDAsITEpLHRlKG4pLHRoaXMucG9zPTA7bGV0IGQ9TWF0aC5taW4odC10aGlzLnBvcyxzLWEpLHU9aSthO2lmKGQ9PT10JiYhKHUlNCkmJmErZDxzKXtsZXQgbD1uZXcgVWludDMyQXJyYXkobyx1LE1hdGguZmxvb3IoKHMtYSkvNCkpO3RlKGwpO2ZvcihsZXQgZj0wO2ErdDxzO2YrPW4ubGVuZ3RoLGErPXQpdGhpcy5sZW5ndGgrPXQsdGhpcy5jb21wcmVzcyhsLGYsITEpO3RlKGwpO2NvbnRpbnVlfXIuc2V0KGUuc3ViYXJyYXkoYSxhK2QpLHRoaXMucG9zKSx0aGlzLnBvcys9ZCx0aGlzLmxlbmd0aCs9ZCxhKz1kfXJldHVybiB0aGlzfWRpZ2VzdEludG8oZSl7d3QodGhpcyksSnQoZSx0aGlzKTtsZXR7cG9zOnQsYnVmZmVyMzI6cn09dGhpczt0aGlzLmZpbmlzaGVkPSEwLG90KHRoaXMuYnVmZmVyLnN1YmFycmF5KHQpKSx0ZShyKSx0aGlzLmNvbXByZXNzKHIsMCwhMCksdGUocik7bGV0IG49aXQoZSk7dGhpcy5nZXQoKS5mb3JFYWNoKChzLGkpPT5uW2ldPU5zKHMpKX1kaWdlc3QoKXtsZXR7YnVmZmVyOmUsb3V0cHV0TGVuOnR9PXRoaXM7dGhpcy5kaWdlc3RJbnRvKGUpO2xldCByPWUuc2xpY2UoMCx0KTtyZXR1cm4gdGhpcy5kZXN0cm95KCkscn1fY2xvbmVJbnRvKGUpe2xldHtidWZmZXI6dCxsZW5ndGg6cixmaW5pc2hlZDpuLGRlc3Ryb3llZDpzLG91dHB1dExlbjppLHBvczpvfT10aGlzO3JldHVybiBlfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGtMZW46aX0pKSxlLnNldCguLi50aGlzLmdldCgpKSxlLmJ1ZmZlci5zZXQodCksZS5kZXN0cm95ZWQ9cyxlLmZpbmlzaGVkPW4sZS5sZW5ndGg9cixlLnBvcz1vLGUub3V0cHV0TGVuPWksZX1jbG9uZSgpe3JldHVybiB0aGlzLl9jbG9uZUludG8oKX19ZnVuY3Rpb24gZG4oZSx0LHIsbixzLGksbyxhLGQsdSxsLGYsaCx5LGcsbSxTLHgsYixFKXtsZXQgdz0wO2ZvcihsZXQgQT0wO0E8bjtBKyspKHthOnMsYjpkLGM6aCxkOlN9PXhlKHMsZCxoLFMsclt0K2VbdysrXV0pKSx7YTpzLGI6ZCxjOmgsZDpTfT1FZShzLGQsaCxTLHJbdCtlW3crK11dKSx7YTppLGI6dSxjOnksZDp4fT14ZShpLHUseSx4LHJbdCtlW3crK11dKSx7YTppLGI6dSxjOnksZDp4fT1FZShpLHUseSx4LHJbdCtlW3crK11dKSx7YTpvLGI6bCxjOmcsZDpifT14ZShvLGwsZyxiLHJbdCtlW3crK11dKSx7YTpvLGI6bCxjOmcsZDpifT1FZShvLGwsZyxiLHJbdCtlW3crK11dKSx7YSxiOmYsYzptLGQ6RX09eGUoYSxmLG0sRSxyW3QrZVt3KytdXSkse2EsYjpmLGM6bSxkOkV9PUVlKGEsZixtLEUsclt0K2VbdysrXV0pLHthOnMsYjp1LGM6ZyxkOkV9PXhlKHMsdSxnLEUsclt0K2VbdysrXV0pLHthOnMsYjp1LGM6ZyxkOkV9PUVlKHMsdSxnLEUsclt0K2VbdysrXV0pLHthOmksYjpsLGM6bSxkOlN9PXhlKGksbCxtLFMsclt0K2VbdysrXV0pLHthOmksYjpsLGM6bSxkOlN9PUVlKGksbCxtLFMsclt0K2VbdysrXV0pLHthOm8sYjpmLGM6aCxkOnh9PXhlKG8sZixoLHgsclt0K2VbdysrXV0pLHthOm8sYjpmLGM6aCxkOnh9PUVlKG8sZixoLHgsclt0K2VbdysrXV0pLHthLGI6ZCxjOnksZDpifT14ZShhLGQseSxiLHJbdCtlW3crK11dKSx7YSxiOmQsYzp5LGQ6Yn09RWUoYSxkLHksYixyW3QrZVt3KytdXSk7cmV0dXJue3YwOnMsdjE6aSx2MjpvLHYzOmEsdjQ6ZCx2NTp1LHY2Omwsdjc6Zix2ODpoLHY5OnksdjEwOmcsdjExOm0sdjEyOlMsdjEzOngsdjE0OmIsdjE1OkV9fXZhciBTZT17Q0hVTktfU1RBUlQ6MSxDSFVOS19FTkQ6MixQQVJFTlQ6NCxST09UOjgsS0VZRURfSEFTSDoxNixERVJJVkVfS0VZX0NPTlRFWFQ6MzIsREVSSVZFX0tFWV9NQVRFUklBTDo2NH0sQWU9RnMuc2xpY2UoKSx6cz0oKCk9PntsZXQgZT1BcnJheS5mcm9tKHtsZW5ndGg6MTZ9LChuLHMpPT5zKSx0PShuKT0+WzIsNiwzLDEwLDcsMCw0LDEzLDEsMTEsMTIsNSw5LDE0LDE1LDhdLm1hcCgocyk9Pm5bc10pLHI9W107Zm9yKGxldCBuPTAscz1lO248NztuKysscz10KHMpKXIucHVzaCguLi5zKTtyZXR1cm4gVWludDhBcnJheS5mcm9tKHIpfSkoKTtjbGFzcyB1biBleHRlbmRzIGNue2NvbnN0cnVjdG9yKGU9e30sdD0wKXtzdXBlcig2NCxlLmRrTGVuPT09dm9pZCAwPzMyOmUuZGtMZW4pO3RoaXMuY2h1bmtQb3M9MCx0aGlzLmNodW5rc0RvbmU9MCx0aGlzLmZsYWdzPTAsdGhpcy5zdGFjaz1bXSx0aGlzLnBvc091dD0wLHRoaXMuYnVmZmVyT3V0MzI9bmV3IFVpbnQzMkFycmF5KDE2KSx0aGlzLmNodW5rT3V0PTAsdGhpcy5lbmFibGVYT0Y9ITA7bGV0e2tleTpyLGNvbnRleHQ6bn09ZSxzPW4hPT12b2lkIDA7aWYociE9PXZvaWQgMCl7aWYocyl0aHJvdyBFcnJvcignT25seSAia2V5IiBvciAiY29udGV4dCIgY2FuIGJlIHNwZWNpZmllZCBhdCBzYW1lIHRpbWUnKTtsZXQgaT1hdChyKS5zbGljZSgpO09lKGksMzIpLHRoaXMuSVY9aXQoaSksdGUodGhpcy5JViksdGhpcy5mbGFncz10fFNlLktFWUVEX0hBU0h9ZWxzZSBpZihzKXtsZXQgaT1hdChuKSxvPW5ldyB1bih7ZGtMZW46MzJ9LFNlLkRFUklWRV9LRVlfQ09OVEVYVCkudXBkYXRlKGkpLmRpZ2VzdCgpO3RoaXMuSVY9aXQobyksdGUodGhpcy5JViksdGhpcy5mbGFncz10fFNlLkRFUklWRV9LRVlfTUFURVJJQUx9ZWxzZSB0aGlzLklWPUFlLnNsaWNlKCksdGhpcy5mbGFncz10O3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpLHRoaXMuYnVmZmVyT3V0PU9zKHRoaXMuYnVmZmVyT3V0MzIpfWdldCgpe3JldHVybltdfXNldCgpe31iMkNvbXByZXNzKGUsdCxyLG49MCl7bGV0e3N0YXRlOnMscG9zOml9PXRoaXMse2g6byxsOmF9PWFuKEJpZ0ludChlKSwhMCkse3YwOmQsdjE6dSx2MjpsLHYzOmYsdjQ6aCx2NTp5LHY2Omcsdjc6bSx2ODpTLHY5OngsdjEwOmIsdjExOkUsdjEyOncsdjEzOkEsdjE0OkIsdjE1OkR9PWRuKHpzLG4sciw3LHNbMF0sc1sxXSxzWzJdLHNbM10sc1s0XSxzWzVdLHNbNl0sc1s3XSxBZVswXSxBZVsxXSxBZVsyXSxBZVszXSxvLGEsaSx0KTtzWzBdPWReUyxzWzFdPXVeeCxzWzJdPWxeYixzWzNdPWZeRSxzWzRdPWhedyxzWzVdPXleQSxzWzZdPWdeQixzWzddPW1eRH1jb21wcmVzcyhlLHQ9MCxyPSExKXtsZXQgbj10aGlzLmZsYWdzO2lmKCF0aGlzLmNodW5rUG9zKW58PVNlLkNIVU5LX1NUQVJUO2lmKHRoaXMuY2h1bmtQb3M9PT0xNXx8cilufD1TZS5DSFVOS19FTkQ7aWYoIXIpdGhpcy5wb3M9dGhpcy5ibG9ja0xlbjtpZih0aGlzLmIyQ29tcHJlc3ModGhpcy5jaHVua3NEb25lLG4sZSx0KSx0aGlzLmNodW5rUG9zKz0xLHRoaXMuY2h1bmtQb3M9PT0xNnx8cil7bGV0IHM9dGhpcy5zdGF0ZTt0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKTtmb3IobGV0IGksbz10aGlzLmNodW5rc0RvbmUrMTtyfHwhKG8mMSk7bz4+PTEpe2lmKCEoaT10aGlzLnN0YWNrLnBvcCgpKSlicmVhazt0aGlzLmJ1ZmZlcjMyLnNldChpLDApLHRoaXMuYnVmZmVyMzIuc2V0KHMsOCksdGhpcy5wb3M9dGhpcy5ibG9ja0xlbix0aGlzLmIyQ29tcHJlc3MoMCx0aGlzLmZsYWdzfFNlLlBBUkVOVCx0aGlzLmJ1ZmZlcjMyLDApLHM9dGhpcy5zdGF0ZSx0aGlzLnN0YXRlPXRoaXMuSVYuc2xpY2UoKX10aGlzLmNodW5rc0RvbmUrKyx0aGlzLmNodW5rUG9zPTAsdGhpcy5zdGFjay5wdXNoKHMpfXRoaXMucG9zPTB9X2Nsb25lSW50byhlKXtlPXN1cGVyLl9jbG9uZUludG8oZSk7bGV0e0lWOnQsZmxhZ3M6cixzdGF0ZTpuLGNodW5rUG9zOnMscG9zT3V0OmksY2h1bmtPdXQ6byxzdGFjazphLGNodW5rc0RvbmU6ZH09dGhpcztyZXR1cm4gZS5zdGF0ZS5zZXQobi5zbGljZSgpKSxlLnN0YWNrPWEubWFwKCh1KT0+VWludDMyQXJyYXkuZnJvbSh1KSksZS5JVi5zZXQodCksZS5mbGFncz1yLGUuY2h1bmtQb3M9cyxlLmNodW5rc0RvbmU9ZCxlLnBvc091dD1pLGUuY2h1bmtPdXQ9byxlLmVuYWJsZVhPRj10aGlzLmVuYWJsZVhPRixlLmJ1ZmZlck91dDMyLnNldCh0aGlzLmJ1ZmZlck91dDMyKSxlfWRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMCxvdCh0aGlzLnN0YXRlLHRoaXMuYnVmZmVyMzIsdGhpcy5JVix0aGlzLmJ1ZmZlck91dDMyKSxvdCguLi50aGlzLnN0YWNrKX1iMkNvbXByZXNzT3V0KCl7bGV0e3N0YXRlOmUscG9zOnQsZmxhZ3M6cixidWZmZXIzMjpuLGJ1ZmZlck91dDMyOnN9PXRoaXMse2g6aSxsOm99PWFuKEJpZ0ludCh0aGlzLmNodW5rT3V0KyspKTt0ZShuKTtsZXR7djA6YSx2MTpkLHYyOnUsdjM6bCx2NDpmLHY1OmgsdjY6eSx2NzpnLHY4Om0sdjk6Uyx2MTA6eCx2MTE6Yix2MTI6RSx2MTM6dyx2MTQ6QSx2MTU6Qn09ZG4oenMsMCxuLDcsZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLEFlWzBdLEFlWzFdLEFlWzJdLEFlWzNdLG8saSx0LHIpO3NbMF09YV5tLHNbMV09ZF5TLHNbMl09dV54LHNbM109bF5iLHNbNF09Zl5FLHNbNV09aF53LHNbNl09eV5BLHNbN109Z15CLHNbOF09ZVswXV5tLHNbOV09ZVsxXV5TLHNbMTBdPWVbMl1eeCxzWzExXT1lWzNdXmIsc1sxMl09ZVs0XV5FLHNbMTNdPWVbNV1edyxzWzE0XT1lWzZdXkEsc1sxNV09ZVs3XV5CLHRlKG4pLHRlKHMpLHRoaXMucG9zT3V0PTB9ZmluaXNoKCl7aWYodGhpcy5maW5pc2hlZClyZXR1cm47dGhpcy5maW5pc2hlZD0hMCxvdCh0aGlzLmJ1ZmZlci5zdWJhcnJheSh0aGlzLnBvcykpO2xldCBlPXRoaXMuZmxhZ3N8U2UuUk9PVDtpZih0aGlzLnN0YWNrLmxlbmd0aCllfD1TZS5QQVJFTlQsdGUodGhpcy5idWZmZXIzMiksdGhpcy5jb21wcmVzcyh0aGlzLmJ1ZmZlcjMyLDAsITApLHRlKHRoaXMuYnVmZmVyMzIpLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMucG9zPXRoaXMuYmxvY2tMZW47ZWxzZSBlfD0oIXRoaXMuY2h1bmtQb3M/U2UuQ0hVTktfU1RBUlQ6MCl8U2UuQ0hVTktfRU5EO3RoaXMuZmxhZ3M9ZSx0aGlzLmIyQ29tcHJlc3NPdXQoKX13cml0ZUludG8oZSl7d3QodGhpcywhMSksT2UoZSksdGhpcy5maW5pc2goKTtsZXR7YmxvY2tMZW46dCxidWZmZXJPdXQ6cn09dGhpcztmb3IobGV0IG49MCxzPWUubGVuZ3RoO248czspe2lmKHRoaXMucG9zT3V0Pj10KXRoaXMuYjJDb21wcmVzc091dCgpO2xldCBpPU1hdGgubWluKHQtdGhpcy5wb3NPdXQscy1uKTtlLnNldChyLnN1YmFycmF5KHRoaXMucG9zT3V0LHRoaXMucG9zT3V0K2kpLG4pLHRoaXMucG9zT3V0Kz1pLG4rPWl9cmV0dXJuIGV9eG9mSW50byhlKXtpZighdGhpcy5lbmFibGVYT0YpdGhyb3cgRXJyb3IoIlhPRiBpcyBub3QgcG9zc2libGUgYWZ0ZXIgZGlnZXN0IGNhbGwiKTtyZXR1cm4gdGhpcy53cml0ZUludG8oZSl9eG9mKGUpe3JldHVybiBidChlKSx0aGlzLnhvZkludG8obmV3IFVpbnQ4QXJyYXkoZSkpfWRpZ2VzdEludG8oZSl7aWYoSnQoZSx0aGlzKSx0aGlzLmZpbmlzaGVkKXRocm93IEVycm9yKCJkaWdlc3QoKSB3YXMgYWxyZWFkeSBjYWxsZWQiKTtyZXR1cm4gdGhpcy5lbmFibGVYT0Y9ITEsdGhpcy53cml0ZUludG8oZSksdGhpcy5kZXN0cm95KCksZX1kaWdlc3QoKXtyZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSl9fXZhciBYcz1xcygoZSk9Pm5ldyB1bihlKSk7dmFyIFFvPTMyLGR5PVN5bWJvbCgiWDI1NTE5U2siKTtmdW5jdGlvbiBqcyhlKXtpZihlLmJ5dGVMZW5ndGghPT1RbylyZXR1cm4gYygxMCk7cmV0dXJuIHAoZSl9dmFyIFY9KDFuPDwyNTVuKS0xOW4sWW89MTIxNjY1biwkcz1uZXcgVWludDhBcnJheSgzMik7JHNbMF09OTtmdW5jdGlvbiBHcyhlKXtsZXQgdD0wbjtmb3IobGV0IHI9ZS5sZW5ndGgtMTtyPj0wO3ItLSl0PXQ8PDhufEJpZ0ludChlW3JdKTtyZXR1cm4gdH1mdW5jdGlvbiBKbyhlKXtsZXQgdD1uZXcgVWludDhBcnJheSgzMikscj0oZSVWK1YpJVY7Zm9yKGxldCBuPTA7bjwzMjtuKyspdFtuXT1OdW1iZXIociYweGZmbikscj4+PThuO3JldHVybiB0fWZ1bmN0aW9uIFpvKGUpe2xldCB0PWUuc2xpY2UoKTtyZXR1cm4gdFszMV0mPTEyNyxHcyh0KX1mdW5jdGlvbiBlYShlKXtsZXQgdD1lLnNsaWNlKCk7cmV0dXJuIHRbMF0mPTI0OCx0WzMxXSY9MTI3LHRbMzFdfD02NCx0fWZ1bmN0aW9uIGVyKGUsdCxyKXtsZXQgbj0tZSxzPSh0XnIpJm47cmV0dXJuW3RecyxyXnNdfWZ1bmN0aW9uIHRhKGUpe2xldCB0PVYtMm4scj0oZSVWK1YpJVYsbj0xbjt3aGlsZSh0PjBuKXtpZih0JjFuKW49bipyJVY7cj1yKnIlVix0Pj49MW59cmV0dXJuIG59ZnVuY3Rpb24gbG4oZSx0KXtsZXQgcj1lYShlKSxuPVpvKHQpLHM9MW4saT0wbixvPW4sYT0xbixkPTBuLHU9R3Mocik7Zm9yKGxldCBsPTI1NDtsPj0wO2wtLSl7bGV0IGY9dT4+QmlnSW50KGwpJjFuO2RePWYsW3Msb109ZXIoZCxzLG8pLFtpLGFdPWVyKGQsaSxhKSxkPWY7bGV0IGg9KHMraSklVix5PWgqaCVWLGc9KHMtaStWKSVWLG09ZypnJVYsUz0oeS1tK1YpJVYseD0obythKSVWLEU9KG8tYStWKSVWKmglVix3PXgqZyVWLEE9KEUrdyklVixCPShFLXcrViklVjtvPUEqQSVWLGE9bipCKkIlVixzPXkqbSVWLGk9UyooeStZbypTKSVWfXJldHVybltzLG9dPWVyKGQscyxvKSxbaSxhXT1lcihkLGksYSksci5maWxsKDApLEpvKHMqdGEoaSklVil9ZnVuY3Rpb24gUXMoZSl7cmV0dXJuIGxuKGUsJHMpfXZhciBmbj1uZXcgVWludDhBcnJheShbNDgsNDYsMiwxLDAsNDgsNSw2LDMsNDMsMTAxLDExMiw0LDM0LDQsMzJdKTtmdW5jdGlvbiBZcyhlKXtsZXQgdD1uZXcgVWludDhBcnJheShmbi5sZW5ndGgrMzIpO3JldHVybiB0LnNldChmbiksdC5zZXQoZS5zdWJhcnJheSgwLDMyKSxmbi5sZW5ndGgpLHR9dmFyIHBuPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEwLDQsMzQsNCwzMl0pO2Z1bmN0aW9uIEpzKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KHBuLmxlbmd0aCszMik7cmV0dXJuIHQuc2V0KHBuKSx0LnNldChlLnN1YmFycmF5KDAsMzIpLHBuLmxlbmd0aCksdH1mdW5jdGlvbiBacyhlKXtyZXR1cm4gdHlwZW9mIGU9PT0ic3RyaW5nIj9uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSk6ZX1mdW5jdGlvbiBQZShlKXtsZXQgdD1uZXcgQXJyYXlCdWZmZXIoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkodCkuc2V0KGUpLHR9Y2xhc3MgVmV7dmVyaWZ5S2V5cz1uZXcgTWFwO2FzeW5jIGdlblJhbmRvbUJ5dGVzKGUpe3JldHVybiBTdChlKX1hc3luYyBnZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCl7cmV0dXJuIFN0KDMyKX1hc3luYyBlbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGUsdCl7bGV0IHI9U3QoMjQpLHM9c24odCxyKS5lbmNyeXB0KGUpO3JldHVybiBuZXcgVWludDhBcnJheShbLi4uciwuLi5zXSl9YXN5bmMgZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChlLHQpe2xldCByPWUuc2xpY2UoMCwyNCksbj1lLnNsaWNlKDI0KTtyZXR1cm4gc24odCxyKS5kZWNyeXB0KG4pfWFzeW5jIGRlcml2ZUVkMjU1MTlLZXlQYWlyKGUpe2xldCB0PWUscj1Zcyh0KSxuPVBlKHIpLHM7dHJ5e2xldCB1PWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITAsWyJzaWduIl0pO3M9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIix1KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfWlmKHR5cGVvZiBzLnghPT0ic3RyaW5nIil0aHJvdyBFcnJvcigiRWQyNTUxOSBKV0sgbWlzc2luZyB4Iik7bGV0IGk9cy54O3MuZD12b2lkIDA7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgiandrIix7a3R5OiJPS1AiLGNydjoiRWQyNTUxOSIseDppfSx7bmFtZToiRWQyNTUxOSJ9LCEwLFsidmVyaWZ5Il0pLGE9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgicmF3IixvKSk7dGhpcy52ZXJpZnlLZXlzLnNldChoZShhKSxvKTtsZXQgZD1uZXcgVWludDhBcnJheSg2NCk7cmV0dXJuIGQuc2V0KHQsMCksZC5zZXQoYSwzMikse2tleVR5cGU6ImVkMjU1MTkiLHByaXZhdGVLZXk6ZCxwdWJsaWNLZXk6YX19YXN5bmMgaW1wb3J0U2lnbktleShlKXtsZXQgdD1lLnN1YmFycmF5KDAsMzIpLHI9WXModCksbj1QZShyKTt0cnl7cmV0dXJuIGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJFZDI1NTE5In0sITEsWyJzaWduIl0pfWZpbmFsbHl7ci5maWxsKDApLG5ldyBVaW50OEFycmF5KG4pLmZpbGwoMCl9fWFzeW5jIGltcG9ydFZlcmlmeUtleShlKXtsZXQgdD1oZShlKSxyPXRoaXMudmVyaWZ5S2V5cy5nZXQodCk7aWYocilyZXR1cm4gcjtsZXQgbj1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLFBlKGUpLHtuYW1lOiJFZDI1NTE5In0sITEsWyJ2ZXJpZnkiXSk7cmV0dXJuIHRoaXMudmVyaWZ5S2V5cy5zZXQodCxuKSxufWFzeW5jIHNpZ25FZDI1NTE5KGUsdCl7bGV0IHI9WnMoZSksbj1hd2FpdCB0aGlzLmltcG9ydFNpZ25LZXkodCkscz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuc2lnbih7bmFtZToiRWQyNTUxOSJ9LG4sUGUocikpO3JldHVybiBuZXcgVWludDhBcnJheShzKX1hc3luYyBjaGVja1NpZ0VkMjU1MTkoZSx0LHIpe2xldCBuPVpzKHQpO3RyeXtsZXQgcz1hd2FpdCB0aGlzLmltcG9ydFZlcmlmeUtleShyKTtyZXR1cm4gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLnZlcmlmeSh7bmFtZToiRWQyNTUxOSJ9LHMsUGUoZSksUGUobikpfWNhdGNoe3JldHVybiExfX1hc3luYyBibGFrZTMoZSl7cmV0dXJuIFhzKGUpfWFzeW5jIGdlblgyNTUxOSgpe2xldCBlPWF3YWl0IFN0KDMyKTtlWzBdJj0yNDgsZVszMV0mPTEyNyxlWzMxXXw9NjQ7bGV0W3Qscl09anMoZSk7aWYociE9PTB8fHQ9PT12b2lkIDApdGhyb3cgZS5maWxsKDApLEVycm9yKCJYMjU1MTkgc2NhbGFyIGJyYW5kIGZhaWxlZCIpO2xldCBuPVFzKHQpLHM9SnModCksaT1QZShzKTt0cnl7bGV0IG89YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLGkse25hbWU6IlgyNTUxOSJ9LCEwLFsiZGVyaXZlQml0cyJdKSxhPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsbyk7aWYodHlwZW9mIGEueCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJYMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCBkPSRuKGEueCk7aWYoYS5kPXZvaWQgMCwhWChkLG4pKXRocm93IEVycm9yKCJYMjU1MTkgV2ViQ3J5cHRvIHB1YiAhPSBSRkMgNzc0OCIpO3JldHVybntwcml2OnQscHViOm59fWNhdGNoKG8pe3Rocm93IHQuZmlsbCgwKSxvfWZpbmFsbHl7cy5maWxsKDApLG5ldyBVaW50OEFycmF5KGkpLmZpbGwoMCl9fWFzeW5jIHgyNTUxOVNoYXJlZChlLHQpe2xldCByPUpzKGUpLG49UGUocik7dHJ5e2xldCBzPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInBrY3M4IixuLHtuYW1lOiJYMjU1MTkifSwhMSxbImRlcml2ZUJpdHMiXSksaT1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLFBlKHQpLHtuYW1lOiJYMjU1MTkifSwhMSxbXSksbz1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyh7bmFtZToiWDI1NTE5IixwdWJsaWM6aX0scywyNTYpO3JldHVybiBuZXcgVWludDhBcnJheShvKX1jYXRjaHtyZXR1cm4gbG4oZSx0KX1maW5hbGx5e3IuZmlsbCgwKSxuZXcgVWludDhBcnJheShuKS5maWxsKDApfX19dmFyIHJhPW5ldyBWZSx0cj1yYTt2YXIgcnI9e2VuY29kZShlLHQpe2xldCByPWUud3JpdGVWYXJTdHJpbmcodC5oYW5kbGUpO2lmKHIhPT0wKXJldHVybiByO2xldCBuPWUud3JpdGVWYXJTdHJpbmcodC5sYWJlbCk7aWYobiE9PTApcmV0dXJuIG47cmV0dXJuIGUud3JpdGVWYXJJbnQodC5pZHg/PzApfSxkZWNvZGUoZSl7bGV0W3Qscl09ZS5yZWFkVmFyU3RyaW5nKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109ZS5yZWFkVmFyU3RyaW5nKCk7aWYocyE9PTApcmV0dXJuIGMocyk7bGV0W2ksb109ZS5yZWFkVmFySW50KCk7aWYobyE9PTApcmV0dXJuIGMobyk7cmV0dXJuIHAoe2hhbmRsZTp0LGxhYmVsOm4saWR4Oml9KX19O3ZhciBobj17ZW5jb2RlKGUsdCl7bGV0IHI9ZS53cml0ZVZhckludCh0Lmhvc3RzLmxlbmd0aCk7aWYociE9PTApcmV0dXJuIHI7Zm9yKGxldCBuIG9mIHQuaG9zdHMpe2xldCBzPWUud3JpdGVTdHJ1Y3QocnIsbik7aWYocyE9PTApcmV0dXJuIHN9cmV0dXJuIDB9LGRlY29kZShlKXtsZXRbdCxyXT1lLnJlYWRWYXJJbnQoKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwfHx0PDApcmV0dXJuIGMoMTApO2xldCBuPVtdO2ZvcihsZXQgcz0wO3M8dDtzKyspe2xldFtpLG9dPWUucmVhZFN0cnVjdChycik7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYygxNCk7bi5wdXNoKGkpfXJldHVybiBwKHtob3N0czpufSl9fTt2YXIgbmE9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLnFycGFpci52MSIpLHh0PTMyLHNhPXh0KzI0KzE2LGlhPTMyLEh5PVN5bWJvbCgiREhLRVJlcSIpLE15PVN5bWJvbCgiREhLRVJlc3AiKTtmdW5jdGlvbiBlaShlKXtpZihlLmJ5dGVMZW5ndGghPT14dClyZXR1cm4gYygxMCk7cmV0dXJuIHAoZSl9ZnVuY3Rpb24gdGkoZSl7aWYoZS5ieXRlTGVuZ3RoPHNhKXJldHVybiBjKDEwKTtyZXR1cm4gcChlKX12YXIgbnI9bmV3IFZlO2FzeW5jIGZ1bmN0aW9uIHluKGUsdCxyLG4pe2xldCBzO3RyeXtzPWF3YWl0IG5yLngyNTUxOVNoYXJlZChlLHQpfWNhdGNoe3JldHVybiBjKDI5KX10cnl7aWYocy5ieXRlTGVuZ3RoIT09eHR8fHMuZXZlcnkoKGEpPT5hPT09MCkpcmV0dXJuIGMoMTApO2xldCBpPXllKHMsbmEpLG89eWUoaSx5ZShyLG4pKTt0cnl7bGV0IGE9YXdhaXQgbnIuYmxha2UzKG8pO3JldHVybiBwKGEuc2xpY2UoMCxpYSkpfWZpbmFsbHl7aS5maWxsKDApLG8uZmlsbCgwKX19ZmluYWxseXtzLmZpbGwoMCl9fWNsYXNzIHNyeyNlOyN0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy4jZT1lLHRoaXMuI3Q9dH1zdGF0aWMgYXN5bmMgY3JlYXRlKCl7bGV0IGU7dHJ5e2xldCB0PWF3YWl0IG5yLmdlblgyNTUxOSgpO2U9dC5wcml2O2xldFtyLG5dPWVpKHQucHViKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyPT09dm9pZCAwKXJldHVybiBjKDEwKTtsZXQgcz1uZXcgc3IoZSxyKTtyZXR1cm4gZT12b2lkIDAscChzKX1jYXRjaHtyZXR1cm4gYygyOSl9ZmluYWxseXtlPy5maWxsKDApfX13aXBlKCl7dGhpcy4jZS5maWxsKDApfWdldCBkaGtlUmVxKCl7bGV0W2UsdF09ZWkodGhpcy4jdC5zbGljZSgpKTtpZihlPT09dm9pZCAwKXRocm93IEVycm9yKGBkaGtlUmVxICR7dH1gKTtyZXR1cm4gZX1hc3luYyBmaW5pc2goZSl7bGV0IHQ9ZS5zdWJhcnJheSgwLHh0KSxyPWUuc3ViYXJyYXkoeHQpLFtuLHNdPWF3YWl0IHluKHRoaXMuI2UsdCx0aGlzLiN0LHQpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO2xldCBpO3RyeXt0cnl7aT1hd2FpdCBuci5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHIsbil9Y2F0Y2h7cmV0dXJuIGMoMjApfWxldFtvLGFdPXJlLmZyb21QYWlyUGxhaW4oaSk7aWYoYSE9PTApcmV0dXJuIGMoYSk7aWYobz09PXZvaWQgMClyZXR1cm4gYygxMik7cmV0dXJuIHRoaXMud2lwZSgpLHAobyl9ZmluYWxseXtuLmZpbGwoMCksaT8uZmlsbCgwKX19fWZ1bmN0aW9uIFVlKGUpe2xldCB0PW5ldyBVaW50OEFycmF5KGUpO2lmKGU+MCljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHQpO3JldHVybiB0fXZhciBfZT0zMixpcj0iRElQTE9NQVRJQyIsYmU9InB1YmxpYy1rZXkiLG9hPS03LGFhPS04LGNhPS0yNTcsb3I9W3t0eXBlOmJlLGFsZzpvYX0se3R5cGU6YmUsYWxnOmFhfSx7dHlwZTpiZSxhbGc6Y2F9XTtmdW5jdGlvbiBkYShlKXtyZXR1cm4gZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLiQvLCIiKXx8ImxvY2FsaG9zdCJ9ZnVuY3Rpb24gQ2UoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoZS5ieXRlTGVuZ3RoKTtyZXR1cm4gdC5zZXQoZSksdC5idWZmZXJ9ZnVuY3Rpb24gYXIoZSl7aWYoZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKXJldHVybiBuZXcgVWludDhBcnJheShlKS5zbGljZSgpO3JldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKS5zbGljZSgpfWZ1bmN0aW9uIE5lKGUpe2lmKGU/LnJwSWQhPT12b2lkIDApcmV0dXJuIHAoZS5ycElkKTtpZih0eXBlb2YgbG9jYXRpb24+InUiKXJldHVybiBjKDkpO3JldHVybiBwKGRhKGxvY2F0aW9uLmhvc3RuYW1lKSl9dmFyIHJpPSIiO2Z1bmN0aW9uIFRlKGUpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil7cmk9ZS5tZXNzYWdlPT09IiI/ZS5uYW1lOmAke2UubmFtZX06ICR7ZS5tZXNzYWdlfWA7cmV0dXJufXJpPVN0cmluZyhlKX1mdW5jdGlvbiBjcihlKXtpZighKGUgaW5zdGFuY2VvZiBFcnJvcikpcmV0dXJuITE7cmV0dXJuIGUubmFtZT09PSJOb3RBbGxvd2VkRXJyb3IiJiZlLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygiZG9lcyBub3QgaGF2ZSBmb2N1cyIpfWZ1bmN0aW9uIG5pKCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4hMDtyZXR1cm4gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlIT09ImhpZGRlbiJ9ZnVuY3Rpb24gY3QoKXtpZih0eXBlb2YgZ2xvYmFsVGhpcy5mb2N1cyE9PSJmdW5jdGlvbiIpcmV0dXJuO3RyeXtnbG9iYWxUaGlzLmZvY3VzKCl9Y2F0Y2h7fX1mdW5jdGlvbiBkcihlPTI1MDApe2lmKG5pKCkpcmV0dXJuIGN0KCksUHJvbWlzZS5yZXNvbHZlKCk7cmV0dXJuIG5ldyBQcm9taXNlKCh0KT0+e2xldCByPSgpPT57Y2xlYXJUaW1lb3V0KHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pLGN0KCksdCgpfSxuPSgpPT57aWYobmkoKSlyKCl9LHM9c2V0VGltZW91dChyLGUpO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pLG4oKX0pfWFzeW5jIGZ1bmN0aW9uIHVyKGUpe2F3YWl0IGRyKCk7dHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKGUpfWNhdGNoKHQpe2lmKCFjcih0KSl0aHJvdyB0O3JldHVybiBjdCgpLGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5jcmVhdGUoZSl9fWFzeW5jIGZ1bmN0aW9uIGxyKGUpe2F3YWl0IGRyKCk7dHJ5e3JldHVybiBhd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KGUpfWNhdGNoKHQpe2lmKCFjcih0KSl0aHJvdyB0O3JldHVybiBjdCgpLGF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoZSl9fWZ1bmN0aW9uIHFlKCl7aWYodHlwZW9mIG5hdmlnYXRvcj4idSJ8fCFuYXZpZ2F0b3IuY3JlZGVudGlhbHN8fHR5cGVvZiBQdWJsaWNLZXlDcmVkZW50aWFsPiJ1IilyZXR1cm4gMjQ7cmV0dXJuIDB9ZnVuY3Rpb24gRmUoZSl7aWYoZT09PW51bGx8fGUudHlwZSE9PWJlfHwhKCJyYXdJZCJpbiBlKXx8dHlwZW9mIGUuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cyE9PSJmdW5jdGlvbiIpcmV0dXJuIGMoMjcpO3JldHVybiBwKGUpfWZ1bmN0aW9uIGduKGUpe2lmKGU9PT0icGxhdGZvcm0ifHxlPT09ImNyb3NzLXBsYXRmb3JtIilyZXR1cm4gZTtyZXR1cm59ZnVuY3Rpb24gaWkoZSl7aWYoL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KGUpKXJldHVybiJpb3MiO2lmKC9BbmRyb2lkL2kudGVzdChlKSlyZXR1cm4iYW5kcm9pZCI7aWYoL01hYyBPUyBYfE1hY2ludG9zaC9pLnRlc3QoZSkpcmV0dXJuIm1hY29zIjtpZigvV2luZG93cy9pLnRlc3QoZSkpcmV0dXJuIndpbmRvd3MiO2lmKC9MaW51eC9pLnRlc3QoZSkpcmV0dXJuImxpbnV4IjtyZXR1cm4ib3RoZXIifWZ1bmN0aW9uIFNuKGUpe2xldCB0PWUucmVzcG9uc2U7aWYoISgiZ2V0VHJhbnNwb3J0cyJpbiB0KSlyZXR1cm47bGV0IHI9dC5nZXRUcmFuc3BvcnRzO2lmKHR5cGVvZiByIT09ImZ1bmN0aW9uIilyZXR1cm47bGV0IG49ci5jYWxsKHQpO2lmKCFBcnJheS5pc0FycmF5KG4pKXJldHVybjtsZXQgcz1bXTtmb3IobGV0IGkgb2YgbilpZih0eXBlb2YgaT09PSJzdHJpbmciJiZpLmxlbmd0aD4wKXMucHVzaChpKTtyZXR1cm4gcy5sZW5ndGg9PT0wP3ZvaWQgMDpzfXZhciB1YT0zMixsYT02NCxtbj0zNyxzaT0xNjtmdW5jdGlvbiBvaShlKXtsZXQgdD1lLnJlc3BvbnNlO2lmKCEoImdldEF1dGhlbnRpY2F0b3JEYXRhImluIHQpKXJldHVybjtsZXQgcj10LmdldEF1dGhlbnRpY2F0b3JEYXRhO2lmKHR5cGVvZiByIT09ImZ1bmN0aW9uIilyZXR1cm47bGV0IG49ci5jYWxsKHQpO2lmKCEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm47bGV0IHM9bmV3IFVpbnQ4QXJyYXkobik7aWYocy5ieXRlTGVuZ3RoPG1uK3NpKXJldHVybjtsZXQgaT1zW3VhXTtpZihpPT09dm9pZCAwfHwoaSZsYSk9PT0wKXJldHVybjtyZXR1cm4gcy5zbGljZShtbixtbitzaSl9YXN5bmMgZnVuY3Rpb24gYWkoZSl7bGV0IHQ9cWUoKTtpZih0IT09MClyZXR1cm4gYyh0KTtsZXRbcixuXT1OZShlKTtpZihuIT09MClyZXR1cm4gYyhuKTtpZihyPT09dm9pZCAwKXJldHVybiBjKDkpO2xldCBzPWU/LnVzZXJOYW1lPz9lPy5ycE5hbWU/P3IsaT17cmVzaWRlbnRLZXk6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6ITAsdXNlclZlcmlmaWNhdGlvbjoicmVxdWlyZWQifTtpZihlPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCE9PXZvaWQgMClpLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PWUuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ7bGV0IG89e2xhcmdlQmxvYjp7c3VwcG9ydDoicmVxdWlyZWQifX0sYTt0cnl7YT1hd2FpdCB1cih7cHVibGljS2V5OntjaGFsbGVuZ2U6VWUoX2UpLHJwOntpZDpyLG5hbWU6ZT8ucnBOYW1lPz9pcn0sdXNlcjp7aWQ6VWUoMTYpLG5hbWU6cyxkaXNwbGF5TmFtZTpzfSxwdWJLZXlDcmVkUGFyYW1zOm9yLGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246aSxleHRlbnNpb25zOm8sLi4uZT8uaGludHMhPT12b2lkIDA/e2hpbnRzOmUuaGludHN9Ont9fX0pfWNhdGNoKGYpe3JldHVybiBUZShmKSxjKDMwKX1sZXRbZCx1XT1GZShhKTtpZih1IT09MClyZXR1cm4gYyh1KTtpZihkPT09dm9pZCAwKXJldHVybiBjKDI3KTtpZihkLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I/LnN1cHBvcnRlZCE9PSEwKXJldHVybiBjKDMwKTtyZXR1cm4gcChuZXcgVWludDhBcnJheShkLnJhd0lkKSl9YXN5bmMgZnVuY3Rpb24gYm4oZSx0LHIsbil7bGV0IHM9e2NoYWxsZW5nZTpVZShfZSkscnBJZDplLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCJ9O2lmKHQ/LmhpbnRzIT09dm9pZCAwKXMuaGludHM9dC5oaW50cztpZihyIT09dm9pZCAwKXMuYWxsb3dDcmVkZW50aWFscz1be3R5cGU6YmUsaWQ6Q2Uocil9XTtpZihuIT09dm9pZCAwKXMuZXh0ZW5zaW9ucz1uO2xldCBpO3RyeXtpPWF3YWl0IGxyKHtwdWJsaWNLZXk6c30pfWNhdGNoKGQpe3JldHVybiBUZShkKSxjKDMwKX1sZXRbbyxhXT1GZShpKTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDI3KTtyZXR1cm4gcChvKX1hc3luYyBmdW5jdGlvbiBjaShlLHQpe2xldCByPXFlKCk7aWYociE9PTApcmV0dXJuIGMocik7bGV0W24sc109TmUodCk7aWYocyE9PTApcmV0dXJuIGMocyk7aWYobj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgaT1lO2lmKGk9PT12b2lkIDApe2xldFtmLGhdPWF3YWl0IGJuKG4sdCk7aWYoaCE9PTAmJnQ/LmhpbnRzIT09dm9pZCAwKVtmLGhdPWF3YWl0IGJuKG4se3JwSWQ6dC5ycElkLHJwTmFtZTp0LnJwTmFtZX0pO2lmKGghPT0wKXJldHVybiBjKGgpO2lmKGY9PT12b2lkIDApcmV0dXJuIGMoMjcpO2k9bmV3IFVpbnQ4QXJyYXkoZi5yYXdJZCl9bGV0W28sYV09YXdhaXQgYm4obix0LGkse2xhcmdlQmxvYjp7cmVhZDohMH19KTtpZihhIT09MClyZXR1cm4gYyhhKTtpZihvPT09dm9pZCAwKXJldHVybiBjKDI3KTtsZXQgdT1vLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5sYXJnZUJsb2I7aWYodT09PXZvaWQgMHx8dS5ibG9iPT09dm9pZCAwKXJldHVybiBjKDcpO2xldCBsPWFyKHUuYmxvYik7aWYobC5ieXRlTGVuZ3RoPT09MClyZXR1cm4gYyg3KTtyZXR1cm4gcCh7YmxvYjpsLGNyZWRJZDpuZXcgVWludDhBcnJheShvLnJhd0lkKX0pfXZhciB3bj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMucHJmLnYxIiksRXQ9ImRpcGxvbWF0aWMtcHJmIjt2YXIgZnI9IiI7dmFyIGhyPXR5cGVvZiBnbG9iYWxUaGlzLldvcmtlcj09PSJmdW5jdGlvbiI/Z2xvYmFsVGhpcy5Xb3JrZXI6dm9pZCAwLEluPWhyPT09dm9pZCAwP3ZvaWQgMDpoci5wcm90b3R5cGUucG9zdE1lc3NhZ2UscHI7ZnVuY3Rpb24gcGEoKXtpZih0eXBlb2YgZnIhPT0ic3RyaW5nInx8ZnIubGVuZ3RoPT09MCl0aHJvdyBFcnJvcigiW0RJUExPTUFUSUNdIHdvcmtlciBzb3VyY2Ugbm90IGVtYmVkZGVkOyBydW4gcGtnIGJ1aWxkIGJlZm9yZSBzcGF3biIpO3JldHVybiBhdG9iKGZyKX1mdW5jdGlvbiBoYSgpe2lmKHByIT09dm9pZCAwKXJldHVybiBwcjtsZXQgZT1uZXcgQmxvYihbcGEoKV0se3R5cGU6InRleHQvamF2YXNjcmlwdCJ9KTtyZXR1cm4gcHI9VVJMLmNyZWF0ZU9iamVjdFVSTChlKSxwcn1mdW5jdGlvbiBkaSgpe2lmKGhyPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHNwYXduIHN5bmMgd29ya2VyIik7cmV0dXJuIG5ldyBocihoYSgpLHt0eXBlOiJtb2R1bGUifSl9ZnVuY3Rpb24gdWkoZSx0LHIpe2lmKEluPT09dm9pZCAwKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gV29ya2VyIEFQSSB1bmF2YWlsYWJsZTsgY2Fubm90IHBvc3QgdG8gc3luYyB3b3JrZXIiKTtpZihyIT09dm9pZCAwJiZyLmxlbmd0aD4wKUluLmNhbGwoZSx0LHt0cmFuc2ZlcjpyfSk7ZWxzZSBJbi5jYWxsKGUsdCl9dmFyIHlhPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy5iaW5kLnYxIikseG49bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJkaXBsb21hdGljLmJpbmR0YWcudjEiKSxtYT0zMixnYT0zMixTYT0xNixiYT0zMixuZT1uZXcgVmU7ZnVuY3Rpb24gd2EoZSl7cmV0dXJuIGUubWFwKCh0KT0+KHtoYW5kbGU6dC5oYW5kbGUsbGFiZWw6dC5sYWJlbCxpZHg6dC5pZHg/PzB9KSl9ZnVuY3Rpb24gbGkoZSl7aWYoZS5ieXRlTGVuZ3RoPT09MHx8ZS5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gYygyMik7aWYoZS5ieXRlTGVuZ3RoPG1lKzEpcmV0dXJuIGMoMTQpO2xldCB0PWUuc3ViYXJyYXkoMCxtZSk7aWYodC5ldmVyeSgoYSk9PmE9PT0wKSlyZXR1cm4gYygyMik7bGV0IHI9bmV3IEwoZS5zdWJhcnJheShtZSkpLFtuLHNdPXIucmVhZFN0cnVjdChobik7aWYocyE9PTApcmV0dXJuIGMocyk7aWYobj09PXZvaWQgMClyZXR1cm4gYygxNCk7aWYoIXIuZG9uZSgpKXJldHVybiBjKDE0KTtsZXRbaSxvXT1yZS5mcm9tQnl0ZXModCk7aWYobyE9PTApcmV0dXJuIGMobyk7aWYoaT09PXZvaWQgMClyZXR1cm4gYygxMik7cmV0dXJuIHAoe2VuY2xhdmU6aSxob3N0czpuLmhvc3RzLm1hcCgoYSk9Pih7Li4uYX0pKX0pfWFzeW5jIGZ1bmN0aW9uIGZpKGUsdCxyKXtsZXQgbj1xZSgpO2lmKG4hPT0wKXJldHVybiBuO2xldFtzLGldPU5lKHIpO2lmKGkhPT0wKXJldHVybiBpO2lmKHM9PT12b2lkIDApcmV0dXJuIDk7YXdhaXQgZHIoKTtsZXQgbz1uZXcgVWludDhBcnJheSh0LmJ5dGVMZW5ndGgpO28uc2V0KHQpO2xldCBhPXtsYXJnZUJsb2I6e3dyaXRlOm8uYnVmZmVyfX0sZD17cHVibGljS2V5OntjaGFsbGVuZ2U6VWUoX2UpLHJwSWQ6cyxhbGxvd0NyZWRlbnRpYWxzOlt7dHlwZTpiZSxpZDpDZShlKX1dLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOmEsLi4ucj8uaGludHMhPT12b2lkIDA/e2hpbnRzOnIuaGludHN9Ont9fX0sdTt0cnl7dHJ5e3U9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChkKX1jYXRjaCh5KXtpZighY3IoeSkpdGhyb3cgeTtjdCgpLHU9YXdhaXQgbmF2aWdhdG9yLmNyZWRlbnRpYWxzLmdldChkKX19Y2F0Y2goeSl7cmV0dXJuIFRlKHkpLDMwfWZpbmFsbHl7by5maWxsKDApfWxldFtsLGZdPUZlKHUpO2lmKGYhPT0wKXJldHVybiBmO2lmKGw9PT12b2lkIDApcmV0dXJuIDI3O2lmKGwuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8ud3JpdHRlbiE9PSEwKXJldHVybiAzMDtyZXR1cm4gMH12YXIgRW49MzI7ZnVuY3Rpb24gSWEoZSl7aWYoZT09PXZvaWQgMClyZXR1cm5bXTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm5bZV07cmV0dXJuIGUuZmlsdGVyKCh0KT0+dC5ieXRlTGVuZ3RoPjApfWZ1bmN0aW9uIHhhKGUpe2lmKCEoZSBpbnN0YW5jZW9mIEVycm9yKSlyZXR1cm4hMTtyZXR1cm4gZS5uYW1lPT09Ik5vdFN1cHBvcnRlZEVycm9yInx8ZS5uYW1lPT09IlR5cGVFcnJvciJ9ZnVuY3Rpb24geWkoZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9YXIoZSk7aWYodC5ieXRlTGVuZ3RoPEVuKXt0LmZpbGwoMCk7cmV0dXJufWlmKHQuYnl0ZUxlbmd0aD09PUVuKXJldHVybiB0O2xldCByPXQuc2xpY2UoMCxFbik7cmV0dXJuIHQuZmlsbCgwKSxyfWFzeW5jIGZ1bmN0aW9uIEVhKGUpe2xldCB0PXFlKCk7aWYodCE9PTApcmV0dXJuIGModCk7bGV0W3Isbl09TmUoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgcz1lPy51c2VyTmFtZT8/RXQsaT1lPy5kaXNwbGF5TmFtZT8/cyxvPVVlKDE2KSxhPWU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PT09ImNyb3NzLXBsYXRmb3JtIixkPXtyZXNpZGVudEtleTphPyJkaXNjb3VyYWdlZCI6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6IWEsdXNlclZlcmlmaWNhdGlvbjphPyJwcmVmZXJyZWQiOiJyZXF1aXJlZCJ9O2lmKGU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50IT09dm9pZCAwKWQuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ9ZS5hdXRoZW50aWNhdG9yQXR0YWNobWVudDtsZXQgdT17Y2hhbGxlbmdlOlVlKF9lKSxycDp7aWQ6cixuYW1lOmU/LnJwTmFtZT8/aXJ9LHVzZXI6e2lkOm8sbmFtZTpzLGRpc3BsYXlOYW1lOml9LHB1YktleUNyZWRQYXJhbXM6b3IsYXV0aGVudGljYXRvclNlbGVjdGlvbjpkLC4uLmU/LmhpbnRzIT09dm9pZCAwP3toaW50czplLmhpbnRzfTp7fSwuLi5lPy5leGNsdWRlQ3JlZGVudGlhbHMhPT12b2lkIDAmJmUuZXhjbHVkZUNyZWRlbnRpYWxzLmxlbmd0aD4wP3tleGNsdWRlQ3JlZGVudGlhbHM6ZS5leGNsdWRlQ3JlZGVudGlhbHMubWFwKChiKT0+KHt0eXBlOmJlLGlkOkNlKGIpfSkpfTp7fX0sbD1lPy5zYWx0IT09dm9pZCAwP0NlKGUuc2FsdCk6dm9pZCAwLGY9KGIpPT51cih7cHVibGljS2V5OnsuLi51LGV4dGVuc2lvbnM6YiYmbCE9PXZvaWQgMD97cHJmOntldmFsOntmaXJzdDpsfX19OntwcmY6e319fX0pLGg7dHJ5e2g9YXdhaXQgZihsIT09dm9pZCAwKX1jYXRjaChiKXtpZihsPT09dm9pZCAwfHwheGEoYikpcmV0dXJuIFRlKGIpLGMoMzApO3RyeXtoPWF3YWl0IGYoITEpfWNhdGNoKEUpe3JldHVybiBUZShFKSxjKDMwKX19bGV0W3ksZ109RmUoaCk7aWYoZyE9PTApcmV0dXJuIGMoZyk7aWYoeT09PXZvaWQgMClyZXR1cm4gYygyNyk7bGV0IG09eS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCksUz15aShtLnByZj8ucmVzdWx0cz8uZmlyc3QpLHg9bS5wcmY/LmVuYWJsZWQ9PT0hMHx8UyE9PXZvaWQgMDtpZihhJiZTIT09dm9pZCAwKVMuZmlsbCgwKTtyZXR1cm4gcCh7Y3JlZElkOm5ldyBVaW50OEFycmF5KHkucmF3SWQpLHVzZXJJZDpuZXcgVWludDhBcnJheShvKSxwcmZFbmFibGVkOngscHJmOmE/dm9pZCAwOlMsYXR0YWNobWVudDpnbih5LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOlNuKHkpLGFhZ3VpZDpvaSh5KX0pfWFzeW5jIGZ1bmN0aW9uIHBpKGUpe2xldCB0PXFlKCk7aWYodCE9PTApcmV0dXJuIGModCk7bGV0W3Isbl09TmUoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYyg5KTtsZXQgcz1lPy5zYWx0Pz93bixpPUNlKHMpLG89e2NoYWxsZW5nZTpVZShfZSkscnBJZDpyLHVzZXJWZXJpZmljYXRpb246InByZWZlcnJlZCIsZXh0ZW5zaW9uczp7cHJmOntldmFsOntmaXJzdDppfX19fTtpZihlPy5oaW50cyE9PXZvaWQgMClvLmhpbnRzPWUuaGludHM7bGV0IGE9SWEoZT8uY3JlZElkKTtpZihhLmxlbmd0aD4wKW8uYWxsb3dDcmVkZW50aWFscz1hLm1hcCgoeSk9Pih7dHlwZTpiZSxpZDpDZSh5KX0pKTtsZXQgZDt0cnl7ZD1hd2FpdCBscih7cHVibGljS2V5Om99KX1jYXRjaCh5KXtyZXR1cm4gVGUoeSksYygzMCl9bGV0W3UsbF09RmUoZCk7aWYobCE9PTApcmV0dXJuIGMobCk7aWYodT09PXZvaWQgMClyZXR1cm4gYygyNyk7bGV0IGY9dS5nZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzKCkucHJmPy5yZXN1bHRzO2lmKGY/LmZpcnN0PT09dm9pZCAwKXJldHVybiBjKDcpO2xldCBoPXlpKGYuZmlyc3QpO2lmKGg9PT12b2lkIDApcmV0dXJuIGMoMjcpO3JldHVybiBwKHtwcmY6aCxjcmVkSWQ6bmV3IFVpbnQ4QXJyYXkodS5yYXdJZCksYXR0YWNobWVudDpnbih1LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50KSx0cmFuc3BvcnRzOlNuKHUpfSl9ZnVuY3Rpb24gQW4oZSl7aWYoZS5ieXRlTGVuZ3RoIT09bWUpcmV0dXJuIGMoMTApO3JldHVybltlLDBdfWNsYXNzIHJleyNlO2NvbnN0cnVjdG9yKGUpe3RoaXMuI2U9ZX1zdGF0aWMgYXN5bmMgZnJvbVJhbmRvbShlKXtpZihlLmJ5dGVMZW5ndGg8YmEpcmV0dXJuIGMoMTApO2xldCB0PWF3YWl0IG5lLmdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKSxyPXllKHQsZSk7dHJ5e2xldCBuPWF3YWl0IG5lLmJsYWtlMyhyKSxbcyxpXT1BbihuKTtpZihpIT09MClyZXR1cm4gYyhpKTtpZihzPT09dm9pZCAwKXJldHVybiBjKDEyKTtyZXR1cm4gcChuZXcgcmUocykpfWZpbmFsbHl7dC5maWxsKDApLHIuZmlsbCgwKSxlLmZpbGwoMCl9fXN0YXRpYyBmcm9tQnl0ZXMoZSl7bGV0W3Qscl09QW4oZSk7aWYociE9PTApcmV0dXJuIGMocik7aWYodD09PXZvaWQgMClyZXR1cm4gYygxMCk7bGV0W24sc109QW4odC5zbGljZSgpKTtpZihzIT09MClyZXR1cm4gYyhzKTtpZihuPT09dm9pZCAwKXJldHVybiBjKDEwKTtyZXR1cm4gcChuZXcgcmUobikpfWFzeW5jIHNlYWxXaXRoUGFzc2tleShlKXtsZXQgdD1lPy5zYWx0Pz93bixyPWU/LmNyZWRJZCxuPXIscz1lPy5jcmVhdGVDcmVkSWZOZWVkZWQ9PT0hMCYmKHI9PT12b2lkIDB8fCEociBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpJiZyLmxlbmd0aD09PTApLGksbztpZihzKXtsZXRbbCxmXT1hd2FpdCBFYSh7cnBJZDplPy5ycElkLHJwTmFtZTplPy5ycE5hbWUsdXNlck5hbWU6ZT8udXNlck5hbWU/P0V0LGRpc3BsYXlOYW1lOmU/LmRpc3BsYXlOYW1lLGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OmU/LmF1dGhlbnRpY2F0b3JBdHRhY2htZW50LGhpbnRzOmU/LmhpbnRzLGV4Y2x1ZGVDcmVkZW50aWFsczplPy5leGNsdWRlQ3JlZGVudGlhbHMsc2FsdDp0fSk7aWYoZiE9PTApcmV0dXJuIGMoZik7aWYobD09PXZvaWQgMClyZXR1cm4gYygzMCk7aWYoIWwucHJmRW5hYmxlZClyZXR1cm4gYygzMCk7bj1sLmNyZWRJZCxpPWwsbz1sLnByZn1sZXQgYT1hc3luYyhsLGYsaCx5KT0+e3RyeXtsZXRbZyxtXT1hd2FpdCB0aGlzLiNzKGwpO2lmKG0hPT0wKXJldHVybiBjKG0pO2lmKGc9PT12b2lkIDApcmV0dXJuIGMoMTIpO3JldHVybiBwKHtzZWFsZWRNYXN0ZXI6ZyxzYWx0OnQuc2xpY2UoKSxjcmVkSWQ6Zi5zbGljZSgpLHVzZXJJZDppPy51c2VySWQ9PT12b2lkIDA/dm9pZCAwOmkudXNlcklkLnNsaWNlKCksYXR0YWNobWVudDpoPz9pPy5hdHRhY2htZW50LHRyYW5zcG9ydHM6eT8/aT8udHJhbnNwb3J0cyxhYWd1aWQ6aT8uYWFndWlkPT09dm9pZCAwP3ZvaWQgMDppLmFhZ3VpZC5zbGljZSgpfSl9ZmluYWxseXtsLmZpbGwoMCl9fTtpZihvIT09dm9pZCAwJiZpIT09dm9pZCAwKXJldHVybiBhKG8saS5jcmVkSWQsaS5hdHRhY2htZW50LGkudHJhbnNwb3J0cyk7bGV0W2QsdV09YXdhaXQgcGkoe3JwSWQ6ZT8ucnBJZCxycE5hbWU6ZT8ucnBOYW1lLGNyZWRJZDpuLHNhbHQ6dCxoaW50czplPy5oaW50c30pO2lmKHUhPT0wKXJldHVybiBjKHUpO2lmKGQ9PT12b2lkIDApcmV0dXJuIGMoNyk7cmV0dXJuIGEoZC5wcmYsZC5jcmVkSWQsZC5hdHRhY2htZW50LGQudHJhbnNwb3J0cyl9YXN5bmMgYmluZChlLHQpe2lmKHQhPT12b2lkIDApe2ZvcihsZXQgaSBvZiB0KWlmKCFhd2FpdCB0aGlzLiNuKGkuY3JlZElkLGkudGFnKSlyZXR1cm4gYygxMCl9bGV0W3Isbl09YXdhaXQgdGhpcy5zZWFsV2l0aFBhc3NrZXkoZSk7aWYobiE9PTApcmV0dXJuIGMobik7aWYocj09PXZvaWQgMClyZXR1cm4gYygxMik7bGV0IHM9YXdhaXQgdGhpcy4jdChyLmNyZWRJZCk7cmV0dXJuIHAoey4uLnIsdGFnOnN9KX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aFBhc3NrZXkoZSx0KXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGMoMjIpO2xldCByPVtdO2ZvcihsZXQgYSBvZiBlKWlmKGEuY3JlZElkLmJ5dGVMZW5ndGg+MClyLnB1c2goYS5jcmVkSWQpO2xldFtuLHNdPWF3YWl0IHBpKHtycElkOnQucnBJZCxycE5hbWU6dC5ycE5hbWUsaGludHM6dC5oaW50cyxjcmVkSWQ6ci5sZW5ndGg+MD9yOnZvaWQgMCxzYWx0OnQuc2FsdH0pO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoNyk7bGV0IGk9ZS5maW5kKChhKT0+WChhLmNyZWRJZCxuLmNyZWRJZCkpLG89aT09PXZvaWQgMD9lOltpLC4uLmUuZmlsdGVyKChhKT0+YSE9PWkpXTt0cnl7Zm9yKGxldCBhIG9mIG8pe2xldFtkXT1hd2FpdCByZS4jcihhLnNlYWxlZE1hc3RlcixuLnByZik7aWYoZCE9PXZvaWQgMClyZXR1cm4gcCh7ZW5jbGF2ZTpkLGNyZWRJZDpuLmNyZWRJZC5zbGljZSgpfSl9cmV0dXJuIGMoMjApfWZpbmFsbHl7bi5wcmYuZmlsbCgwKX19YXN5bmMgc2VhbFdpdGhJa20oZSl7dHJ5e3JldHVybiBhd2FpdCB0aGlzLiNzKGUpfWZpbmFsbHl7ZS5maWxsKDApfX1zdGF0aWMgYXN5bmMgdW5zZWFsV2l0aElrbShlLHQpe3RyeXtyZXR1cm4gYXdhaXQgcmUuI3IoZSx0KX1maW5hbGx5e3QuZmlsbCgwKX19YXN5bmMgcGVyc2lzdFRvTGFyZ2VCbG9iKGU9W10sdCl7bGV0IHI9dD8uY3JlZElkO2lmKHI9PT12b2lkIDApe2xldFtpLG9dPWF3YWl0IGFpKHQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGMoMzApO3I9aX1sZXRbbixzXT10aGlzLiNpKGUpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXQgaT1hd2FpdCBmaShyLG4sdCk7aWYoaSE9PTApcmV0dXJuIGMoaSk7cmV0dXJuIHAocil9ZmluYWxseXtuLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBmcm9tTGFyZ2VCbG9iKGUpe2xldFt0LHJdPWF3YWl0IGNpKGU/LmNyZWRJZCxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwKXJldHVybiBjKDcpO3RyeXtsZXRbbixzXT1saSh0LmJsb2IpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3JldHVybiBwKHsuLi5uLGNyZWRJZDp0LmNyZWRJZH0pfWZpbmFsbHl7dC5ibG9iLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBjbGVhckxhcmdlQmxvYihlLHQpe3JldHVybiBmaShlLG5ldyBVaW50OEFycmF5KG1lKSx0KX1zdGF0aWMgZnJvbVBhaXJQbGFpbihlKXtyZXR1cm4gbGkoZSl9c3RhdGljIHBhaXJSZXF1ZXN0KCl7cmV0dXJuIHNyLmNyZWF0ZSgpfWFzeW5jIHBhaXJBY2NlcHQoZSx0KXtsZXQgcjt0cnl7cj1hd2FpdCBuZS5nZW5YMjU1MTkoKX1jYXRjaHtyZXR1cm4gYygyOSl9dHJ5e2xldFtuLHNdPWF3YWl0IHluKHIucHJpdixlLGUsci5wdWIpO2lmKHMhPT0wKXJldHVybiBjKHMpO2lmKG49PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXRbaSxvXT10aGlzLiNpKHQpO2lmKG8hPT0wKXJldHVybiBjKG8pO2lmKGk9PT12b2lkIDApcmV0dXJuIGMoMTIpO3RyeXtsZXQgYT1hd2FpdCBuZS5lbmNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKGksbik7cmV0dXJuIHRpKHllKHIucHViLGEpKX1jYXRjaHtyZXR1cm4gYygxMil9ZmluYWxseXtpLmZpbGwoMCl9fWZpbmFsbHl7bi5maWxsKDApfX1maW5hbGx5e3IucHJpdi5maWxsKDApfX1zcGF3blN5bmNXb3JrZXIoZSl7bGV0IHQ9ZGkoKSxyPXRoaXMuI2Uuc2xpY2UoKTtyZXR1cm4gdWkodCx7aWQ6ZS5pZCxvcDoic2V0U2VlZCIsc2VlZDpyLHBlcnNpc3Q6ZS5wZXJzaXN0fSxbci5idWZmZXJdKSx0fWRlcml2ZUNpcGhlcihlLHQpe2xldCByPWUuc2xpY2UoKSxuPShvKT0+dGhpcy4jYyhyLG8pLHM9KG8pPT50aGlzLiNkKHIsbyk7cmV0dXJue2VuY3J5cHQ6T2JqZWN0LmZyZWV6ZSh7ZW5jcnlwdDpufSksZGVjcnlwdDpPYmplY3QuZnJlZXplKHtkZWNyeXB0OnN9KSxib3RoOk9iamVjdC5mcmVlemUoe2VuY3J5cHQ6bixkZWNyeXB0OnN9KX1bdF19YXN5bmMgZGVyaXZlSWRlbnRpdHkoZSx0PTApe2xldCByPWUsbj10LHM9YXdhaXQgdGhpcy4jYShyLG4pLGk9cy5wdWJsaWNLZXk7cmV0dXJuIHMucHJpdmF0ZUtleS5maWxsKDApLE9iamVjdC5mcmVlemUoe3B1YmxpY0tleTppLHNpZ246KG8pPT50aGlzLiNsKHIsbixvKSxrZG1Gb3I6KG8pPT50aGlzLiNmKHIsbixvKX0pfWFzeW5jI3QoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy4jZS5ieXRlTGVuZ3RoK3huLmJ5dGVMZW5ndGgrZS5ieXRlTGVuZ3RoKTt0LnNldCh0aGlzLiNlLDApLHQuc2V0KHhuLHRoaXMuI2UuYnl0ZUxlbmd0aCksdC5zZXQoZSx0aGlzLiNlLmJ5dGVMZW5ndGgreG4uYnl0ZUxlbmd0aCk7dHJ5e3JldHVybiBhd2FpdCBuZS5ibGFrZTModCl9ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jI24oZSx0KXtpZih0LmJ5dGVMZW5ndGghPT1tYSlyZXR1cm4hMTtsZXQgcj1hd2FpdCB0aGlzLiN0KGUpO3RyeXtpZihyLmJ5dGVMZW5ndGghPT10LmJ5dGVMZW5ndGgpcmV0dXJuITE7bGV0IG49MDtmb3IobGV0IHM9MDtzPHIuYnl0ZUxlbmd0aDtzKyspe2xldCBpPXJbc10sbz10W3NdO2lmKGk9PT12b2lkIDB8fG89PT12b2lkIDApcmV0dXJuITE7bnw9aV5vfXJldHVybiBuPT09MH1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjcyhlKXtsZXRbdCxyXT1hd2FpdCBoaShuZSxlKTtpZihyIT09MClyZXR1cm4gYyhyKTtpZih0PT09dm9pZCAwKXJldHVybiBjKDEyKTt0cnl7bGV0IG49YXdhaXQgbmUuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZCh0aGlzLiNlLHQpO3JldHVybiBMZShuKX1jYXRjaHtyZXR1cm4gYygxMil9ZmluYWxseXt0LmZpbGwoMCl9fXN0YXRpYyBhc3luYyNyKGUsdCl7bGV0WyxyXT1MZShlKTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXRbbixzXT1hd2FpdCBoaShuZSx0KTtpZihzIT09MClyZXR1cm4gYyhzKTtpZihuPT09dm9pZCAwKXJldHVybiBjKDEyKTtsZXQgaTt0cnl7dHJ5e2k9YXdhaXQgbmUuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChlLG4pfWNhdGNoe3JldHVybiBjKDIwKX1yZXR1cm4gcmUuZnJvbUJ5dGVzKGkpfWZpbmFsbHl7bi5maWxsKDApLGk/LmZpbGwoMCl9fSNpKGUpe2xldCB0PW5ldyBLLHI9dC53cml0ZVN0cnVjdChobix7aG9zdHM6d2EoZSl9KTtpZihyIT09MClyZXR1cm4gYyhyKTtsZXQgbj10LnJlc3VsdCgpLHM9bmV3IFVpbnQ4QXJyYXkobWUrbi5ieXRlTGVuZ3RoKTtyZXR1cm4gcy5zZXQodGhpcy4jZSwwKSxzLnNldChuLG1lKSxbcywwXX1hc3luYyNjKGUsdCl7bGV0IHI9YXdhaXQgdGhpcy4jbyhlKTt0cnl7cmV0dXJuIGF3YWl0IG5lLmVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQodCxyKX1maW5hbGx5e3IuZmlsbCgwKX19YXN5bmMjZChlLHQpe2xldCByPWF3YWl0IHRoaXMuI28oZSk7dHJ5e3JldHVybiBhd2FpdCBuZS5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKHQscil9ZmluYWxseXtyLmZpbGwoMCl9fWFzeW5jI28oZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy4jZS5ieXRlTGVuZ3RoK2UuYnl0ZUxlbmd0aCk7dC5zZXQodGhpcy4jZSwwKSx0LnNldChlLHRoaXMuI2UuYnl0ZUxlbmd0aCk7dHJ5e3JldHVybiBhd2FpdCBuZS5ibGFrZTModCl9ZmluYWxseXt0LmZpbGwoMCl9fWFzeW5jI3UoZSx0KXtsZXQgcj1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoZSksbj1uZXcgVWludDhBcnJheSg4KTtyZXR1cm4gbmV3IERhdGFWaWV3KG4uYnVmZmVyKS5zZXRCaWdVaW50NjQoMCxCaWdJbnQodCksITEpLGF3YWl0IHRoaXMuI28oeWUocixuKSl9YXN5bmMjYShlLHQpe2xldCByPWF3YWl0IHRoaXMuI3UoZSx0KTt0cnl7cmV0dXJuIGF3YWl0IG5lLmRlcml2ZUVkMjU1MTlLZXlQYWlyKHIpfWZpbmFsbHl7ci5maWxsKDApfX1hc3luYyNsKGUsdCxyKXtsZXQgbj1hd2FpdCB0aGlzLiNhKGUsdCk7dHJ5e3JldHVybiBhd2FpdCBuZS5zaWduRWQyNTUxOShyLG4ucHJpdmF0ZUtleSl9ZmluYWxseXtuLnByaXZhdGVLZXkuZmlsbCgwKX19YXN5bmMjZihlLHQscil7bGV0IG49YXdhaXQgdGhpcy4jYShlLHQpLHM9eWUobi5wcml2YXRlS2V5LHIpO24ucHJpdmF0ZUtleS5maWxsKDApO3RyeXtyZXR1cm4oYXdhaXQgbmUuYmxha2UzKHMpKS5zbGljZSgwLHZlKX1maW5hbGx5e3MuZmlsbCgwKX19fWFzeW5jIGZ1bmN0aW9uIGhpKGUsdCxyPXlhKXtpZih0LmJ5dGVMZW5ndGg8U2EpcmV0dXJuIGMoMTApO2xldCBuPWF3YWl0IGUuYmxha2UzKHllKHQscikpO3JldHVybiBwKG4uc2xpY2UoMCxnYSkpfXZhciBBYT1uZXcgU2V0KFsiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJsZW5ndGgiLCJuYW1lIl0pO2Z1bmN0aW9uIG1pKGUpe2ZvcihsZXQgdCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSl7aWYoQWEuaGFzKHQpKWNvbnRpbnVlO2xldCByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZihyPT09dm9pZCAwfHx0eXBlb2Ygci52YWx1ZSE9PSJmdW5jdGlvbiIpY29udGludWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6ci52YWx1ZSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITF9KX19bWkocmUpO21pKHJlLnByb3RvdHlwZSk7Y2xhc3MgUG57ZGI7Y29uc3RydWN0b3IoZSl7dGhpcy5kYj1lfWFzeW5jIGVucShlKXtsZXQgdD1bLi4uZV07aWYodC5sZW5ndGg9PT0wKXJldHVybjtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHVlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9YCR7by5ob3N0fToke28uc2VxfWA7bi5wdXQobyxhKX19KX1hc3luYyBkZXEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKHVlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9YCR7ZX06JHthfWA7cy5kZWxldGUoZCl9fSl9YXN5bmMgbGlzdCgpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24odWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0QWxsKCk7cy5vbnN1Y2Nlc3M9KCk9PnIocy5yZXN1bHQpLHMub25lcnJvcj0oKT0+bihzLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbih1ZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh1ZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbih1ZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKHVlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fWZ1bmN0aW9uIGdpKGUpe3JldHVybntsYWJlbDplLmxhYmVsLGhhbmRsZTpuZXcgVVJMKGUuaGFuZGxlKSxpZHg6ZS5pZHgsbGFzdFNlcTplLmxhc3RTZXF8fDAsY2xvY2tPZmZzZXQ6ZS5jbG9ja09mZnNldCxzdWJzY3JpcHRpb246ZS5zdWJzY3JpcHRpb259fWZ1bmN0aW9uIFBhKGUsdCl7bGV0IHI9ey4uLmV9O2lmKHQuc2V0TGFzdFNlcSE9PXZvaWQgMClyLmxhc3RTZXE9dC5zZXRMYXN0U2VxO2Vsc2UgaWYodC5sYXN0U2VxIT09dm9pZCAwKXtsZXQgbj1yLmxhc3RTZXF8fDA7aWYodC5sYXN0U2VxPm4pci5sYXN0U2VxPXQubGFzdFNlcX1yZXR1cm4gZGVsZXRlIHIubnVtQmFncyxkZWxldGUgci5udW1EdXBlcyxyfWNsYXNzIFVue2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBhZGQoZSl7bGV0IHQ9YXdhaXQgdGhpcy5nZXQoZS5sYWJlbCkscj10IT09dm9pZCAwJiZ0LmhhbmRsZS5ocmVmPT09ZS5oYW5kbGUuaHJlZiYmKHQuaWR4Pz8wKT09PShlLmlkeD8/MCk7cmV0dXJuIHRoaXMucHV0KHsuLi5lLGxhc3RTZXE6cj90Lmxhc3RTZXE6MCxjbG9ja09mZnNldDpyP3QuY2xvY2tPZmZzZXQ6dm9pZCAwLHN1YnNjcmlwdGlvbjpyP3Quc3Vic2NyaXB0aW9uOnZvaWQgMH0pfWFzeW5jIHB1dChlKXtsZXQgdD17Li4uZSxoYW5kbGU6ZS5oYW5kbGUudG9TdHJpbmcoKSxsYXN0U2VxOmUubGFzdFNlcT8/MH0scj10aGlzLmRiLnRyYW5zYWN0aW9uKHNlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoc2UpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKSxuLnB1dCh0KX0pfWFzeW5jIHRvdWNoKGUsdCl7cmV0dXJuIHRoaXMucmVjb3JkU3RhdHMoZSx7bGFzdFNlcTp0fSl9YXN5bmMgcmVjb3JkU3RhdHMoZSx0KXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKHNlLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoc2UpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtsZXQgbz1uLmdldChlKTtvLm9uc3VjY2Vzcz0oKT0+e2xldCBhPW8ucmVzdWx0O2lmKCFhKXJldHVybjtuLnB1dChQYShhLHQpKX19KX1hc3luYyBnZXQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ci5nZXQoZSk7aS5vbnN1Y2Nlc3M9KCk9PntsZXQgbz1pLnJlc3VsdDtpZighbyluKHZvaWQgMCk7ZWxzZSBuKGdpKG8pKX0saS5vbmVycm9yPSgpPT5zKGkuZXJyb3IpfSl9YXN5bmMgc2V0KGUsdCl7bGV0IHI9YXdhaXQgdGhpcy5nZXQoZSk7aWYoIXIpcmV0dXJuIDEzO3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5wdXQoey4uLnIsLi4udH0pLDB9Y2F0Y2h7cmV0dXJuIDE4fX1hc3luYyBkZWwoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKHNlKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9Pnt0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5kZWxldGUoZSl9KX1hc3luYyBsaXN0KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihzZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXRBbGwoKTtzLm9uc3VjY2Vzcz0oKT0+e2xldCBpPXMucmVzdWx0O3IoaS5tYXAoZ2kpKX0scy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oc2UsInJlYWR3cml0ZSIpLHQ9ZS5vYmplY3RTdG9yZShzZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57ZS5vbmNvbXBsZXRlPSgpPT5yKCksZS5vbmVycm9yPSgpPT5uKGUuZXJyb3IpLHQuY2xlYXIoKX0pfX1jbGFzcyBrbntjcnlwdG87ZGI7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNyeXB0bz10O3RoaXMuZGI9ZX1hc3luYyBhZGQoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxyPXQub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChuKT0+e2lmKGUubGVuZ3RoPT09MCl7bihbXSk7cmV0dXJufWxldCBzPUFycmF5KGUubGVuZ3RoKS5maWxsKDApO3Qub25jb21wbGV0ZT0oKT0+bihzKSx0Lm9uZXJyb3I9KCk9Pntmb3IobGV0IGk9MDtpPHMubGVuZ3RoO2krKylzW2ldPTE4O24ocyl9O2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXR7a2V5Om8sZGF0YTphfT1lW2ldLGQ9QyhvKSx1PXIucHV0KGEsZCk7dS5vbmVycm9yPShsKT0+e2wucHJldmVudERlZmF1bHQoKSxzW2ldPTE4fX19KX1hc3luYyBkZWwoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXQgbyBvZiB0KXtsZXQgYT1DKG8pO24uZGVsZXRlKGEpfX0pfWFzeW5jIGdldChlKXtsZXQgcj10aGlzLmRiLnRyYW5zYWN0aW9uKFcsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9QyhlKSxvPXIuZ2V0KGkpO28ub25zdWNjZXNzPWFzeW5jKCk9PntsZXQgYT1vLnJlc3VsdDtpZihhKW4oYXdhaXQganQoZSxhLHRoaXMuY3J5cHRvKSk7ZWxzZSBuKHZvaWQgMCl9LG8ub25lcnJvcj0oKT0+cyhvLmVycm9yKX0pfWFzeW5jIGhhcyhlKXtyZXR1cm4gYXdhaXQgdGhpcy5nZXQoZSkhPT12b2lkIDB9YXN5bmMgbGlzdChlKXtsZXQgdD1lPy5hcGxkLHI9ZT8uYm9keSE9PSExLHM9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e2xldCBhPVtdLGQ9dD09PXZvaWQgMD9zLm9wZW5DdXJzb3IoKTpzLmluZGV4KEF0KS5vcGVuQ3Vyc29yKElEQktleVJhbmdlLm9ubHkodCkpO2Qub25zdWNjZXNzPSh1KT0+e2xldCBsPXUudGFyZ2V0LnJlc3VsdDtpZihsKXtsZXQgZj10PT09dm9pZCAwP2wua2V5OmwucHJpbWFyeUtleSxoPWwudmFsdWU7YS5wdXNoKHtoYXNoOmZlKGYpLGRhdGE6aH0pLGwuY29udGludWUoKX1lbHNlIFByb21pc2UuYWxsKGEubWFwKCh7aGFzaDpmLGRhdGE6aH0pPT5qdChmLGgsdGhpcy5jcnlwdG8se2JvZHk6cn0pKSkudGhlbihpKS5jYXRjaChvKX0sZC5vbmVycm9yPSgpPT5vKGQuZXJyb3IpfSl9YXN5bmMgY291bnQoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpPWU9PT12b2lkIDA/ci5jb3VudCgpOnIuaW5kZXgoQXQpLmNvdW50KElEQktleVJhbmdlLm9ubHkoZSkpO2kub25zdWNjZXNzPSgpPT5uKGkucmVzdWx0KSxpLm9uZXJyb3I9KCk9PnMoaS5lcnJvcil9KX1hc3luYyBsaXN0S2V5cygpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZG9ubHkiKS5vYmplY3RTdG9yZShXKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntsZXQgcz1bXSxpPXQub3BlbktleUN1cnNvcigpO2kub25zdWNjZXNzPShvKT0+e2xldCBhPW8udGFyZ2V0LnJlc3VsdDtpZihhKXMucHVzaChmZShhLmtleSkpLGEuY29udGludWUoKTtlbHNlIHIocyl9LGkub25lcnJvcj0oKT0+bihpLmVycm9yKX0pfWFzeW5jIGxhc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgobixzKT0+e2xldCBpLG89ci5vcGVuQ3Vyc29yKCk7by5vbnN1Y2Nlc3M9YXN5bmMoYSk9PntsZXQgZD1hLnRhcmdldC5yZXN1bHQ7aWYoZCl7bGV0e2tleTp1LHZhbHVlOmx9PWQ7aWYoWChlLGwuZWlkKSl7aWYoIWl8fChsLmN0cj8/MCk+KGkuZGF0YS5jdHI/PzApfHwobC5jdHI/PzApPT09KGkuZGF0YS5jdHI/PzApJiYobC5vZmY/PzApPihpLmRhdGEub2ZmPz8wKSlpPXtrZXk6dSxkYXRhOmx9fWQuY29udGludWUoKX1lbHNlIGlmKGkpe2xldCB1PWZlKGkua2V5KTtuKGF3YWl0IGp0KHUsaS5kYXRhLHRoaXMuY3J5cHRvKSl9ZWxzZSBuKHZvaWQgMCl9LG8ub25lcnJvcj0oKT0+cyhvLmVycm9yKX0pfWFzeW5jIG1hcmtBcHBsaWVkKGUpe2xldCB0PVsuLi5lXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2xldCByPXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZHdyaXRlIiksbj1yLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKTtmb3IobGV0IG8gb2YgdCl7bGV0IGE9QyhvKSxkPW4uZ2V0KGEpO2Qub25zdWNjZXNzPSgpPT57bGV0IHU9ZC5yZXN1bHQ7aWYoIXUpcmV0dXJuO1dyKHUsWHQpLG4ucHV0KHUsYSl9LGQub25lcnJvcj0odSk9Pnt1LnByZXZlbnREZWZhdWx0KCl9fX0pfWFzeW5jIG1hcmtGYWlsZWQoZSl7bGV0IHQ9Wy4uLmVdO2lmKHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihXLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoVyk7cmV0dXJuIG5ldyBQcm9taXNlKChzLGkpPT57ci5vbmNvbXBsZXRlPSgpPT5zKCksci5vbmVycm9yPSgpPT5pKHIuZXJyb3IpO2ZvcihsZXR7a2V5Om8sZXJyOmF9b2YgdCl7bGV0IGQ9QyhvKSx1PW4uZ2V0KGQpO3Uub25zdWNjZXNzPSgpPT57bGV0IGw9dS5yZXN1bHQ7aWYoIWwpcmV0dXJuO1dyKGwsbnQsYSksbi5wdXQobCxkKX0sdS5vbmVycm9yPShsKT0+e2wucHJldmVudERlZmF1bHQoKX19fSl9YXN5bmMgd2lwZSgpe2xldCBlPXRoaXMuZGIudHJhbnNhY3Rpb24oVywicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKFcpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmNsZWFyKCl9KX19dmFyIFVhPTg7Y2xhc3MgQm57I2U7I3Q7I247I3M7I3I7Y29uc3RydWN0b3IoZSl7aWYodGhpcy4jcj1lLnBlcnNpc3RLZXlyaW5nLHRoaXMuI249e3JwSWQ6ZS5ycElkLHJwTmFtZTplLnJwTmFtZX0sdGhpcy4jcz1lLnVzZXJOYW1lPz9lLnJwSWQ/P2UucnBOYW1lPz9FdCxlLmtleXJpbmchPT12b2lkIDApdGhpcy4jdD1rZShlLmtleXJpbmcpfWdldCBrZXlyaW5nKCl7cmV0dXJuIHRoaXMuI3Q9PT12b2lkIDA/dm9pZCAwOmtlKHRoaXMuI3QpfWxpc3QoKXtpZih0aGlzLiN0PT09dm9pZCAwKXJldHVybltdO3JldHVybiB0aGlzLiN0LmVudHJpZXMubWFwKHZhKX1hc3luYyBzYXZlKGUsdCl7aWYodD8ucGVyc2lzdD09PSEwKXJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcigicHJmLXN0b3JlOiB1c2UgYmluZEFuZFNhdmUoZW5jbGF2ZSkgdG8gcGVyc2lzdCBhIGJpbmRpbmciKSk7cmV0dXJuIHRoaXMuI2U9ZSx0aGlzLiNlfWFzeW5jIGJpbmRBbmRTYXZlKGUsdCl7bGV0IHI9dGhpcy4jdCxuPXQ/LmNyZWRJZCxzPW4gaW5zdGFuY2VvZiBVaW50OEFycmF5P24uYnl0ZUxlbmd0aD4wOm4hPT12b2lkIDAmJm4ubGVuZ3RoPjA7aWYoIXMmJnIhPT12b2lkIDAmJnIuZW50cmllcy5sZW5ndGg+PVVhKXJldHVybiBjKDI2KTtsZXQgaT1TaSh0Py5uaWNrKSxvPXQ/LmV4Y2x1ZGVDcmVkZW50aWFscz8/KHM/dm9pZCAwOkRhKHIpKSxhPXQ/LnNhbHQ/P3I/LnNhbHQsZD1yPT09dm9pZCAwP3ZvaWQgMDpyLmVudHJpZXMubWFwKChnKT0+KHtjcmVkSWQ6Zy5jcmVkSWQsdGFnOmcudGFnfSkpLFt1LGxdPWF3YWl0IGUuYmluZCh7Li4udGhpcy4jbixzYWx0OmEsY3JlZElkOm4sY3JlYXRlQ3JlZElmTmVlZGVkOnQ/LmNyZWF0ZUNyZWRJZk5lZWRlZD8/IXMsZXhjbHVkZUNyZWRlbnRpYWxzOm8sdXNlck5hbWU6dGhpcy4jcyxkaXNwbGF5TmFtZTppPz90aGlzLiNuLnJwTmFtZT8/dGhpcy4jcyxhdXRoZW50aWNhdG9yQXR0YWNobWVudDp0Py5hdXRoZW50aWNhdG9yQXR0YWNobWVudCxoaW50czp0Py5oaW50c30sZCk7aWYobCE9PTApcmV0dXJuIGMobCk7aWYodT09PXZvaWQgMClyZXR1cm4gYygxMik7bGV0IGY9RGF0ZS5ub3coKSxoPXt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp1LnNlYWxlZE1hc3RlcixjcmVkSWQ6dS5jcmVkSWQsdGFnOnUudGFnLHVzZXJJZDp1LnVzZXJJZCxuaWNrOmksZW5yb2xsZWRBdDpmLGxhc3RVc2VkQXQ6ZixhdHRhY2htZW50OnUuYXR0YWNobWVudCx0cmFuc3BvcnRzOnUudHJhbnNwb3J0cyxhYWd1aWQ6dS5hYWd1aWQsZW5yb2xsZWRPczprYSgpfSx5PXI9PT12b2lkIDA/e3NhbHQ6dS5zYWx0LnNsaWNlKCksZW50cmllczpbXX06a2Uocik7cmV0dXJuIHRoaXMuI3Q9Q2EoeSxoKSx0aGlzLiNlPWUsYXdhaXQgdGhpcy4jcihrZSh0aGlzLiN0KSkscCh0aGlzLiNlKX1hc3luYyBsb2FkKCl7cmV0dXJuIHRoaXMuI2V9YXN5bmMgdW5sb2NrKCl7bGV0IGU9dGhpcy4jdDtpZihlPT09dm9pZCAwfHxlLmVudHJpZXMubGVuZ3RoPT09MClyZXR1cm4gYygyMik7bGV0W3Qscl09YXdhaXQgcmUudW5zZWFsV2l0aFBhc3NrZXkoZS5lbnRyaWVzLm1hcCgocyk9Pih7c2VhbGVkTWFzdGVyOnMuc2VhbGVkTWFzdGVyLGNyZWRJZDpzLmNyZWRJZH0pKSx7Li4udGhpcy4jbixzYWx0OmUuc2FsdH0pO2lmKHIhPT0wKXJldHVybiBjKHIpO3RoaXMuI2U9dC5lbmNsYXZlO2xldCBuPVRhKGUsdC5jcmVkSWQpO2lmKG4hPT12b2lkIDApdGhpcy4jdD1uLGF3YWl0IHRoaXMuI3Ioa2UobikpO3JldHVybiBwKHQuZW5jbGF2ZSl9YXN5bmMgcmVuYW1lKGUsdCl7bGV0IHI9dGhpcy4jdDtpZihyPT09dm9pZCAwKXJldHVybiBjKDIyKTtsZXQgbj1yLmVudHJpZXMuZmluZEluZGV4KChkKT0+WChkLmNyZWRJZCxlKSk7aWYobjwwKXJldHVybiBjKDEzKTtsZXQgcz1yLmVudHJpZXMubWFwKFB0KSxpPXNbbl07aWYoaT09PXZvaWQgMClyZXR1cm4gYygxMyk7bGV0IG89U2kodCk7c1tuXT17Li4uaSxuaWNrOm99O2xldCBhPXtzYWx0OnIuc2FsdC5zbGljZSgpLGVudHJpZXM6c307cmV0dXJuIHRoaXMuI3Q9YSxhd2FpdCB0aGlzLiNyKGtlKGEpKSxwKHZvaWQgMCl9YXN5bmMgcmVtb3ZlKGUpe2xldCB0PXRoaXMuI3Q7aWYodD09PXZvaWQgMClyZXR1cm4gYygyMik7bGV0IHI9dC5lbnRyaWVzLmZpbHRlcigocyk9PiFYKHMuY3JlZElkLGUpKTtpZihyLmxlbmd0aD09PXQuZW50cmllcy5sZW5ndGgpcmV0dXJuIGMoMTMpO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gdGhpcy4jdD12b2lkIDAsYXdhaXQgdGhpcy4jcih2b2lkIDApLHAodm9pZCAwKTtsZXQgbj17c2FsdDp0LnNhbHQuc2xpY2UoKSxlbnRyaWVzOnIubWFwKFB0KX07cmV0dXJuIHRoaXMuI3Q9bixhd2FpdCB0aGlzLiNyKGtlKG4pKSxwKHZvaWQgMCl9YXN5bmMgd2lwZSgpe3RoaXMuI2U9dm9pZCAwLHRoaXMuI3Q9dm9pZCAwLGF3YWl0IHRoaXMuI3Iodm9pZCAwKX19ZnVuY3Rpb24gU2koZSl7aWYoZT09PXZvaWQgMClyZXR1cm47bGV0IHQ9ZS50cmltKCk7cmV0dXJuIHQ9PT0iIj92b2lkIDA6dH1mdW5jdGlvbiBrYSgpe2lmKHR5cGVvZiBuYXZpZ2F0b3I+InUiKXJldHVybjtyZXR1cm4gaWkobmF2aWdhdG9yLnVzZXJBZ2VudCl9ZnVuY3Rpb24gUHQoZSl7bGV0W3Qscl09TGUoZS5zZWFsZWRNYXN0ZXIuc2xpY2UoKSk7cmV0dXJue3R5cGU6InByZiIsc2VhbGVkTWFzdGVyOnI9PT0wJiZ0IT09dm9pZCAwP3Q6ZS5zZWFsZWRNYXN0ZXIsY3JlZElkOmUuY3JlZElkLnNsaWNlKCksdGFnOmUudGFnLnNsaWNlKCksdXNlcklkOmUudXNlcklkPT09dm9pZCAwP3ZvaWQgMDplLnVzZXJJZC5zbGljZSgpLG5pY2s6ZS5uaWNrLGVucm9sbGVkQXQ6ZS5lbnJvbGxlZEF0LGxhc3RVc2VkQXQ6ZS5sYXN0VXNlZEF0LGF0dGFjaG1lbnQ6ZS5hdHRhY2htZW50LHRyYW5zcG9ydHM6ZS50cmFuc3BvcnRzPT09dm9pZCAwP3ZvaWQgMDpbLi4uZS50cmFuc3BvcnRzXSxhYWd1aWQ6ZS5hYWd1aWQ9PT12b2lkIDA/dm9pZCAwOmUuYWFndWlkLnNsaWNlKCksZW5yb2xsZWRPczplLmVucm9sbGVkT3N9fWZ1bmN0aW9uIGtlKGUpe3JldHVybntzYWx0OmUuc2FsdC5zbGljZSgpLGVudHJpZXM6ZS5lbnRyaWVzLm1hcChQdCl9fWZ1bmN0aW9uIGJpKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PT0ib2JqZWN0In1mdW5jdGlvbiBCYShlKXtpZighYmkoZSl8fGUudHlwZSE9PSJwcmYiKXJldHVybjtpZighKGUuc2VhbGVkTWFzdGVyIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEoZS5jcmVkSWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShlLnRhZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpfHxlLnRhZy5ieXRlTGVuZ3RoIT09MzJ8fHR5cGVvZiBlLmVucm9sbGVkQXQhPT0ibnVtYmVyInx8IU51bWJlci5pc0Zpbml0ZShlLmVucm9sbGVkQXQpKXJldHVybjtsZXRbdCxyXT1MZShlLnNlYWxlZE1hc3Rlcik7aWYociE9PTB8fHQ9PT12b2lkIDApcmV0dXJuO2xldCBuPWUuYXR0YWNobWVudD09PSJwbGF0Zm9ybSJ8fGUuYXR0YWNobWVudD09PSJjcm9zcy1wbGF0Zm9ybSI/ZS5hdHRhY2htZW50OnZvaWQgMCxzPWUuZW5yb2xsZWRPcyxpPXM9PT0iaW9zInx8cz09PSJtYWNvcyJ8fHM9PT0iYW5kcm9pZCJ8fHM9PT0id2luZG93cyJ8fHM9PT0ibGludXgifHxzPT09Im90aGVyIj9zOnZvaWQgMCxvPUFycmF5LmlzQXJyYXkoZS50cmFuc3BvcnRzKT9lLnRyYW5zcG9ydHMuZmlsdGVyKChhKT0+dHlwZW9mIGE9PT0ic3RyaW5nIik6dm9pZCAwO3JldHVybnt0eXBlOiJwcmYiLHNlYWxlZE1hc3Rlcjp0LGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHRhZzplLnRhZy5zbGljZSgpLHVzZXJJZDplLnVzZXJJZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/ZS51c2VySWQuc2xpY2UoKTp2b2lkIDAsbmljazp0eXBlb2YgZS5uaWNrPT09InN0cmluZyI/ZS5uaWNrOnZvaWQgMCxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OnR5cGVvZiBlLmxhc3RVc2VkQXQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKGUubGFzdFVzZWRBdCk/ZS5sYXN0VXNlZEF0OnZvaWQgMCxhdHRhY2htZW50Om4sdHJhbnNwb3J0czpvPT09dm9pZCAwfHxvLmxlbmd0aD09PTA/dm9pZCAwOm8sYWFndWlkOmUuYWFndWlkIGluc3RhbmNlb2YgVWludDhBcnJheT9lLmFhZ3VpZC5zbGljZSgpOnZvaWQgMCxlbnJvbGxlZE9zOml9fWZ1bmN0aW9uIHdpKGUpe2lmKCFiaShlKSlyZXR1cm47aWYoIShlLnNhbHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IUFycmF5LmlzQXJyYXkoZS5lbnRyaWVzKSlyZXR1cm47bGV0IHQ9W107Zm9yKGxldCByIG9mIGUuZW50cmllcyl7bGV0IG49QmEocik7aWYobiE9PXZvaWQgMCl0LnB1c2gobil9aWYodC5sZW5ndGg9PT0wKXJldHVybjtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnR9fWZ1bmN0aW9uIHZhKGUpe3JldHVybnt0eXBlOiJwcmYiLGNyZWRJZDplLmNyZWRJZC5zbGljZSgpLHVzZXJJZDplLnVzZXJJZD09PXZvaWQgMD92b2lkIDA6ZS51c2VySWQuc2xpY2UoKSxuaWNrOmUubmljayxlbnJvbGxlZEF0OmUuZW5yb2xsZWRBdCxsYXN0VXNlZEF0OmUubGFzdFVzZWRBdCxhdHRhY2htZW50OmUuYXR0YWNobWVudCx0cmFuc3BvcnRzOmUudHJhbnNwb3J0cz09PXZvaWQgMD92b2lkIDA6Wy4uLmUudHJhbnNwb3J0c10sYWFndWlkOmUuYWFndWlkPT09dm9pZCAwP3ZvaWQgMDplLmFhZ3VpZC5zbGljZSgpLGVucm9sbGVkT3M6ZS5lbnJvbGxlZE9zfX1mdW5jdGlvbiBEYShlKXtpZihlPT09dm9pZCAwKXJldHVybltdO3JldHVybiBlLmVudHJpZXMuZmlsdGVyKCh0KT0+dC5jcmVkSWQuYnl0ZUxlbmd0aD4wKS5tYXAoKHQpPT50LmNyZWRJZC5zbGljZSgpKX1mdW5jdGlvbiBDYShlLHQpe2xldCByPWUuZW50cmllcy5tYXAoUHQpLG49ci5maW5kSW5kZXgoKHMpPT5YKHMuY3JlZElkLHQuY3JlZElkKSk7aWYobj49MCl7bGV0IHM9cltuXTtyW25dPXsuLi50LGVucm9sbGVkQXQ6cz8uZW5yb2xsZWRBdD8/dC5lbnJvbGxlZEF0LG5pY2s6dC5uaWNrPz9zPy5uaWNrfX1lbHNlIHIucHVzaCh0KTtyZXR1cm57c2FsdDplLnNhbHQuc2xpY2UoKSxlbnRyaWVzOnJ9fWZ1bmN0aW9uIFRhKGUsdCl7aWYodC5ieXRlTGVuZ3RoPT09MClyZXR1cm47bGV0IHI9ZS5lbnRyaWVzLmZpbmRJbmRleCgoaSk9PlgoaS5jcmVkSWQsdCkpO2lmKHI8MClyZXR1cm47bGV0IG49ZS5lbnRyaWVzLm1hcChQdCkscz1uW3JdO2lmKHM9PT12b2lkIDApcmV0dXJuO3JldHVybiBuW3JdPXsuLi5zLGxhc3RVc2VkQXQ6RGF0ZS5ub3coKX0se3NhbHQ6ZS5zYWx0LnNsaWNlKCksZW50cmllczpufX12YXIgSG09eXIoImZiZmMzMDA3MTU0ZTRlY2M4YzBiNmUwMjA1NTdkN2JkIiksTW09eXIoImVhOWI4ZDY2NGQwMTFkMjEzY2U0YjZiNDhjYjU3NWQ0IiksUm09eXIoIjA4OTg3MDU4Y2FkYzRiODFiNmUxMzBkZTUwZGNiZTk2IiksTG09eXIoIjJmYzA1NzlmODExMzQ3ZWFiMTE2YmI1YThkYjkyMDJhIik7ZnVuY3Rpb24geXIoZSl7bGV0IHQ9bmV3IFVpbnQ4QXJyYXkoMTYpO2ZvcihsZXQgcj0wO3I8MTY7cisrKXRbcl09TnVtYmVyLnBhcnNlSW50KGUuc2xpY2UocioyLHIqMisyKSwxNik7cmV0dXJuIHR9dmFyIEhhPSJkaXBsb21hdGljLnBpbi8iO2Z1bmN0aW9uIE1hKGUpe3JldHVybiBIYStoZShlKX1hc3luYyBmdW5jdGlvbiBJaShlLHQscil7bGV0IG49YXdhaXQgdC5kZXJpdmVJZGVudGl0eShNYShyKSwwKTtyZXR1cm4gZS5ibGFrZTMobi5wdWJsaWNLZXkpfWFzeW5jIGZ1bmN0aW9uIHhpKGUsdCl7bGV0IHI9YXdhaXQgZS5nZW4yNTZCaXRTZWN1cmVSYW5kb21TZWVkKCksbj1hd2FpdCBJaShlLHQscik7cmV0dXJue246cixoOm59fWFzeW5jIGZ1bmN0aW9uIEVpKGUsdCxyKXtsZXQgbj1hd2FpdCBJaShlLHQsci5uKTtyZXR1cm4gUmEobixyLmgpfWZ1bmN0aW9uIEFpKGUpe2lmKGU9PT12b2lkIDB8fGU9PT1udWxsfHx0eXBlb2YgZSE9PSJvYmplY3QiKXJldHVybjtsZXQgdD1lO2lmKCEodC5uIGluc3RhbmNlb2YgVWludDhBcnJheSl8fCEodC5oIGluc3RhbmNlb2YgVWludDhBcnJheSkpcmV0dXJuO2lmKHQubi5ieXRlTGVuZ3RoPDF8fHQuaC5ieXRlTGVuZ3RoPDEpcmV0dXJuO3JldHVybntuOnQubi5zbGljZSgpLGg6dC5oLnNsaWNlKCl9fWZ1bmN0aW9uIFBpKGUpe3JldHVybntuOmUubi5zbGljZSgpLGg6ZS5oLnNsaWNlKCl9fWZ1bmN0aW9uIFJhKGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2xldCByPTA7Zm9yKGxldCBuPTA7bjxlLmJ5dGVMZW5ndGg7bisrKXJ8PWVbbl1edFtuXTtyZXR1cm4gcj09PTB9dmFyIG1yPSJrZXlyaW5nIixVaT0icHJmTWV0YSIsdm49ImlkUGluIixraT0iaWRQdWIiO2NsYXNzIERueyNlO2RiOyN0O2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kYj1lLHRoaXMuI3Q9dH1hc3luYyBzYXZlKGUsdCl7cmV0dXJuIGF3YWl0IHRoaXMuI24oZSksdGhpcy4jZT1lLHRoaXMuI2V9YXN5bmMgbG9hZCgpe3JldHVybiB0aGlzLiNlfWFzeW5jIGNsZWFyU2Vzc2lvbigpe3RoaXMuI2U9dm9pZCAwfWFzeW5jIHdpcGUoKXt0aGlzLiNlPXZvaWQgMDtsZXQgZT10aGlzLmRiLnRyYW5zYWN0aW9uKGllLCJyZWFkd3JpdGUiKSx0PWUub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2Uub25jb21wbGV0ZT0oKT0+cigpLGUub25lcnJvcj0oKT0+bihlLmVycm9yKSx0LmRlbGV0ZShtciksdC5kZWxldGUoVWkpLHQuZGVsZXRlKHZuKSx0LmRlbGV0ZShraSl9KX1hc3luYyBsb2FkS2V5cmluZygpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oaWUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e2xldCBzPXQuZ2V0KG1yKTtzLm9uc3VjY2Vzcz0oKT0+e3Iod2kocy5yZXN1bHQpKX0scy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9YXN5bmMgcGVyc2lzdEtleXJpbmcoZSl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihpZSwicmVhZHdyaXRlIikscj10Lm9iamVjdFN0b3JlKGllKTtyZXR1cm4gbmV3IFByb21pc2UoKG4scyk9PntpZih0Lm9uY29tcGxldGU9KCk9Pm4oKSx0Lm9uZXJyb3I9KCk9PnModC5lcnJvciksci5kZWxldGUoVWkpLGU9PT12b2lkIDApe3IuZGVsZXRlKG1yKTtyZXR1cm59ci5wdXQoa2UoZSksbXIpfSl9YXN5bmMgaGFzS2V5cmluZygpe2xldCBlPWF3YWl0IHRoaXMubG9hZEtleXJpbmcoKTtyZXR1cm4gZSE9PXZvaWQgMCYmZS5lbnRyaWVzLmxlbmd0aD4wfWFzeW5jIG9wZW5QcmZTdG9yZShlKXtsZXQgdD1hd2FpdCB0aGlzLmxvYWRLZXlyaW5nKCk7cmV0dXJuIG5ldyBCbih7cnBJZDplLnJwSWQscnBOYW1lOmUucnBOYW1lLHVzZXJOYW1lOmUudXNlck5hbWUsa2V5cmluZzp0LHBlcnNpc3RLZXlyaW5nOihyKT0+dGhpcy5wZXJzaXN0S2V5cmluZyhyKX0pfWFzeW5jI24oZSl7YXdhaXQgdGhpcy4jaShraSk7bGV0IHQ9YXdhaXQgdGhpcy4jcygpO2lmKHQhPT12b2lkIDApe2lmKCFhd2FpdCBFaSh0aGlzLiN0LGUsdCkpdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBzZWVkIGRvZXMgbm90IG1hdGNoIHRoaXMgZGV2aWNlJ3MgaWRlbnRpdHkgKGxvY2FsIGRhdGEgd2FzIGNyZWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBtYXN0ZXIgc2VlZCkiKTtyZXR1cm59bGV0IHI9YXdhaXQgeGkodGhpcy4jdCxlKTthd2FpdCB0aGlzLiNyKHIpfSNzKCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihpZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShpZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5nZXQodm4pO3Mub25zdWNjZXNzPSgpPT5yKEFpKHMucmVzdWx0KSkscy5vbmVycm9yPSgpPT5uKHMuZXJyb3IpfSl9I3IoZSl7bGV0IHQ9UGkoZSkscj10aGlzLmRiLnRyYW5zYWN0aW9uKGllLCJyZWFkd3JpdGUiKSxuPXIub2JqZWN0U3RvcmUoaWUpO3JldHVybiBuZXcgUHJvbWlzZSgocyxpKT0+e3Iub25jb21wbGV0ZT0oKT0+cygpLHIub25lcnJvcj0oKT0+aShyLmVycm9yKSxuLnB1dCh0LHZuKX0pfSNpKGUpe2xldCB0PXRoaXMuZGIudHJhbnNhY3Rpb24oaWUsInJlYWR3cml0ZSIpLHI9dC5vYmplY3RTdG9yZShpZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57dC5vbmNvbXBsZXRlPSgpPT5uKCksdC5vbmVycm9yPSgpPT5zKHQuZXJyb3IpLHIuZGVsZXRlKGUpfSl9fWNsYXNzIENue2RiO2NvbnN0cnVjdG9yKGUpe3RoaXMuZGI9ZX1hc3luYyBlbnEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGxlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUobGUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9aGUoYSk7cy5wdXQoe2hvc3Q6ZSxoYXNoOmR9KX19KX1hc3luYyBkZXEoZSx0KXtsZXQgcj1bLi4udF07aWYoci5sZW5ndGg9PT0wKXJldHVybjtsZXQgbj10aGlzLmRiLnRyYW5zYWN0aW9uKGxlLCJyZWFkd3JpdGUiKSxzPW4ub2JqZWN0U3RvcmUobGUpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e24ub25jb21wbGV0ZT0oKT0+aSgpLG4ub25lcnJvcj0oKT0+byhuLmVycm9yKTtmb3IobGV0IGEgb2Ygcil7bGV0IGQ9aGUoYSk7cy5kZWxldGUoW2UsZF0pfX0pfWFzeW5jIGxpc3QoZSl7bGV0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShsZSk7cmV0dXJuIG5ldyBQcm9taXNlKChuLHMpPT57bGV0IGk9ci5nZXRBbGwoKTtpLm9uc3VjY2Vzcz0oKT0+e2xldCBhPWkucmVzdWx0LmZpbHRlcigoZCk9PmQuaG9zdD09PWUpLm1hcCgoZCk9PmQuaGFzaCk7bihhLm1hcCgoZCk9PmpuKGQpKSl9LGkub25lcnJvcj0oKT0+cyhpLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IHQ9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShsZSk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG4pPT57bGV0IHM9dC5jb3VudCgpO3Mub25zdWNjZXNzPSgpPT5yKHMucmVzdWx0KSxzLm9uZXJyb3I9KCk9Pm4ocy5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0IGU9dGhpcy5kYi50cmFuc2FjdGlvbihsZSwicmVhZHdyaXRlIiksdD1lLm9iamVjdFN0b3JlKGxlKTtyZXR1cm4gbmV3IFByb21pc2UoKHIsbik9PntlLm9uY29tcGxldGU9KCk9PnIoKSxlLm9uZXJyb3I9KCk9Pm4oZS5lcnJvciksdC5jbGVhcigpfSl9fXZhciBpZT0ic2VlZE1ldGEiLHNlPSJob3N0cyIsbGU9InVwbG9hZFF1ZXVlIix1ZT0iZG93bmxvYWRRdWV1ZSIsVz0ibWVzc2FnZXMiLEF0PSJhcGxkIixCaT0zLHZpPSJkaXBsb21hdGljLXN0b3JlLWRiIjtjbGFzcyBEaXtzZWVkO2hvc3RzO3VwbG9hZHM7ZG93bmxvYWRzO21lc3NhZ2VzO2RiO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kYj1lLHRoaXMuc2VlZD1uZXcgRG4oZSx0KSx0aGlzLmhvc3RzPW5ldyBVbihlKSx0aGlzLnVwbG9hZHM9bmV3IENuKGUpLHRoaXMuZG93bmxvYWRzPW5ldyBQbihlKSx0aGlzLm1lc3NhZ2VzPW5ldyBrbihlLHQpfWFzeW5jIHdpcGUoKXthd2FpdCB0aGlzLmhvc3RzLndpcGUoKSxhd2FpdCB0aGlzLnVwbG9hZHMud2lwZSgpLGF3YWl0IHRoaXMuZG93bmxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLm1lc3NhZ2VzLndpcGUoKX19YXN5bmMgZnVuY3Rpb24gTGEoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgcj1pbmRleGVkREIub3Blbih2aSxCaSk7ci5vbnVwZ3JhZGVuZWVkZWQ9KCk9PntsZXR7cmVzdWx0Om4sdHJhbnNhY3Rpb246c309cjtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGllKSluLmNyZWF0ZU9iamVjdFN0b3JlKGllKTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHNlKSluLmNyZWF0ZU9iamVjdFN0b3JlKHNlLHtrZXlQYXRoOiJsYWJlbCJ9KTtpZighbi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGxlKSluLmNyZWF0ZU9iamVjdFN0b3JlKGxlLHtrZXlQYXRoOlsiaG9zdCIsImhhc2giXX0pO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModWUpKW4uY3JlYXRlT2JqZWN0U3RvcmUodWUpO2xldCBpO2lmKCFuLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoVykpaT1uLmNyZWF0ZU9iamVjdFN0b3JlKFcpO2Vsc2V7aWYoIXMpdGhyb3cgRXJyb3IoIm1pc3NpbmcgdXBncmFkZSB0cmFuc2FjdGlvbiBmb3IgbWVzc2FnZXMgc3RvcmUiKTtpPXMub2JqZWN0U3RvcmUoVyl9aWYoIWkuaW5kZXhOYW1lcy5jb250YWlucyhBdCkpaS5jcmVhdGVJbmRleChBdCwiYXBsZCIse3VuaXF1ZTohMX0pfSxyLm9uYmxvY2tlZD0oKT0+e2NvbnNvbGUud2FybihgW0RJUExPTUFUSUNdIHByb3RvY29sIHN0b3JlIElEQiB1cGdyYWRlIGJsb2NrZWQgKCR7dml9IOKGkiB2JHtCaX0pOyB3YWl0aW5nIGZvciBvdGhlciBjb25uZWN0aW9ucyB0byBjbG9zZWApfSxyLm9uc3VjY2Vzcz0oKT0+e2xldCBuPXIucmVzdWx0O24ub252ZXJzaW9uY2hhbmdlPSgpPT57bi5jbG9zZSgpfSxlKG4pfSxyLm9uZXJyb3I9KCk9PnQoci5lcnJvcj8/RXJyb3IoInByb3RvY29sIHN0b3JlIEluZGV4ZWREQiBvcGVuIGZhaWxlZCIpKX0pfWFzeW5jIGZ1bmN0aW9uIENpKGUpe2xldCB0PWF3YWl0IExhKCk7aWYodHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zdG9yYWdlPy5wZXJzaXN0KXRyeXthd2FpdCBQcm9taXNlLnJhY2UoW25hdmlnYXRvci5zdG9yYWdlLnBlcnNpc3QoKSxuZXcgUHJvbWlzZSgocik9PntzZXRUaW1lb3V0KCgpPT5yKCExKSwyMDAwKX0pXSl9Y2F0Y2h7fXJldHVybiBuZXcgRGkodCxlKX1jbGFzcyBUbntjbGllbnQ7ZW50REI7cG9zdDt3aGVuUmVhZHk7cmVzb2x2ZVJlYWR5O3JlamVjdFJlYWR5O2NvbnN0cnVjdG9yKGUpe3RoaXMucG9zdD1lLHRoaXMud2hlblJlYWR5PW5ldyBQcm9taXNlKCh0LHIpPT57dGhpcy5yZXNvbHZlUmVhZHk9dCx0aGlzLnJlamVjdFJlYWR5PXJ9KX1hc3luYyBpbml0KCl7dHJ5e2xldCBlPWF3YWl0IENpKHRyKSx0PWF3YWl0IHlzKHtjYWNoZTohMX0pLHI9bmV3IE50KHQuYXBwbHksKCk9PnQuY2xlYXIoKSwoaSk9PntpZihpLmxlbmd0aDwxKXJldHVybjt0aGlzLnBvc3Qoe2tpbmQ6ImRpcnR5IixlaWRzOmkubWFwKChvKT0+by5zbGljZSgpKX0pfSksbj1yLmNsZWFyO3IuY2xlYXI9YXN5bmMoKT0+e2xldCBpPWF3YWl0IG4oKTtpZihpPT09MCl0aGlzLnBvc3Qoe2tpbmQ6IndpcGVkIn0pO3JldHVybiBpfTtsZXQgcz1uZXcgUXIobmV3IFByLHIsZSxucyx0cik7dGhpcy5jbGllbnQ9cyx0aGlzLmVudERCPXQscy5jbGllbnRTdGF0ZS5saXN0ZW4oKCk9Pnt0aGlzLmVtaXRDbGllbnRTdGF0ZSgpfSkscy54ZmVyU3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0WGZlclN0YXRlKCl9KSxhd2FpdCB0aGlzLmVtaXRYZmVyU3RhdGUoKSx0aGlzLnBvc3Qoe2tpbmQ6InJlYWR5In0pLHRoaXMubWFya1JlYWR5KCl9Y2F0Y2goZSl7bGV0IHQ9ZSBpbnN0YW5jZW9mIEVycm9yP2U6RXJyb3IoU3RyaW5nKGUpKTt0aHJvdyB0aGlzLnBvc3Qoe2tpbmQ6ImluaXRFcnJvciIsbWVzc2FnZTp0Lm1lc3NhZ2V9KSx0aGlzLmZhaWxSZWFkeSh0KSx0fX1tYXJrUmVhZHkoKXtsZXQgZT10aGlzLnJlc29sdmVSZWFkeTtpZih0aGlzLnJlc29sdmVSZWFkeT12b2lkIDAsdGhpcy5yZWplY3RSZWFkeT12b2lkIDAsZSllKCl9ZmFpbFJlYWR5KGUpe2xldCB0PXRoaXMucmVqZWN0UmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLHQpdChlKX1yZXF1aXJlQ2xpZW50KCl7aWYoIXRoaXMuY2xpZW50KXRocm93IEVycm9yKCJXb3JrZXJSdW50aW1lIG5vdCBpbml0aWFsaXplZCIpO3JldHVybiB0aGlzLmNsaWVudH1hc3luYyBlbWl0Q2xpZW50U3RhdGUoKXtsZXQgZT10aGlzLmNsaWVudDtpZighZSlyZXR1cm47bGV0IHQ9YXdhaXQgZS5jbGllbnRTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6ImNsaWVudFN0YXRlIixjb25uZWN0ZWQ6dC5jb25uZWN0ZWR9KX1hc3luYyBlbWl0WGZlclN0YXRlKCl7bGV0IGU9dGhpcy5jbGllbnQ7aWYoIWUpcmV0dXJuO2xldCB0PWF3YWl0IGUueGZlclN0YXRlLmdldCgpO3RoaXMucG9zdCh7a2luZDoieGZlclN0YXRlIixzdGF0ZTp0fSl9aG9zdEZyb21TZXJpYWxpemVkKGUpe3JldHVybntoYW5kbGU6bmV3IFVSTChlLmhhbmRsZSksbGFiZWw6ZS5sYWJlbCxpZHg6ZS5pZHh9fWFzeW5jIGhhbmRsZShlKXthd2FpdCB0aGlzLndoZW5SZWFkeTtsZXQgdD10aGlzLnJlcXVpcmVDbGllbnQoKTtzd2l0Y2goZS5vcCl7Y2FzZSJwaW5nIjpyZXR1cm4icG9uZyI7Y2FzZSJzZXRTZWVkIjp7bGV0W3Isbl09cmUuZnJvbUJ5dGVzKGUuc2VlZCk7aWYoZS5zZWVkLmZpbGwoMCksbiE9PTB8fHI9PT12b2lkIDApdGhyb3cgbmV3IHBlKG4pO2F3YWl0IHQuc2V0U2VlZChyLHtwZXJzaXN0OmUucGVyc2lzdH0pO3JldHVybn1jYXNlImxpbmsiOnthd2FpdCB0LmxpbmsodGhpcy5ob3N0RnJvbVNlcmlhbGl6ZWQoZS5ob3N0KSxlLmNvbm5lY3Q/PyEwKTtyZXR1cm59Y2FzZSJ1bmxpbmsiOnthd2FpdCB0LnVubGluayhlLmxhYmVsKTtyZXR1cm59Y2FzZSJjb25uZWN0Ijp7YXdhaXQgdC5jb25uZWN0KGUubGlzdGVuPz8hMCxlLnN5bmM/PyEwKTtyZXR1cm59Y2FzZSJkaXNjb25uZWN0Ijp7YXdhaXQgdC5kaXNjb25uZWN0KCk7cmV0dXJufWNhc2Uic3luYyI6cmV0dXJuIGF3YWl0IHQuc3luYygpO2Nhc2UicmVidWlsZCI6cmV0dXJuIGF3YWl0IHQucmVidWlsZCh7Y2hlY2tIb3N0OmUuY2hlY2tIb3N0Pz8hMH0pO2Nhc2UicmVjb25jaWxlIjp7bGV0W3Isbl09YXdhaXQgdC5yZWNvbmNpbGUoZS5ob3N0TGFiZWwse3B1bGw6ZS5wdWxsLHB1c2g6ZS5wdXNoLHN5bmM6ZS5zeW5jfSk7aWYobiE9PTApdGhyb3cgbmV3IHBlKG4pO2lmKCFyKXRocm93IG5ldyBwZSgxMik7cmV0dXJuIHJ9Y2FzZSJtc2djaGVjayI6cmV0dXJuIGF3YWl0IHQubXNnY2hlY2soKTtjYXNlImVudGNoZWNrIjp7bGV0IHI9dGhpcy5lbnREQjtpZighcil0aHJvdyBuZXcgcGUoMTIpO2xldFtuLHNdPWF3YWl0IHIuY2hlY2tzdW0odHIpO2lmKHMhPT0wKXRocm93IG5ldyBwZShzKTtpZighbil0aHJvdyBuZXcgcGUoMTIpO3JldHVybiBufWNhc2Uid2lwZSI6e2F3YWl0IHQud2lwZSh7bXNnczplLm1zZ3MsZW50czplLmVudHMsbWV0YTplLm1ldGEsc2VlZDplLnNlZWR9KTtyZXR1cm59Y2FzZSJpbXBvcnQiOntsZXQgcj1lLmJ5dGVzLnNsaWNlKCksbj1uZXcgQmxvYihbcl0pLHM9bmV3IEZpbGUoW25dLCJpbXBvcnQuZGlwIik7cmV0dXJuIGF3YWl0IHQuaW1wb3J0KHMpfWNhc2UiZXhwb3J0Ijp7bGV0W3Isbl09YXdhaXQgdC5leHBvcnRCeXRlcygpO2lmKG4hPT0wKXRocm93IG5ldyBwZShuKTtpZighcil0aHJvdyBuZXcgcGUoMTIpO3JldHVybiByfWNhc2UiZ2V0WGZlclN0YXRlIjpyZXR1cm4gYXdhaXQgdC54ZmVyU3RhdGUuZ2V0KCk7ZGVmYXVsdDp7bGV0IHI9ZTt0aHJvdyBFcnJvcigidW5rbm93biB3b3JrZXIgY29tbWFuZCIpfX19fWNsYXNzIHBlIGV4dGVuZHMgRXJyb3J7c3RhdHVzO2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBXb3JrZXJTdGF0dXNFcnJvcjogJHtVW2VdfWApO3RoaXMuc3RhdHVzPWU7dGhpcy5uYW1lPSJXb3JrZXJTdGF0dXNFcnJvciJ9fWZ1bmN0aW9uIGdyKGUsdCl7cmV0dXJue2tpbmQ6InJlcGx5IixpZDplLG9rOiEwLHJlc3VsdDp0fX1mdW5jdGlvbiBIbihlLHQpe3JldHVybntraW5kOiJyZXBseSIsaWQ6ZSxvazohMSxzdGF0dXM6dH19dmFyIEhlPWdsb2JhbFRoaXMsVGk9bmV3IFRuKChlLHQpPT57aWYodCYmdC5sZW5ndGg+MClIZS5wb3N0TWVzc2FnZShlLHQpO2Vsc2UgSGUucG9zdE1lc3NhZ2UoZSl9KTtIZS5vbm1lc3NhZ2U9KGUpPT57bGV0IHQ9ZS5kYXRhO2lmKCFLbih0KSlyZXR1cm47S2EodCl9O2FzeW5jIGZ1bmN0aW9uIEthKGUpe3RyeXtsZXQgdD1hd2FpdCBUaS5oYW5kbGUoZSk7aWYoKGUub3A9PT0iZXhwb3J0Inx8ZS5vcD09PSJtc2djaGVjayJ8fGUub3A9PT0iZW50Y2hlY2siKSYmdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCByPXQuc2xpY2UoKTtIZS5wb3N0TWVzc2FnZShncihlLmlkLHIpLFtyLmJ1ZmZlcl0pO3JldHVybn1pZihlLm9wPT09InJlY29uY2lsZSImJnQmJnR5cGVvZiB0PT09Im9iamVjdCImJiJtc2djaGVjayJpbiB0JiZ0Lm1zZ2NoZWNrIGluc3RhbmNlb2YgVWludDhBcnJheSl7bGV0IHI9dC5tc2djaGVjay5zbGljZSgpLG49ey4uLnQsbXNnY2hlY2s6cn07SGUucG9zdE1lc3NhZ2UoZ3IoZS5pZCxuKSxbci5idWZmZXJdKTtyZXR1cm59SGUucG9zdE1lc3NhZ2UoZ3IoZS5pZCx0KSl9Y2F0Y2godCl7aWYodCBpbnN0YW5jZW9mIHBlKXtIZS5wb3N0TWVzc2FnZShIbihlLmlkLHQuc3RhdHVzKSk7cmV0dXJufWNvbnNvbGUuZXJyb3IoIndvcmtlciBjb21tYW5kIGZhaWxlZCIsdCksSGUucG9zdE1lc3NhZ2UoSG4oZS5pZCwxMikpfX1UaS5pbml0KCkuY2F0Y2goKGUpPT57Y29uc29sZS5lcnJvcigid29ya2VyIGluaXQgZmFpbGVkIixlKX0pOwo=";var Yn=typeof globalThis.Worker==="function"?globalThis.Worker:void 0,As=Yn===void 0?void 0:Yn.prototype.postMessage,Hn;function El(){if(typeof Cn!=="string"||Cn.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(Cn)}function Fl(){if(Hn!==void 0)return Hn;let t=new Blob([El()],{type:"text/javascript"});return Hn=URL.createObjectURL(t),Hn}function Co(){if(Yn===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Yn(Fl(),{type:"module"})}function Ho(t,e,n){if(As===void 0)throw Error("[DIPLOMATIC] Worker API unavailable; cannot post to sync worker");if(n!==void 0&&n.length>0)As.call(t,e,{transfer:n});else As.call(t,e)}var vl=new TextEncoder().encode("diplomatic.bind.v1"),qs=new TextEncoder().encode("diplomatic.bindtag.v1"),Ql=32,Dl=32,Ol=16,jl=32,rt=new Qt;function Al(t){return t.map((e)=>({handle:e.handle,label:e.label,idx:e.idx??0}))}function Yo(t){if(t.byteLength===0||t.every((l)=>l===0))return c(22);if(t.byteLength<yt+1)return c(14);let e=t.subarray(0,yt);if(e.every((l)=>l===0))return c(22);let n=new M(t.subarray(yt)),[s,i]=n.readStruct(zs);if(i!==0)return c(i);if(s===void 0)return c(14);if(!n.done())return c(14);let[o,r]=tt.fromBytes(e);if(r!==0)return c(r);if(o===void 0)return c(12);return m({enclave:o,hosts:s.hosts.map((l)=>({...l}))})}async function ko(t,e,n){let s=jt();if(s!==0)return s;let[i,o]=Ot(n);if(o!==0)return o;if(i===void 0)return 9;await gn();let r=new Uint8Array(e.byteLength);r.set(e);let l={largeBlob:{write:r.buffer}},a={publicKey:{challenge:Tt(Dt),rpId:i,allowCredentials:[{type:It,id:Bt(t)}],userVerification:"required",extensions:l,...n?.hints!==void 0?{hints:n.hints}:{}}},d;try{try{d=await navigator.credentials.get(a)}catch(y){if(!Wn(y))throw y;Xe(),d=await navigator.credentials.get(a)}}catch(y){return Jt(y),30}finally{r.fill(0)}let[u,p]=At(d);if(p!==0)return p;if(u===void 0)return 27;if(u.getClientExtensionResults().largeBlob?.written!==!0)return 30;return 0}var _s=32;function ql(t){if(t===void 0)return[];if(t instanceof Uint8Array)return[t];return t.filter((e)=>e.byteLength>0)}function _l(t){if(!(t instanceof Error))return!1;return t.name==="NotSupportedError"||t.name==="TypeError"}function Po(t){if(t===void 0)return;let e=Sn(t);if(e.byteLength<_s){e.fill(0);return}if(e.byteLength===_s)return e;let n=e.slice(0,_s);return e.fill(0),n}async function $l(t){let e=jt();if(e!==0)return c(e);let[n,s]=Ot(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.userName??Je,o=t?.displayName??i,r=Tt(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:Tt(Dt),rp:{id:n,name:t?.rpName??In},user:{id:r,name:i,displayName:o},pubKeyCredParams:Vn,authenticatorSelection:a,...t?.hints!==void 0?{hints:t.hints}:{},...t?.excludeCredentials!==void 0&&t.excludeCredentials.length>0?{excludeCredentials:t.excludeCredentials.map((X)=>({type:It,id:Bt(X)}))}:{}},u=t?.salt!==void 0?Bt(t.salt):void 0,p=(X)=>Kn({publicKey:{...d,extensions:X&&u!==void 0?{prf:{eval:{first:u}}}:{prf:{}}}}),h;try{h=await p(u!==void 0)}catch(X){if(u===void 0||!_l(X))return Jt(X),c(30);try{h=await p(!1)}catch(S){return Jt(S),c(30)}}let[y,Z]=At(h);if(Z!==0)return c(Z);if(y===void 0)return c(27);let b=y.getClientExtensionResults(),G=Po(b.prf?.results?.first),V=b.prf?.enabled===!0||G!==void 0;if(l&&G!==void 0)G.fill(0);return m({credId:new Uint8Array(y.rawId),userId:new Uint8Array(r),prfEnabled:V,prf:l?void 0:G,attachment:Ds(y.authenticatorAttachment),transports:Os(y),aaguid:xo(y)})}async function Lo(t){let e=jt();if(e!==0)return c(e);let[n,s]=Ot(t);if(s!==0)return c(s);if(n===void 0)return c(9);let i=t?.salt??Tn,o=Bt(i),r={challenge:Tt(Dt),rpId:n,userVerification:"preferred",extensions:{prf:{eval:{first:o}}}};if(t?.hints!==void 0)r.hints=t.hints;let l=ql(t?.credId);if(l.length>0)r.allowCredentials=l.map((y)=>({type:It,id:Bt(y)}));let a;try{a=await xn({publicKey:r})}catch(y){return Jt(y),c(30)}let[d,u]=At(a);if(u!==0)return c(u);if(d===void 0)return c(27);let p=d.getClientExtensionResults().prf?.results;if(p?.first===void 0)return c(7);let h=Po(p.first);if(h===void 0)return c(27);return m({prf:h,credId:new Uint8Array(d.rawId),attachment:Ds(d.authenticatorAttachment),transports:Os(d)})}function $s(t){if(t.byteLength!==yt)return c(10);return[t,0]}class tt{#t;constructor(t){this.#t=t}static async fromRandom(t){if(t.byteLength<jl)return c(10);let e=await rt.gen256BitSecureRandomSeed(),n=Zt(e,t);try{let s=await rt.blake3(n),[i,o]=$s(s);if(o!==0)return c(o);if(i===void 0)return c(12);return m(new tt(i))}finally{e.fill(0),n.fill(0),t.fill(0)}}static fromBytes(t){let[e,n]=$s(t);if(n!==0)return c(n);if(e===void 0)return c(10);let[s,i]=$s(e.slice());if(i!==0)return c(i);if(s===void 0)return c(10);return m(new tt(s))}async sealWithPasskey(t){let e=t?.salt??Tn,n=t?.credId,s=n,i=t?.createCredIfNeeded===!0&&(n===void 0||!(n instanceof Uint8Array)&&n.length===0),o,r;if(i){let[u,p]=await $l({rpId:t?.rpId,rpName:t?.rpName,userName:t?.userName??Je,displayName:t?.displayName,authenticatorAttachment:t?.authenticatorAttachment,hints:t?.hints,excludeCredentials:t?.excludeCredentials,salt:e});if(p!==0)return c(p);if(u===void 0)return c(30);if(!u.prfEnabled)return c(30);s=u.credId,o=u,r=u.prf}let l=async(u,p,h,y)=>{try{let[Z,b]=await this.#s(u);if(b!==0)return c(b);if(Z===void 0)return c(12);return m({sealedMaster:Z,salt:e.slice(),credId:p.slice(),userId:o?.userId===void 0?void 0:o.userId.slice(),attachment:h??o?.attachment,transports:y??o?.transports,aaguid:o?.aaguid===void 0?void 0:o.aaguid.slice()})}finally{u.fill(0)}};if(r!==void 0&&o!==void 0)return l(r,o.credId,o.attachment,o.transports);let[a,d]=await Lo({rpId:t?.rpId,rpName:t?.rpName,credId:s,salt:e,hints:t?.hints});if(d!==0)return c(d);if(a===void 0)return c(7);return l(a.prf,a.credId,a.attachment,a.transports)}async bind(t,e){if(e!==void 0){for(let o of e)if(!await this.#n(o.credId,o.tag))return c(10)}let[n,s]=await this.sealWithPasskey(t);if(s!==0)return c(s);if(n===void 0)return c(12);let i=await this.#e(n.credId);return m({...n,tag:i})}static async unsealWithPasskey(t,e){if(t.length===0)return c(22);let n=[];for(let l of t)if(l.credId.byteLength>0)n.push(l.credId);let[s,i]=await Lo({rpId:e.rpId,rpName:e.rpName,hints:e.hints,credId:n.length>0?n:void 0,salt:e.salt});if(i!==0)return c(i);if(s===void 0)return c(7);let o=t.find((l)=>B(l.credId,s.credId)),r=o===void 0?t:[o,...t.filter((l)=>l!==o)];try{for(let l of r){let[a]=await tt.#i(l.sealedMaster,s.prf);if(a!==void 0)return m({enclave:a,credId:s.credId.slice()})}return c(20)}finally{s.prf.fill(0)}}async sealWithIkm(t){try{return await this.#s(t)}finally{t.fill(0)}}static async unsealWithIkm(t,e){try{return await tt.#i(t,e)}finally{e.fill(0)}}async persistToLargeBlob(t=[],e){let n=e?.credId;if(n===void 0){let[o,r]=await Ro(e);if(r!==0)return c(r);if(o===void 0)return c(30);n=o}let[s,i]=this.#o(t);if(i!==0)return c(i);if(s===void 0)return c(12);try{let o=await ko(n,s,e);if(o!==0)return c(o);return m(n)}finally{s.fill(0)}}static async fromLargeBlob(t){let[e,n]=await To(t?.credId,t);if(n!==0)return c(n);if(e===void 0)return c(7);try{let[s,i]=Yo(e.blob);if(i!==0)return c(i);if(s===void 0)return c(12);return m({...s,credId:e.credId})}finally{e.blob.fill(0)}}static async clearLargeBlob(t,e){return ko(t,new Uint8Array(yt),e)}static fromPairPlain(t){return Yo(t)}static pairRequest(){return Be.create()}async pairAccept(t,e){let n;try{n=await rt.genX25519()}catch{return c(29)}try{let[s,i]=await Fs(n.priv,t,t,n.pub);if(i!==0)return c(i);if(s===void 0)return c(12);try{let[o,r]=this.#o(e);if(r!==0)return c(r);if(o===void 0)return c(12);try{let l=await rt.encryptXSalsa20Poly1305Combined(o,s);return Es(Zt(n.pub,l))}catch{return c(12)}finally{o.fill(0)}}finally{s.fill(0)}}finally{n.priv.fill(0)}}spawnSyncWorker(t){let e=Co(),n=this.#t.slice();return Ho(e,{id:t.id,op:"setSeed",seed:n,persist:t.persist},[n.buffer]),e}deriveCipher(t,e){let n=t.slice(),s=(r)=>this.#c(n,r),i=(r)=>this.#a(n,r);return{encrypt:Object.freeze({encrypt:s}),decrypt:Object.freeze({decrypt:i}),both:Object.freeze({encrypt:s,decrypt:i})}[e]}async deriveIdentity(t,e=0){let n=t,s=e,i=await this.#l(n,s),o=i.publicKey;return i.privateKey.fill(0),Object.freeze({publicKey:o,sign:(r)=>this.#u(n,s,r),kdmFor:(r)=>this.#p(n,s,r)})}async#e(t){let e=new Uint8Array(this.#t.byteLength+qs.byteLength+t.byteLength);e.set(this.#t,0),e.set(qs,this.#t.byteLength),e.set(t,this.#t.byteLength+qs.byteLength);try{return await rt.blake3(e)}finally{e.fill(0)}}async#n(t,e){if(e.byteLength!==Ql)return!1;let n=await this.#e(t);try{if(n.byteLength!==e.byteLength)return!1;let s=0;for(let i=0;i<n.byteLength;i++){let o=n[i],r=e[i];if(o===void 0||r===void 0)return!1;s|=o^r}return s===0}finally{n.fill(0)}}async#s(t){let[e,n]=await Mo(rt,t);if(n!==0)return c(n);if(e===void 0)return c(12);try{let s=await rt.encryptXSalsa20Poly1305Combined(this.#t,e);return Pt(s)}catch{return c(12)}finally{e.fill(0)}}static async#i(t,e){let[,n]=Pt(t);if(n!==0)return c(n);let[s,i]=await Mo(rt,e);if(i!==0)return c(i);if(s===void 0)return c(12);let o;try{try{o=await rt.decryptXSalsa20Poly1305Combined(t,s)}catch{return c(20)}return tt.fromBytes(o)}finally{s.fill(0),o?.fill(0)}}#o(t){let e=new w,n=e.writeStruct(zs,{hosts:Al(t)});if(n!==0)return c(n);let s=e.result(),i=new Uint8Array(yt+s.byteLength);return i.set(this.#t,0),i.set(s,yt),[i,0]}async#c(t,e){let n=await this.#r(t);try{return await rt.encryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#a(t,e){let n=await this.#r(t);try{return await rt.decryptXSalsa20Poly1305Combined(e,n)}finally{n.fill(0)}}async#r(t){let e=new Uint8Array(this.#t.byteLength+t.byteLength);e.set(this.#t,0),e.set(t,this.#t.byteLength);try{return await rt.blake3(e)}finally{e.fill(0)}}async#d(t,e){let n=new TextEncoder().encode(t),s=new Uint8Array(8);return new DataView(s.buffer).setBigUint64(0,BigInt(e),!1),await this.#r(Zt(n,s))}async#l(t,e){let n=await this.#d(t,e);try{return await rt.deriveEd25519KeyPair(n)}finally{n.fill(0)}}async#u(t,e,n){let s=await this.#l(t,e);try{return await rt.signEd25519(n,s.privateKey)}finally{s.privateKey.fill(0)}}async#p(t,e,n){let s=await this.#l(t,e),i=Zt(s.privateKey,n);s.privateKey.fill(0);try{return(await rt.blake3(i)).slice(0,kt)}finally{i.fill(0)}}}async function Mo(t,e,n=vl){if(e.byteLength<Ol)return c(10);let s=await t.blake3(Zt(e,n));return m(s.slice(0,Dl))}var tc=new Set(["constructor","prototype","length","name"]);function wo(t){for(let e of Object.getOwnPropertyNames(t)){if(tc.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})}}wo(tt);wo(tt.prototype);var Bo=8;class kn{#t;#e;#n;#s;#i;constructor(t){if(this.#i=t.persistKeyring,this.#n={rpId:t.rpId,rpName:t.rpName},this.#s=t.userName??t.rpId??t.rpName??Je,t.keyring!==void 0)this.#e=Ct(t.keyring)}get keyring(){return this.#e===void 0?void 0:Ct(this.#e)}list(){if(this.#e===void 0)return[];return this.#e.entries.map(sc)}async save(t,e){if(e?.persist===!0)return Promise.reject(Error("prf-store: use bindAndSave(enclave) to persist a binding"));return this.#t=t,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>=Bo)return c(26);let o=Uo(e?.nick),r=e?.excludeCredentials??(i?void 0:No(n)),l=e?.salt??n?.salt,a=n===void 0?void 0:n.entries.map((Z)=>({credId:Z.credId,tag:Z.tag})),[d,u]=await t.bind({...this.#n,salt:l,credId:s,createCredIfNeeded:e?.createCredIfNeeded??!i,excludeCredentials:r,userName:this.#s,displayName:o??this.#n.rpName??this.#s,authenticatorAttachment:e?.authenticatorAttachment,hints:e?.hints},a);if(u!==0)return c(u);if(d===void 0)return c(12);let p=Date.now(),h={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:ec()},y=n===void 0?{salt:d.salt.slice(),entries:[]}:Ct(n);return this.#e=ic(y,h),this.#t=t,await this.#i(Ct(this.#e)),m(this.#t)}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0||t.entries.length===0)return c(22);let[e,n]=await tt.unsealWithPasskey(t.entries.map((i)=>({sealedMaster:i.sealedMaster,credId:i.credId})),{...this.#n,salt:t.salt});if(n!==0)return c(n);this.#t=e.enclave;let s=oc(t,e.credId);if(s!==void 0)this.#e=s,await this.#i(Ct(s));return m(e.enclave)}async rename(t,e){let n=this.#e;if(n===void 0)return c(22);let s=n.entries.findIndex((a)=>B(a.credId,t));if(s<0)return c(13);let i=n.entries.map(ze),o=i[s];if(o===void 0)return c(13);let r=Uo(e);i[s]={...o,nick:r};let l={salt:n.salt.slice(),entries:i};return this.#e=l,await this.#i(Ct(l)),m(void 0)}async remove(t){let e=this.#e;if(e===void 0)return c(22);let n=e.entries.filter((i)=>!B(i.credId,t));if(n.length===e.entries.length)return c(13);if(n.length===0)return this.#e=void 0,await this.#i(void 0),m(void 0);let s={salt:e.salt.slice(),entries:n.map(ze)};return this.#e=s,await this.#i(Ct(s)),m(void 0)}async wipe(){this.#t=void 0,this.#e=void 0,await this.#i(void 0)}}function Uo(t){if(t===void 0)return;let e=t.trim();return e===""?void 0:e}function ec(){if(typeof navigator>"u")return;return Ko(navigator.userAgent)}function ze(t){let[e,n]=Pt(t.sealedMaster.slice());return{type:"prf",sealedMaster:n===0&&e!==void 0?e:t.sealedMaster,credId:t.credId.slice(),tag:t.tag.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 Ct(t){return{salt:t.salt.slice(),entries:t.entries.map(ze)}}function Jo(t){return t!==null&&typeof t==="object"}function nc(t){if(!Jo(t)||t.type!=="prf")return;if(!(t.sealedMaster instanceof Uint8Array)||!(t.credId instanceof Uint8Array)||!(t.tag instanceof Uint8Array)||t.tag.byteLength!==32||typeof t.enrolledAt!=="number"||!Number.isFinite(t.enrolledAt))return;let[e,n]=Pt(t.sealedMaster);if(n!==0||e===void 0)return;let s=t.attachment==="platform"||t.attachment==="cross-platform"?t.attachment:void 0,i=t.enrolledOs,o=i==="ios"||i==="macos"||i==="android"||i==="windows"||i==="linux"||i==="other"?i:void 0,r=Array.isArray(t.transports)?t.transports.filter((l)=>typeof l==="string"):void 0;return{type:"prf",sealedMaster:e,credId:t.credId.slice(),tag:t.tag.slice(),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:s,transports:r===void 0||r.length===0?void 0:r,aaguid:t.aaguid instanceof Uint8Array?t.aaguid.slice():void 0,enrolledOs:o}}function zo(t){if(!Jo(t))return;if(!(t.salt instanceof Uint8Array)||!Array.isArray(t.entries))return;let e=[];for(let n of t.entries){let s=nc(n);if(s!==void 0)e.push(s)}if(e.length===0)return;return{salt:t.salt.slice(),entries:e}}function sc(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 No(t){if(t===void 0)return[];return t.entries.filter((e)=>e.credId.byteLength>0).map((e)=>e.credId.slice())}function ic(t,e){let n=t.entries.map(ze),s=n.findIndex((i)=>B(i.credId,e.credId));if(s>=0){let i=n[s];n[s]={...e,enrolledAt:i?.enrolledAt??e.enrolledAt,nick:e.nick??i?.nick}}else n.push(e);return{salt:t.salt.slice(),entries:n}}function oc(t,e){if(e.byteLength===0)return;let n=t.entries.findIndex((o)=>B(o.credId,e));if(n<0)return;let s=t.entries.map(ze),i=s[n];if(i===void 0)return;return s[n]={...i,lastUsedAt:Date.now()},{salt:t.salt.slice(),entries:s}}var rc=Ln("fbfc3007154e4ecc8c0b6e020557d7bd"),lc=Ln("ea9b8d664d011d213ce4b6b48cb575d4"),cc=Ln("08987058cadc4b81b6e130de50dcbe96"),ac=Ln("2fc0579f811347eab116bb5a8db9202a");function Ln(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 dc(t){if(t===void 0||t.byteLength!==16)return;if(B(t,rc))return"Apple Passkey";if(B(t,lc))return"GPM";if(B(t,cc))return"Windows Hello";if(B(t,ac))return"YubiKey";return}function uc(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 Eo(t){let e=dc(t.aaguid);if(e!==void 0)return e;if(uc(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 pc(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 mc(t){if(t.nick!==void 0&&t.nick!=="")return t.nick;let e=Eo(t),n=pc(t.credId);return n===""?e:`${e} ${n}`}var hc="diplomatic.pin/";function yc(t){return hc+at(t)}async function Fo(t,e,n){let s=await e.deriveIdentity(yc(n),0);return t.blake3(s.publicKey)}async function Mn(t,e){let n=await t.gen256BitSecureRandomSeed(),s=await Fo(t,e,n);return{n,h:s}}async function Pn(t,e,n){let s=await Fo(t,e,n.n);return bc(s,n.h)}function vo(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||e.h.byteLength<1)return;return{n:e.n.slice(),h:e.h.slice()}}function wn(t){return{n:t.n.slice(),h:t.h.slice()}}function bc(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}var Un="keyring",Qo="prfMeta",ti="idPin",Do="idPub";class Bn{#t;db;#e;constructor(t,e){this.db=t,this.#e=e}async save(t,e){return await this.#n(t),this.#t=t,this.#t}async load(){return this.#t}async clearSession(){this.#t=void 0}async wipe(){this.#t=void 0;let t=this.db.transaction(lt,"readwrite"),e=t.objectStore(lt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.delete(Un),e.delete(Qo),e.delete(ti),e.delete(Do)})}async loadKeyring(){let e=this.db.transaction(lt,"readonly").objectStore(lt);return new Promise((n,s)=>{let i=e.get(Un);i.onsuccess=()=>{n(zo(i.result))},i.onerror=()=>s(i.error)})}async persistKeyring(t){let e=this.db.transaction(lt,"readwrite"),n=e.objectStore(lt);return new Promise((s,i)=>{if(e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(Qo),t===void 0){n.delete(Un);return}n.put(Ct(t),Un)})}async hasKeyring(){let t=await this.loadKeyring();return t!==void 0&&t.entries.length>0}async openPrfStore(t){let e=await this.loadKeyring();return new kn({rpId:t.rpId,rpName:t.rpName,userName:t.userName,keyring:e,persistKeyring:(n)=>this.persistKeyring(n)})}async#n(t){await this.#o(Do);let e=await this.#s();if(e!==void 0){if(!await Pn(this.#e,t,e))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)");return}let n=await Mn(this.#e,t);await this.#i(n)}#s(){let e=this.db.transaction(lt,"readonly").objectStore(lt);return new Promise((n,s)=>{let i=e.get(ti);i.onsuccess=()=>n(vo(i.result)),i.onerror=()=>s(i.error)})}#i(t){let e=wn(t),n=this.db.transaction(lt,"readwrite"),s=n.objectStore(lt);return new Promise((i,o)=>{n.oncomplete=()=>i(),n.onerror=()=>o(n.error),s.put(e,ti)})}#o(t){let e=this.db.transaction(lt,"readwrite"),n=e.objectStore(lt);return new Promise((s,i)=>{e.oncomplete=()=>s(),e.onerror=()=>i(e.error),n.delete(t)})}}class ei{db;constructor(t){this.db=t}async enq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(mt,"readwrite"),i=s.objectStore(mt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=at(l);i.put({host:t,hash:a})}})}async deq(t,e){let n=[...e];if(n.length===0)return;let s=this.db.transaction(mt,"readwrite"),i=s.objectStore(mt);return new Promise((o,r)=>{s.oncomplete=()=>o(),s.onerror=()=>r(s.error);for(let l of n){let a=at(l);i.delete([t,a])}})}async list(t){let n=this.db.transaction(mt,"readonly").objectStore(mt);return new Promise((s,i)=>{let o=n.getAll();o.onsuccess=()=>{let l=o.result.filter((a)=>a.host===t).map((a)=>a.hash);s(l.map((a)=>We(a)))},o.onerror=()=>i(o.error)})}async count(){let e=this.db.transaction(mt,"readonly").objectStore(mt);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(mt,"readwrite"),e=t.objectStore(mt);return new Promise((n,s)=>{t.oncomplete=()=>n(),t.onerror=()=>s(t.error),e.clear()})}}var lt="seedMeta",ot="hosts",mt="uploadQueue",pt="downloadQueue",v="messages",we="apld",Oo=3,jo="diplomatic-store-db";class ni{seed;hosts;uploads;downloads;messages;db;constructor(t,e){this.db=t,this.seed=new Bn(t,e),this.hosts=new Bs(t),this.uploads=new ei(t),this.downloads=new Us(t),this.messages=new Js(t,e)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function Zc(){return new Promise((t,e)=>{let n=indexedDB.open(jo,Oo);n.onupgradeneeded=()=>{let{result:s,transaction:i}=n;if(!s.objectStoreNames.contains(lt))s.createObjectStore(lt);if(!s.objectStoreNames.contains(ot))s.createObjectStore(ot,{keyPath:"label"});if(!s.objectStoreNames.contains(mt))s.createObjectStore(mt,{keyPath:["host","hash"]});if(!s.objectStoreNames.contains(pt))s.createObjectStore(pt);let o;if(!s.objectStoreNames.contains(v))o=s.createObjectStore(v);else{if(!i)throw Error("missing upgrade transaction for messages store");o=i.objectStore(v)}if(!o.indexNames.contains(we))o.createIndex(we,"apld",{unique:!1})},n.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${jo} → v${Oo}); waiting for other connections to close`)},n.onsuccess=()=>{let s=n.result;s.onversionchange=()=>{s.close()},t(s)},n.onerror=()=>e(n.error??Error("protocol store IndexedDB open failed"))})}async function si(t){let e=await Zc();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((n)=>{setTimeout(()=>n(!1),2000)})])}catch{}return new ni(e,t)}function Ao(t){if(!t||typeof t!=="object")return!1;if(!("kind"in t))return!1;return typeof t.kind==="string"}function qo(t){if(typeof t!=="number")return;return t}function Gc(t){if(!t||typeof t!=="object")return;if(!("phase"in t))return;let e=Xc(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 Xc(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 _o(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=Gc(t.progress);if(n===void 0)return;e=n}return{numUploads:t.numUploads,numDownloads:t.numDownloads,progress:e}}var ht="[DIPLOMATIC]";class Ee{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:Nt};clientState;xferState;constructor(t,e,n,s,i){this.state=t,this.store=e,this.readyTimeoutMs=i,this.clientState=new bt(async()=>this.cachedClientState),this.xferState=new bt(async()=>this.cachedXferState),this.scheduledSync=new Ye(s,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(o){console.error(`${ht} worker sync after local write failed`,o)}}),this.local=new he(n,t,e,()=>{throw Error(`${ht} local writer has no transport (use worker for network)`)},Ge,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),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(`${ht} worker error`,n),this.failPending(Error(`${ht} worker failed to load`))},t.onmessageerror=()=>{this.failPending(Error(`${ht} 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 Mt,i=n.syncDebounceMs??cn,o=n.readyTimeoutMs??15000,r=new Ee(t,e,s,i,o);return await r.hydrateStateFromStore(e),r}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:Nt}}async loadSession(t){let e=await this.store.seed.load(),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=_o(t);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${ht} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${ht} worker ping failed`)}terminate(){this.scheduledSync.cancel();let t=this.worker;if(this.worker=void 0,t)try{t.terminate()}catch{}this.failPending(Error(`${ht} worker terminated`))}onMessage(t){if(!Ao(t))return;let e=t;switch(e.kind){case"ready":return;case"initError":{this.failPending(Error(`${ht} 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":{this.state.refresh(e.eids.map(Ic));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 Ne(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=qo(n);if(s!==void 0)return s;return 0}catch(n){if(n instanceof Ne)return n.status;return 12}}serializeHost(t){return{handle:t.handle.href,label:t.label,idx:t.idx??0}}async setSeed(t,e){await this.local.setSeed(t,e),await this.loadSession(!1),this.clientState.emit();let n=this.allocId(),s=this.readyTimeoutMs;await new Promise((i,o)=>{let r=void 0,l=(a)=>{if(r!==void 0)clearTimeout(r);a()};this.pending.set(n,{resolve:(a)=>l(()=>i(a)),reject:(a)=>l(()=>o(a))}),r=setTimeout(()=>{this.pending.delete(n),o(Error(`${ht} setSeed worker timeout after ${s}ms`))},s);try{let a=t.spawnSyncWorker({id:n,persist:e?.persist});this.bindWorker(a)}catch(a){if(this.pending.delete(n),r!==void 0)clearTimeout(r);o(a instanceof Error?a:Error(String(a)))}});try{await this.pullRemoteXfer()}catch{}}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){return this.local.insertRaw(t)}async updateRaw(t,e,n){return this.local.updateRaw(t,e,n)}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(!fc(n))return c(12);return m(n)}catch(n){if(n instanceof Ne&&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(`${ht} msgcheck: expected Uint8Array`);return t}async entcheck(){let t=await this.request({id:this.allocId(),op:"entcheck"});if(!(t instanceof Uint8Array))throw Error(`${ht} entcheck: expected Uint8Array`);return t}async wipe(t){if(await this.local.wipe(t),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:t?.msgs,ents:t?.ents,meta:t?.meta,seed:t?.seed});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 dn(s,t),0}catch(n){if(n instanceof Ne)return n.status;return 12}}}class Ne extends Error{status;constructor(t){super(`WorkerReplyError: ${g[t]}`);this.status=t;this.name="WorkerReplyError"}}function fc(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 Ic(t){return t}var fe="[DIPLOMATIC]";async function Jn(t){let e=t.clock??new Mt;if(t.worker===!0&&Vc(t)!==void 0)throw Error(`${fe} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(t.worker!==!0){console.info(`${fe} sync on main thread `+"(no worker — app did not request a worker)");let i=await $o(t.store);return Sc(e,t.state,i)}if(typeof Worker>"u")throw Error(`${fe} worker: true but Worker API is unavailable`);let n=await $o(void 0),s=await Ee.open(t.state,n,{readyTimeoutMs:t.readyTimeoutMs,clock:e,syncDebounceMs:t.syncDebounceMs});return console.info(`${fe} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:s,mode:"worker",dispose:()=>{console.info(`${fe} terminating sync worker`),s.terminate()}}}function Vc(t){if("store"in t)return t.store;return}async function Sc(t,e,n){let s=new he(t,e,n,ns,Ge);return{client:s,mode:"main",dispose:()=>{s.disconnect()}}}async function $o(t){if(t!==void 0)return t;if(typeof indexedDB>"u")throw Error(`${fe} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return si(Ge)}function Wc(t){let[e,n]=ii();return zn(()=>{async function s(){let o=await t.clientState.get();n(o)}let i=t.clientState.listen(s);return s(),()=>{i()}},[t]),e}function gc(t){let[e,n]=ii();return zn(()=>{async function s(){let o=await t.xferState.get();n(o)}let i=t.xferState.listen(s);return s(),()=>{i()}},[t]),e}function Kc(t){zn(()=>{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 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 xc(t={}){let e=t.clock??new Mt,{seed:n,host:s,readyTimeoutMs:i,optimistic:o}=t,r=t.worker===!0,l="store"in t?t.store:void 0,[a,d]=ii({stateMgr:rs});return zn(()=>{let u=!1,p;return(async()=>{let h=await ms({optimistic:o});if(u)return;let y=rn(h),Z=r?await Jn({state:y,clock:e,worker:!0,readyTimeoutMs:i}):await Jn({state:y,clock:e,store:l,readyTimeoutMs:i});if(u){Z.dispose();return}p=Z.dispose;let{client:b,mode:G}=Z;if(n)await b.setSeed(n);if(s)await b.link(s);if(u){p();return}d({client:b,entDB:h,stateMgr:y,mode:G,error:void 0})})().catch((h)=>{let y=h instanceof Error?h:Error(String(h));if(console.error("[DIPLOMATIC] useClient init failed",y),!u)d((Z)=>({...Z,client:void 0,error:y}))}),()=>{u=!0,p?.()}},[e,n,s,r,l,i,o]),a}import{use as Rc,useEffect as tr,useRef as Tc,useState as Cc}from"react";function er(t,e,n){let[s,i]=Cc();return tr(()=>{async function o(){let r=await n();i(r)}return o(),t.on(e,o),()=>{t.off(e,o)}},[t,e,n]),s}function Hc(t,e,n){let s=Tc(n());return tr(()=>{async function i(){s.current=n()}return t.on(e,i),()=>{t.off(e,i)}},[t,e,n]),Rc(s.current)}function nr(t,e){return`${t}:${e}`}class oi{queue=new Map;async enq(t){for(let e of t){let n=nr(e.host,e.seq);this.queue.set(n,e)}}async deq(t,e){for(let n of e){let s=nr(t,n);this.queue.delete(s)}}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()}}function Yc(t,e){if(e.setLastSeq!==void 0)t.lastSeq=e.setLastSeq;else if(e.lastSeq!==void 0&&e.lastSeq>t.lastSeq)t.lastSeq=e.lastSeq}class ri{hosts=new Map;async add(t){let e=this.hosts.get(t.label),n=e!==void 0&&e.handle===t.handle&&(e.idx??0)===(t.idx??0),s={...t,lastSeq:n?e.lastSeq:0,clockOffset:n?e.clockOffset:void 0,subscription:n?e.subscription:void 0};this.hosts.set(t.label,s)}async touch(t,e){await this.recordStats(t,{lastSeq:e})}async recordStats(t,e){let n=this.hosts.get(t);if(!n)return;Yc(n,e),this.hosts.set(t,{...n})}async get(t){return this.hosts.get(t)}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)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class li{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(R(n),s),e.push(0);return e}async del(t){for(let e of t)this.messages.delete(R(e))}async get(t){let e=this.messages.get(R(t));if(e)return await Ut(t,e,this.crypto);return}async has(t){return this.messages.has(R(t))}async list(t){let e=t?.apld,n=t?.body!==!1,s=[];for(let[i,o]of this.messages){if(e!==void 0&&me(o.apld)!==e)continue;let r=et(i);s.push(await Ut(r,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(me(n.apld)===t)e++;return e}async listKeys(){let t=[];for(let e of this.messages.keys())t.push(et(e));return t}async last(t){let e;for(let[n,s]of this.messages){if(B(t,s.eid)===!1)continue;let i=et(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 Ut(e.hash,e.data,this.crypto);return}async markApplied(t){for(let e of t){let n=this.messages.get(R(e));if(!n)continue;Et(n,wt)}}async markFailed(t){for(let{key:e,err:n}of t){let s=this.messages.get(R(e));if(!s)continue;Et(s,Gt,n)}}async wipe(){this.messages.clear()}}class ci{#t;#e;#n;constructor(t){this.#e=t}async save(t,e){if(this.#n!==void 0){if(!await Pn(this.#e,t,this.#n))throw Error("[DIPLOMATIC] seed does not match this device's identity (local data was created with a different master seed)")}else this.#n=await Mn(this.#e,t);return this.#t=t,this.#t}async load(){return this.#t}async wipe(){this.#t=void 0,this.#n=void 0}peekPin(){return this.#n===void 0?void 0:wn(this.#n)}}class ai{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(at(s))}async deq(t,e){let n=this.queue.get(t);if(n)for(let s of e)n.delete(at(s))}async list(t){let e=this.queue.get(t);if(!e)return[];let n=[];for(let s of e)n.push(We(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 sr{seed;hosts=new ri;uploads=new ai;downloads=new oi;messages;constructor(t){this.seed=new ci(t),this.messages=new li(t)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class ir{singletonType;latest;latestOff=-1;emitter=new Ht;constructor(t){this.singletonType=t}async apply(t){for(let e of t){let n=new M(e.eid),[s,i]=n.readStruct(A);if(i!==0)continue;let o=new w;o.writeVarString(this.singletonType);let r=o.result();if(s.id.length===r.length&&s.id.every((l,a)=>l===r[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)}}class or{#t;#e;#n;#s;constructor(t){if(this.#n=t.rpId,this.#s=t.rpName,t.credId!==void 0)this.#e=t.credId.slice()}get credId(){if(this.#e===void 0)return;return this.#e.slice()}setCredId(t){this.#e=t===void 0?void 0:t.slice()}async save(t,e){if(e?.persist!==!0)return this.#t=t,this.#t;let[n,s]=await t.persistToLargeBlob([],{rpId:this.#n,rpName:this.#s,credId:this.#e});if(s!==0||n===void 0)return Promise.reject(Error(`persistToLargeBlob status ${s}`));return this.#e=n,this.#t=t,this.#t}async load(){return this.#t}async unlock(){let t=this.#e;if(t===void 0)return c(22);let[e,n]=await tt.fromLargeBlob({rpId:this.#n,rpName:this.#s,credId:t});if(n!==0||e===void 0)return c(n);return this.#t=e.enclave,m(e.enclave)}async wipe(){let t=this.#e;if(t!==void 0){let e=await tt.clearLargeBlob(t,{rpId:this.#n});if(e!==0)return Promise.reject(Error(`clearLargeBlob status ${e}`))}this.#t=void 0,this.#e=void 0}}export{wt as APLD_APPLIED,Gt as APLD_ERROR,St as APLD_PENDING,He as CachedEntDB,Mt as Clock,Tn as DEFAULT_PRF_SALT,M as Decoder,tt as Enclave,w as Encoder,on as EntDBMemory,ds as EntIDB,es as HTTPTransport,Bn as IDBSeedStore,ni as IDBStore,Bo as KEYRING_MAX,yt as MASTER_SEED_LEN,sr as MemoryStore,Be as PairRequest,or as PasskeySeedStore,kn as PrfSeedStore,os as SEALED_MASTER_KEY_LEN,ir as SingletonStateManager,xe as StateManager,g as Status,he as SyncClient,Ht as TypedEventEmitter,Ee as WorkerClient,me as apldFromStored,Ns as asDHKEReq,Es as asDHKEResp,Pt as asSealedMasterKey,et as b64tob,On as b64urltob,R as btob64,kr as btob64url,at as btoh,Ke as checksumEntRevs,re as checksumSet,Hi as cmpBytes,Ge as crypto,pe as defaultPeekProgressEvery,go as defaultWebAuthnRpId,A as eidCodec,Yi as encodeEntRev,rn as entStateManager,Yr as genSingletonEID,ns as hostHTTPTransport,We as htob,Nt as idleProgress,sl as isApldState,F as isLiveEnt,il as isPendingApply,bs as isTerminalApplyFailure,_r as isTombstone,No as keyringCredIds,Eo as keyringKind,mc as keyringLabel,zl as largeBlobCapable,Ji as normalizeTags,el as nullEntDB,rs as nullStateManager,Jn as openDiplomaticClient,ms as openEntDB,si as openIDBStore,Nl as prfCapable,Ce as revFromEntity,hs as revFromHead,Et as setApld,an as shouldEmitItemProgress,xc as useClient,Wc as useClientState,gc as useClientXferState,er as useStateWatcher,Hc as useStateWatcherSuspense,Kc as useSyncOnResume,Ul as webAuthnLastError};
|