@interncom/diplomatic 0.12.0 → 0.12.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/index.mjs +2 -2
- package/dist/cli/shared/worker/embeddedWorkerSource.d.ts +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.mjs +1 -1
- package/dist/web/passkey/webauthn.d.ts +1 -1
- package/dist/web/react/useClient.d.ts +1 -1
- package/dist/web/shared/worker/embeddedWorkerSource.d.ts +1 -1
- package/dist/web/stores/idb/seed.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 Ae(i){let r=i.length,n=0,e=0;while(e<r){let t=i.charCodeAt(e++);if((t&4294967168)===0){n++;continue}else if((t&4294965248)===0)n+=2;else{if(t>=55296&&t<=56319){if(e<r){let $=i.charCodeAt(e);if(($&64512)===56320)++e,t=((t&1023)<<10)+($&1023)+65536}}if((t&4294901760)===0)n+=3;else n+=4}}return n}function J$(i,r,n){let e=i.length,t=n,$=0;while($<e){let f=i.charCodeAt($++);if((f&4294967168)===0){r[t++]=f;continue}else if((f&4294965248)===0)r[t++]=f>>6&31|192;else{if(f>=55296&&f<=56319){if($<e){let Z=i.charCodeAt($);if((Z&64512)===56320)++$,f=((f&1023)<<10)+(Z&1023)+65536}}if((f&4294901760)===0)r[t++]=f>>12&15|224,r[t++]=f>>6&63|128;else r[t++]=f>>18&7|240,r[t++]=f>>12&63|128,r[t++]=f>>6&63|128}r[t++]=f&63|128}}var h$=new TextEncoder,Q$=50;function w$(i,r,n){h$.encodeInto(i,r.subarray(n))}function Te(i,r,n){if(i.length>Q$)w$(i,r,n);else J$(i,r,n)}var u$=4096;function Fn(i,r,n){let e=r,t=e+n,$=[],f="";while(e<t){let Z=i[e++];if((Z&128)===0)$.push(Z);else if((Z&224)===192){let J=i[e++]&63;$.push((Z&31)<<6|J)}else if((Z&240)===224){let J=i[e++]&63,h=i[e++]&63;$.push((Z&31)<<12|J<<6|h)}else if((Z&248)===240){let J=i[e++]&63,h=i[e++]&63,Q=i[e++]&63,w=(Z&7)<<18|J<<12|h<<6|Q;if(w>65535)w-=65536,$.push(w>>>10&1023|55296),w=56320|w&1023;$.push(w)}else $.push(Z);if($.length>=u$)f+=String.fromCharCode(...$),$.length=0}if($.length>0)f+=String.fromCharCode(...$);return f}var V$=new TextDecoder,Y$=200;function X$(i,r,n){let e=i.subarray(r,r+n);return V$.decode(e)}function De(i,r,n){if(n>Y$)return X$(i,r,n);else return Fn(i,r,n)}class vi{type;data;constructor(i,r){this.type=i,this.data=r}}class ni extends Error{constructor(i){super(i);let r=Object.create(ni.prototype);Object.setPrototypeOf(this,r),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:ni.name})}}var bi=4294967295;function pe(i,r,n){let e=n/4294967296,t=n;i.setUint32(r,e),i.setUint32(r+4,t)}function pr(i,r,n){let e=Math.floor(n/4294967296),t=n;i.setUint32(r,e),i.setUint32(r+4,t)}function xr(i,r){let n=i.getInt32(r),e=i.getUint32(r+4);return n*4294967296+e}function xe(i,r){let n=i.getUint32(r),e=i.getUint32(r+4);return n*4294967296+e}var c$=-1,W$=4294967295,I$=17179869183;function g$({sec:i,nsec:r}){if(i>=0&&r>=0&&i<=I$)if(r===0&&i<=W$){let n=new Uint8Array(4);return new DataView(n.buffer).setUint32(0,i),n}else{let n=i/4294967296,e=i&4294967295,t=new Uint8Array(8),$=new DataView(t.buffer);return $.setUint32(0,r<<2|n&3),$.setUint32(4,e),t}else{let n=new Uint8Array(12),e=new DataView(n.buffer);return e.setUint32(0,r),pr(e,4,i),n}}function z$(i){let r=i.getTime(),n=Math.floor(r/1000),e=(r-n*1000)*1e6,t=Math.floor(e/1e9);return{sec:n+t,nsec:e-t*1e9}}function U$(i){if(i instanceof Date){let r=z$(i);return g$(r)}else return null}function K$(i){let r=new DataView(i.buffer,i.byteOffset,i.byteLength);switch(i.byteLength){case 4:{let n=r.getUint32(0),e=0;return{sec:n,nsec:0}}case 8:{let n=r.getUint32(0),e=r.getUint32(4),t=(n&3)*4294967296+e,$=n>>>2;return{sec:t,nsec:$}}case 12:{let n=xr(r,4),e=r.getUint32(0);return{sec:n,nsec:e}}default:throw new ni(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${i.length}`)}}function G$(i){let r=K$(i);return new Date(r.sec*1000+r.nsec/1e6)}var je={type:c$,encode:U$,decode:G$};class ir{static defaultCodec=new ir;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(je)}register({type:i,encode:r,decode:n}){if(i>=0)this.encoders[i]=r,this.decoders[i]=n;else{let e=-1-i;this.builtInEncoders[e]=r,this.builtInDecoders[e]=n}}tryToEncode(i,r){for(let n=0;n<this.builtInEncoders.length;n++){let e=this.builtInEncoders[n];if(e!=null){let t=e(i,r);if(t!=null){let $=-1-n;return new vi($,t)}}}for(let n=0;n<this.encoders.length;n++){let e=this.encoders[n];if(e!=null){let t=e(i,r);if(t!=null)return new vi(n,t)}}if(i instanceof vi)return i;return null}decode(i,r,n){let e=r<0?this.builtInDecoders[-1-r]:this.decoders[r];if(e)return e(i,r,n);else return new vi(r,i)}}function o$(i){return i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer}function Wr(i){if(i instanceof Uint8Array)return i;else if(ArrayBuffer.isView(i))return new Uint8Array(i.buffer,i.byteOffset,i.byteLength);else if(o$(i))return new Uint8Array(i);else return Uint8Array.from(i)}var m$=100,a$=2048;class jr{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(i){this.extensionCodec=i?.extensionCodec??ir.defaultCodec,this.context=i?.context,this.useBigInt64=i?.useBigInt64??!1,this.maxDepth=i?.maxDepth??m$,this.initialBufferSize=i?.initialBufferSize??a$,this.sortKeys=i?.sortKeys??!1,this.forceFloat32=i?.forceFloat32??!1,this.ignoreUndefined=i?.ignoreUndefined??!1,this.forceIntegerToFloat=i?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new jr({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(i){if(this.entered)return this.clone().encodeSharedRef(i);try{return this.entered=!0,this.reinitializeState(),this.doEncode(i,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(i){if(this.entered)return this.clone().encode(i);try{return this.entered=!0,this.reinitializeState(),this.doEncode(i,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(i,r){if(r>this.maxDepth)throw Error(`Too deep objects in depth ${r}`);if(i==null)this.encodeNil();else if(typeof i==="boolean")this.encodeBoolean(i);else if(typeof i==="number")if(!this.forceIntegerToFloat)this.encodeNumber(i);else this.encodeNumberAsFloat(i);else if(typeof i==="string")this.encodeString(i);else if(this.useBigInt64&&typeof i==="bigint")this.encodeBigInt64(i);else this.encodeObject(i,r)}ensureBufferSizeToWrite(i){let r=this.pos+i;if(this.view.byteLength<r)this.resizeBuffer(r*2)}resizeBuffer(i){let r=new ArrayBuffer(i),n=new Uint8Array(r),e=new DataView(r);n.set(this.bytes),this.view=e,this.bytes=n}encodeNil(){this.writeU8(192)}encodeBoolean(i){if(i===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber(i){if(!this.forceIntegerToFloat&&Number.isSafeInteger(i))if(i>=0)if(i<128)this.writeU8(i);else if(i<256)this.writeU8(204),this.writeU8(i);else if(i<65536)this.writeU8(205),this.writeU16(i);else if(i<4294967296)this.writeU8(206),this.writeU32(i);else if(!this.useBigInt64)this.writeU8(207),this.writeU64(i);else this.encodeNumberAsFloat(i);else if(i>=-32)this.writeU8(224|i+32);else if(i>=-128)this.writeU8(208),this.writeI8(i);else if(i>=-32768)this.writeU8(209),this.writeI16(i);else if(i>=-2147483648)this.writeU8(210),this.writeI32(i);else if(!this.useBigInt64)this.writeU8(211),this.writeI64(i);else this.encodeNumberAsFloat(i);else this.encodeNumberAsFloat(i)}encodeNumberAsFloat(i){if(this.forceFloat32)this.writeU8(202),this.writeF32(i);else this.writeU8(203),this.writeF64(i)}encodeBigInt64(i){if(i>=BigInt(0))this.writeU8(207),this.writeBigUint64(i);else this.writeU8(211),this.writeBigInt64(i)}writeStringHeader(i){if(i<32)this.writeU8(160+i);else if(i<256)this.writeU8(217),this.writeU8(i);else if(i<65536)this.writeU8(218),this.writeU16(i);else if(i<4294967296)this.writeU8(219),this.writeU32(i);else throw Error(`Too long string: ${i} bytes in UTF-8`)}encodeString(i){let n=Ae(i);this.ensureBufferSizeToWrite(5+n),this.writeStringHeader(n),Te(i,this.bytes,this.pos),this.pos+=n}encodeObject(i,r){let n=this.extensionCodec.tryToEncode(i,this.context);if(n!=null)this.encodeExtension(n);else if(Array.isArray(i))this.encodeArray(i,r);else if(ArrayBuffer.isView(i))this.encodeBinary(i);else if(typeof i==="object")this.encodeMap(i,r);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(i)}`)}encodeBinary(i){let r=i.byteLength;if(r<256)this.writeU8(196),this.writeU8(r);else if(r<65536)this.writeU8(197),this.writeU16(r);else if(r<4294967296)this.writeU8(198),this.writeU32(r);else throw Error(`Too large binary: ${r}`);let n=Wr(i);this.writeU8a(n)}encodeArray(i,r){let n=i.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 e of i)this.doEncode(e,r+1)}countWithoutUndefined(i,r){let n=0;for(let e of r)if(i[e]!==void 0)n++;return n}encodeMap(i,r){let n=Object.keys(i);if(this.sortKeys)n.sort();let e=this.ignoreUndefined?this.countWithoutUndefined(i,n):n.length;if(e<16)this.writeU8(128+e);else if(e<65536)this.writeU8(222),this.writeU16(e);else if(e<4294967296)this.writeU8(223),this.writeU32(e);else throw Error(`Too large map object: ${e}`);for(let t of n){let $=i[t];if(!(this.ignoreUndefined&&$===void 0))this.encodeString(t),this.doEncode($,r+1)}}encodeExtension(i){if(typeof i.data==="function"){let n=i.data(this.pos+6),e=n.length;if(e>=4294967296)throw Error(`Too large extension object: ${e}`);this.writeU8(201),this.writeU32(e),this.writeI8(i.type),this.writeU8a(n);return}let r=i.data.length;if(r===1)this.writeU8(212);else if(r===2)this.writeU8(213);else if(r===4)this.writeU8(214);else if(r===8)this.writeU8(215);else if(r===16)this.writeU8(216);else if(r<256)this.writeU8(199),this.writeU8(r);else if(r<65536)this.writeU8(200),this.writeU16(r);else if(r<4294967296)this.writeU8(201),this.writeU32(r);else throw Error(`Too large extension object: ${r}`);this.writeI8(i.type),this.writeU8a(i.data)}writeU8(i){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,i),this.pos++}writeU8a(i){let r=i.length;this.ensureBufferSizeToWrite(r),this.bytes.set(i,this.pos),this.pos+=r}writeI8(i){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,i),this.pos++}writeU16(i){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,i),this.pos+=2}writeI16(i){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,i),this.pos+=2}writeU32(i){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,i),this.pos+=4}writeI32(i){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,i),this.pos+=4}writeF32(i){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,i),this.pos+=4}writeF64(i){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,i),this.pos+=8}writeU64(i){this.ensureBufferSizeToWrite(8),pe(this.view,this.pos,i),this.pos+=8}writeI64(i){this.ensureBufferSizeToWrite(8),pr(this.view,this.pos,i),this.pos+=8}writeBigUint64(i){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,i),this.pos+=8}writeBigInt64(i){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,i),this.pos+=8}}function Di(i,r){return new jr(r).encodeSharedRef(i)}function Lr(i){return`${i<0?"-":""}0x${Math.abs(i).toString(16).padStart(2,"0")}`}var d$=16,F$=16;class Rn{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(i=d$,r=F$){this.maxKeyLength=i,this.maxLengthPerKey=r,this.caches=[];for(let n=0;n<this.maxKeyLength;n++)this.caches.push([])}canBeCached(i){return i>0&&i<=this.maxKeyLength}find(i,r,n){let e=this.caches[n-1];i:for(let t of e){let $=t.bytes;for(let f=0;f<n;f++)if($[f]!==i[r+f])continue i;return t.str}return null}store(i,r){let n=this.caches[i.length-1],e={bytes:i,str:r};if(n.length>=this.maxLengthPerKey)n[Math.random()*n.length|0]=e;else n.push(e)}decode(i,r,n){let e=this.find(i,r,n);if(e!=null)return this.hit++,e;this.miss++;let t=Fn(i,r,n),$=Uint8Array.prototype.slice.call(i,r,r+n);return this.store($,t),t}}var Nn="array",gr="map_key",se="map_value",R$=(i)=>{if(typeof i==="string"||typeof i==="number")return i;throw new ni("The type of key must be string or number but "+typeof i)};class ke{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(i){let r=this.getUninitializedStateFromPool();r.type=Nn,r.position=0,r.size=i,r.array=Array(i)}pushMapState(i){let r=this.getUninitializedStateFromPool();r.type=gr,r.readCount=0,r.size=i,r.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let i={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(i)}return this.stack[this.stackHeadPosition]}release(i){if(this.stack[this.stackHeadPosition]!==i)throw Error("Invalid stack state. Released state is not on top of the stack.");if(i.type===Nn){let n=i;n.size=0,n.array=void 0,n.position=0,n.type=void 0}if(i.type===gr||i.type===se){let n=i;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 Ir=-1,On=new DataView(new ArrayBuffer(0)),N$=new Uint8Array(On.buffer);try{On.getInt8(0)}catch(i){if(!(i 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 Le=RangeError("Insufficient data"),O$=new Rn;class sr{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=On;bytes=N$;headByte=Ir;stack=new ke;entered=!1;constructor(i){this.extensionCodec=i?.extensionCodec??ir.defaultCodec,this.context=i?.context,this.useBigInt64=i?.useBigInt64??!1,this.rawStrings=i?.rawStrings??!1,this.maxStrLength=i?.maxStrLength??bi,this.maxBinLength=i?.maxBinLength??bi,this.maxArrayLength=i?.maxArrayLength??bi,this.maxMapLength=i?.maxMapLength??bi,this.maxExtLength=i?.maxExtLength??bi,this.keyDecoder=i?.keyDecoder!==void 0?i.keyDecoder:O$,this.mapKeyConverter=i?.mapKeyConverter??R$}clone(){return new sr({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=Ir,this.stack.reset()}setBuffer(i){let r=Wr(i);this.bytes=r,this.view=new DataView(r.buffer,r.byteOffset,r.byteLength),this.pos=0}appendBuffer(i){if(this.headByte===Ir&&!this.hasRemaining(1))this.setBuffer(i);else{let r=this.bytes.subarray(this.pos),n=Wr(i),e=new Uint8Array(r.length+n.length);e.set(r),e.set(n,r.length),this.setBuffer(e)}}hasRemaining(i){return this.view.byteLength-this.pos>=i}createExtraByteError(i){let{view:r,pos:n}=this;return RangeError(`Extra ${r.byteLength-n} of ${r.byteLength} byte(s) found at buffer[${i}]`)}decode(i){if(this.entered)return this.clone().decode(i);try{this.entered=!0,this.reinitializeState(),this.setBuffer(i);let r=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return r}finally{this.entered=!1}}*decodeMulti(i){if(this.entered){yield*this.clone().decodeMulti(i);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer(i);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(i){if(this.entered)return this.clone().decodeAsync(i);try{this.entered=!0;let r=!1,n;for await(let f of i){if(r)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(f);try{n=this.doDecodeSync(),r=!0}catch(Z){if(!(Z instanceof RangeError))throw Z}this.totalPos+=this.pos}if(r){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return n}let{headByte:e,pos:t,totalPos:$}=this;throw RangeError(`Insufficient data in parsing ${Lr(e)} at ${$} (${t} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(i){return this.decodeMultiAsync(i,!0)}decodeStream(i){return this.decodeMultiAsync(i,!1)}async*decodeMultiAsync(i,r){if(this.entered){yield*this.clone().decodeMultiAsync(i,r);return}try{this.entered=!0;let n=r,e=-1;for await(let t of i){if(r&&e===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(t),n)e=this.readArraySize(),n=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--e===0)break}catch($){if(!($ instanceof RangeError))throw $}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){i:while(!0){let i=this.readHeadByte(),r;if(i>=224)r=i-256;else if(i<192)if(i<128)r=i;else if(i<144){let e=i-128;if(e!==0){this.pushMapState(e),this.complete();continue i}else r={}}else if(i<160){let e=i-144;if(e!==0){this.pushArrayState(e),this.complete();continue i}else r=[]}else{let e=i-160;r=this.decodeString(e,0)}else if(i===192)r=null;else if(i===194)r=!1;else if(i===195)r=!0;else if(i===202)r=this.readF32();else if(i===203)r=this.readF64();else if(i===204)r=this.readU8();else if(i===205)r=this.readU16();else if(i===206)r=this.readU32();else if(i===207)if(this.useBigInt64)r=this.readU64AsBigInt();else r=this.readU64();else if(i===208)r=this.readI8();else if(i===209)r=this.readI16();else if(i===210)r=this.readI32();else if(i===211)if(this.useBigInt64)r=this.readI64AsBigInt();else r=this.readI64();else if(i===217){let e=this.lookU8();r=this.decodeString(e,1)}else if(i===218){let e=this.lookU16();r=this.decodeString(e,2)}else if(i===219){let e=this.lookU32();r=this.decodeString(e,4)}else if(i===220){let e=this.readU16();if(e!==0){this.pushArrayState(e),this.complete();continue i}else r=[]}else if(i===221){let e=this.readU32();if(e!==0){this.pushArrayState(e),this.complete();continue i}else r=[]}else if(i===222){let e=this.readU16();if(e!==0){this.pushMapState(e),this.complete();continue i}else r={}}else if(i===223){let e=this.readU32();if(e!==0){this.pushMapState(e),this.complete();continue i}else r={}}else if(i===196){let e=this.lookU8();r=this.decodeBinary(e,1)}else if(i===197){let e=this.lookU16();r=this.decodeBinary(e,2)}else if(i===198){let e=this.lookU32();r=this.decodeBinary(e,4)}else if(i===212)r=this.decodeExtension(1,0);else if(i===213)r=this.decodeExtension(2,0);else if(i===214)r=this.decodeExtension(4,0);else if(i===215)r=this.decodeExtension(8,0);else if(i===216)r=this.decodeExtension(16,0);else if(i===199){let e=this.lookU8();r=this.decodeExtension(e,1)}else if(i===200){let e=this.lookU16();r=this.decodeExtension(e,2)}else if(i===201){let e=this.lookU32();r=this.decodeExtension(e,4)}else throw new ni(`Unrecognized type byte: ${Lr(i)}`);this.complete();let n=this.stack;while(n.length>0){let e=n.top();if(e.type===Nn)if(e.array[e.position]=r,e.position++,e.position===e.size)r=e.array,n.release(e);else continue i;else if(e.type===gr){if(r==="__proto__")throw new ni("The key __proto__ is not allowed");e.key=this.mapKeyConverter(r),e.type=se;continue i}else if(e.map[e.key]=r,e.readCount++,e.readCount===e.size)r=e.map,n.release(e);else{e.key=null,e.type=gr;continue i}}return r}}readHeadByte(){if(this.headByte===Ir)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=Ir}readArraySize(){let i=this.readHeadByte();switch(i){case 220:return this.readU16();case 221:return this.readU32();default:if(i<160)return i-144;else throw new ni(`Unrecognized array type byte: ${Lr(i)}`)}}pushMapState(i){if(i>this.maxMapLength)throw new ni(`Max length exceeded: map length (${i}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(i)}pushArrayState(i){if(i>this.maxArrayLength)throw new ni(`Max length exceeded: array length (${i}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(i)}decodeString(i,r){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String(i,r);return this.decodeBinary(i,r)}decodeUtf8String(i,r){if(i>this.maxStrLength)throw new ni(`Max length exceeded: UTF-8 byte length (${i}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+r+i)throw Le;let n=this.pos+r,e;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(i))e=this.keyDecoder.decode(this.bytes,n,i);else e=De(this.bytes,n,i);return this.pos+=r+i,e}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===gr;return!1}decodeBinary(i,r){if(i>this.maxBinLength)throw new ni(`Max length exceeded: bin length (${i}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(i+r))throw Le;let n=this.pos+r,e=this.bytes.subarray(n,n+i);return this.pos+=r+i,e}decodeExtension(i,r){if(i>this.maxExtLength)throw new ni(`Max length exceeded: ext length (${i}) > maxExtLength (${this.maxExtLength})`);let n=this.view.getInt8(this.pos+r),e=this.decodeBinary(i,r+1);return this.extensionCodec.decode(e,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 i=this.view.getUint8(this.pos);return this.pos++,i}readI8(){let i=this.view.getInt8(this.pos);return this.pos++,i}readU16(){let i=this.view.getUint16(this.pos);return this.pos+=2,i}readI16(){let i=this.view.getInt16(this.pos);return this.pos+=2,i}readU32(){let i=this.view.getUint32(this.pos);return this.pos+=4,i}readI32(){let i=this.view.getInt32(this.pos);return this.pos+=4,i}readU64(){let i=xe(this.view,this.pos);return this.pos+=8,i}readI64(){let i=xr(this.view,this.pos);return this.pos+=8,i}readU64AsBigInt(){let i=this.view.getBigUint64(this.pos);return this.pos+=8,i}readI64AsBigInt(){let i=this.view.getBigInt64(this.pos);return this.pos+=8,i}readF32(){let i=this.view.getFloat32(this.pos);return this.pos+=4,i}readF64(){let i=this.view.getFloat64(this.pos);return this.pos+=8,i}}function yn(i,r){return new sr(r).decode(i)}class di{listeners=new Map;addEventListener(i,r){let n=this.listeners.get(i);if(!n)n=new Set,this.listeners.set(i,n);return n.add(r),()=>{this.removeEventListener(i,r)}}removeEventListener(i,r){let n=this.listeners.get(i);if(n){if(n.delete(r),n.size===0)this.listeners.delete(i)}}emit(i,r){let n=this.listeners.get(i);if(n){let e=Array.from(n);for(let t of e)t(r)}}emitAll(i){let r=Array.from(this.listeners.keys());for(let n of r)this.emit(n,i)}}class Vi{getter;static eventName="update";emitter;constructor(i){this.getter=i;this.emitter=new di}get=()=>this.getter();async emit(){let i=await this.getter();queueMicrotask(()=>this.emitter.emit(Vi.eventName,i))}listen(i){return this.emitter.addEventListener(Vi.eventName,i),()=>{this.emitter.removeEventListener(Vi.eventName,i)}}}var Fi=64;var Be=32,Ri=8;var kr=32;var _e=30000,Se=512,G;((U)=>{U[U.Success=0]="Success";U[U.InvalidSignature=3]="InvalidSignature";U[U.ClockOutOfSync=4]="ClockOutOfSync";U[U.UserNotRegistered=5]="UserNotRegistered";U[U.ServerMisconfigured=6]="ServerMisconfigured";U[U.MissingBody=7]="MissingBody";U[U.ExtraBodyContent=8]="ExtraBodyContent";U[U.MissingParam=9]="MissingParam";U[U.InvalidParam=10]="InvalidParam";U[U.InvalidRequest=11]="InvalidRequest";U[U.InternalError=12]="InternalError";U[U.NotFound=13]="NotFound";U[U.InvalidMessage=14]="InvalidMessage";U[U.NoChange=15]="NoChange";U[U.DatabaseClosed=16]="DatabaseClosed";U[U.StorageError=17]="StorageError";U[U.DatabaseError=18]="DatabaseError";U[U.HashMismatch=19]="HashMismatch";U[U.DecryptionError=20]="DecryptionError";U[U.NotImplemented=21]="NotImplemented";U[U.MissingSeed=22]="MissingSeed";U[U.OutOfBounds=23]="OutOfBounds";U[U.HostError=24]="HostError";U[U.CommunicationError=25]="CommunicationError";U[U.VarLimitExceeded=26]="VarLimitExceeded";U[U.InvalidResponse=27]="InvalidResponse";U[U.ConnectionClosed=28]="ConnectionClosed"})(G||={});function u(i){return[i,0]}function l(i){return[void 0,i]}function y$(i){if(i<0)console.info("N",i),console.trace();if(typeof i!=="bigint")i=BigInt(i);if(i<0n)return l(10);let r=[];while(i>0n){let n=Number(i&0x7fn);if(i>>=7n,i>0n)r.push(n|128);else r.push(n)}if(r.length===0)return u(new Uint8Array([0]));if(r.length>8)return l(26);return u(new Uint8Array(r))}function P$(i,r=0){let n=0n,e=0,t=r;while(!0){if(t>=i.length)return l(14);let $=i[t++];if($===void 0)return l(14);if(n|=BigInt($&127)<<BigInt(e),($&128)===0){if(t-r>8)return l(26);return u({value:n>0x1fffffffffffffn?n:Number(n),bytesRead:t-r})}if(e+=7,e>=56)return l(26)}}class N{data;pos=0;constructor(i){this.data=i}static async fromResponse(i){let r=await i.arrayBuffer(),n=new Uint8Array(r);return new N(n)}readBigInt(){if(this.pos+8>this.data.length)return l(7);let i=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,u(i)}readDate(){let[i,r]=this.readVarInt();if(r!==0)return l(r);return u(new Date(i))}readVarInt(){let[i,r]=P$(this.data,this.pos);if(r!==0)return l(r);this.pos+=i.bytesRead;let n=i.value;return u(typeof n==="bigint"?Number(n):n)}readVarString(){let[i,r]=this.readVarInt();if(r!==0)return l(r);let[n,e]=this.readBytes(i);if(e!==0)return l(e);let t=new TextDecoder().decode(n);return u(t)}readBytes(i){if(i<0)return l(10);if(this.pos+i>this.data.length)return l(23);let r=this.data.slice(this.pos,this.pos+i);return this.pos+=i,u(r)}readVarBytes(){let[i,r]=this.readVarInt();if(r!==0)return l(r);return this.readBytes(i)}readStruct(i){return i.decode(this)}readStructs(i){let r=[];while(!this.done()){let[n,e]=this.readStruct(i);if(e!==0)return l(e);r.push(n)}return u(r)}readBytesSeq(i){let r=[];while(!this.done()){let[n,e]=this.readBytes(i);if(e!==0)return l(e);r.push(n)}return u(r)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class O{parts=[];writeBigInt(i){let r=new Uint8Array(8);new DataView(r.buffer).setBigUint64(0,i,!1),this.parts.push(r)}writeDate(i){let r=i.getTime();return this.writeVarInt(r)}writeVarInt(i){let[r,n]=y$(i);if(n!==0)return n;return this.parts.push(r),0}writeVarString(i){let r=new TextEncoder().encode(i),n=this.writeVarInt(r.length);if(n!==0)return n;return this.writeBytes(r),0}prependBytes(i){this.parts.unshift(i)}writeBytes(i){this.parts.push(i)}writeVarBytes(i){let r=this.writeVarInt(i.length);if(r!==0)return r;return this.writeBytes(i),0}writeStruct(i,r){return i.encode(this,r)}writeStructs(i,r){for(let n of r){let e=this.writeStruct(i,n);if(e!==0)return e}return 0}writeBytesSeq(i){for(let r of i)this.writeBytes(r)}result(){let i=this.parts.reduce((e,t)=>e+t.length,0),r=new Uint8Array(i),n=0;for(let e of this.parts)r.set(e,n),n+=e.length;return r}*scan(){for(let i of this.parts)yield i}}async function Pn(i,r){let n=new O,e=n.writeDate(r);if(e!==0)return l(e);let t=n.result(),$=await i.sign(t);return u({pubKey:i.publicKey,sig:$,timestamp:r})}async function Ni(i,r,n){let e=n.now().getTime(),t=i.timestamp.getTime();if(Math.abs(e-t)>_e)return 4;let f=new O;f.writeDate(i.timestamp);let Z=f.result();if(!await r.checkSigEd25519(i.sig,Z,i.pubKey))return 3;return 0}var _={encode(i,r){let n=i.writeVarBytes(r.id);if(n!==0)return n;let e=i.writeDate(r.ts);if(e!==0)return e;return 0},decode(i){let[r,n]=i.readVarBytes();if(n!==0)return l(n);let[e,t]=i.readDate();if(t!==0)return l(t);return u({id:r,ts:e})}};function rr(i){let r=new O,n=r.writeStruct(_,i);if(n!==0)return l(n);let e=r.result();return u(e)}async function q$(i){return rr({id:i,ts:new Date(0)})}var li={encode(i,r){let n=i.writeVarBytes(r.eid);if(n!==0)return n;let e=i.writeVarInt(r.off);if(e!==0)return e;let t=i.writeVarInt(r.ctr);if(t!==0)return t;let $=i.writeVarInt(r.len);if($!==0)return $;if(r.hsh)i.writeBytes(r.hsh);return 0},decode(i){let[r,n]=i.readVarBytes();if(n!==0)return l(n);let e=new N(r),[,t]=_.decode(e);if(t!==0)return l(t);let[$,f]=i.readVarInt();if(f!==0)return l(f);let[Z,J]=i.readVarInt();if(J!==0)return l(J);let[h,Q]=i.readVarInt();if(Q!==0)return l(Q);let w;if(h>0){let[V,Y]=i.readBytes(kr);if(Y!==0)return l(Y);w=V}return u({eid:r,off:$,ctr:Z,len:h,hsh:w})}};function fi(i){return Array.from(i).map((n)=>n.toString(16).padStart(2,"0")).join("")}function Oi(i){if(i.length%2!==0)throw Error("Invalid hex string");let r=new Uint8Array(i.length/2);for(let n=0;n<i.length;n+=2)r[n/2]=Number.parseInt(i.substr(n,2),16);return r}function b(i,r){if(i===r)return!0;if(i.byteLength!==r.byteLength)return!1;return i.every((n,e)=>n===r[e])}var d;if(typeof Uint8Array.prototype.toBase64==="function")d=(i)=>i.toBase64();else d=(i)=>btoa(String.fromCharCode(...i));var v;if(typeof Uint8Array.fromBase64==="function")v=(i)=>Uint8Array.fromBase64(i);else v=(i)=>Uint8Array.from(atob(i),(r)=>r.charCodeAt(0));function qn(i){return d(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Cn(i){let r=i.length%4===0?"":"=".repeat(4-i.length%4),n=i.replace(/-/g,"+").replace(/_/g,"/")+r;return v(n)}function zr(i,r){let n=new Uint8Array(i.length+r.length);return n.set(i,0),n.set(r,i.length),n}function Ee(i,r,n){return n.checkSigEd25519(i.sig,i.headCph,r)}async function ve(i,r,n,e){let t;if(i.bod&&i.len>0)t=await n.blake3(i.bod);let $=new O,f=li.encode($,{...i,hsh:t});if(f!==0)return l(f);let Z=$.result(),J=await r.kdmFor(Z),h=e.deriveCipher(J,"encrypt"),Q=await h.encrypt(Z),w=i.bod?await h.encrypt(i.bod):new Uint8Array(0),V=await r.sign(Q);return u({sig:V,kdm:J,headCph:Q,bodyCph:w})}async function Mn(i,r,n,e,t){let $=new N(i),[f,Z]=li.decode($);if(Z!==0)return l(14);let J;try{J=r&&r.length>0?await n.decrypt(r):void 0}catch{return l(20)}let h=f.hsh&&J===void 0,Q=f.hsh===void 0&&J!==void 0;if(h||Q)return l(19);if(f.hsh&&J){let V=await e.blake3(J);if(!b(V,f.hsh))return l(19)}let w=t??await e.blake3(i);return u({msgHead:f,bod:J,headHash:w})}class Ii{now(){return new Date}}function be(i,r,n,e){let t=r.getTime()-i.getTime(),$=n.getTime()-e.getTime();return(t+$)/2}var Ur={encode(i,r){if(i.writeVarInt(r.quota),r.quota>0){if(r.usage===void 0)return 9;i.writeVarInt(r.usage)}return 0},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);let e;if(r>0){let[t,$]=i.readVarInt();if($!==0)return l($);e=t}return u({quota:r,usage:e})}};var Hn={encode(i,r){i.writeBytes(new Uint8Array([r.status]));let n=i.writeDate(r.timeRcvd);if(n!==0)return n;let e=i.writeDate(r.timeSent);if(e!==0)return e;let t=i.writeVarInt(r.subscription.term);if(t!==0)return t;let $=i.writeVarInt(r.subscription.elapsed);if($!==0)return $;let f=i.writeStruct(Ur,r.subscription.stat);if(f!==0)return f;let Z=i.writeStruct(Ur,r.subscription.dyn);if(Z!==0)return Z;return 0},decode(i){let[r,n]=i.readBytes(1);if(n!==0)return l(n);let e=r[0],[t,$]=i.readDate();if($!==0)return l($);let[f,Z]=i.readDate();if(Z!==0)return l(Z);let[J,h]=i.readVarInt();if(h!==0)return l(h);let[Q,w]=i.readVarInt();if(w!==0)return l(w);let[V,Y]=i.readStruct(Ur);if(Y!==0)return l(Y);let[X,c]=i.readStruct(Ur);if(c!==0)return l(c);return u({status:e,timeRcvd:t,timeSent:f,subscription:{term:J,elapsed:Q,stat:V,dyn:X}})}};var An={encode(i,r){let n=i.writeVarBytes(r.headCph);if(n!==0)return n;let e=i.writeVarInt(r.seq);if(e!==0)return e;return 0},decode(i){let[r,n]=i.readVarBytes();if(n!==0)return l(n);let[e,t]=i.readVarInt();if(t!==0)return l(t);return u({headCph:r,seq:e})}};var Zi={encode(i,r){i.writeBytes(r.pubKey),i.writeBytes(r.sig);let n=i.writeDate(r.timestamp);if(n!==0)return n;return 0},decode(i){let[r,n]=i.readBytes(Be);if(n!==0)return l(n);let[e,t]=i.readBytes(Fi);if(t!==0)return l(t);let[$,f]=i.readDate();if(f!==0)return l(f);return u({pubKey:r,sig:e,timestamp:$})}};var it={async encodeReq(i,r,n,e,t){let $=t.writeStruct(Zi,n);if($!==0)return $;for(let f of e)t.writeVarInt(f);return 0},async handleReq(i,r,n){let{clock:e,crypto:t,storage:$}=i,[f,Z]=r.readStruct(Zi);if(Z!==0)return Z;let J=await Ni(f,t,e);if(J!==0)return J;let{pubKey:h}=f,[Q,w]=await $.hasUser(h);if(w!==0)return w;if(!Q)return 5;let[V,Y]=r.readVarInt();if(Y!==0)return Y;if(!r.done())return 8;let[X,c]=await $.listHeads(h,V);if(c!==0)return c;return n.writeStructs(An,X)},decodeResp(i){return i.readStructs(An)}};var Tn={encode(i,r){i.writeVarInt(r.seq);let n=i.writeVarBytes(r.bodyCph);if(n!==0)return n;return 0},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);let[e,t]=i.readVarBytes();if(t!==0)return l(t);return u({seq:r,bodyCph:e})}};var rt={async encodeReq(i,r,n,e,t){let $=t.writeStruct(Zi,n);if($!==0)return $;for(let f of e){let Z=t.writeVarInt(f);if(Z!==0)return Z}return 0},async handleReq(i,r,n){let{clock:e,crypto:t,storage:$}=i,[f,Z]=r.readStruct(Zi);if(Z!==0)return Z;let J=await Ni(f,t,e);if(J!==0)return J;let{pubKey:h}=f,[Q,w]=await $.hasUser(h);if(w!==0)return w;if(!Q)return 5;let V=[];while(!r.done()){let[c,W]=r.readVarInt();if(W!==0)return W;V.push(c)}console.info(`PULL: ${V.length} bags`);let[Y,X]=await $.getBodies(h,V);if(X!==0)return X;if(!Y)return 17;for(let{seq:c,bodyCph:W}of Y){let z={seq:c,bodyCph:W},g=n.writeStruct(Tn,z);if(g!==0)return g}return 0},decodeResp(i){return i.readStructs(Tn)}};var Dn={encode(i,r){i.writeBytes(r.sig),i.writeBytes(r.kdm);let n=i.writeVarBytes(r.headCph);if(n!==0)return n;let e=i.writeVarBytes(r.bodyCph);if(e!==0)return e;return 0},decode(i){let[r,n]=i.readBytes(Fi);if(n!==0)return l(n);let[e,t]=i.readBytes(Ri);if(t!==0)return l(t);let[$,f]=i.readVarBytes();if(f!==0)return l(f);let[Z,J]=i.readVarBytes();if(J!==0)return l(J);return u({sig:r,kdm:e,headCph:$,bodyCph:Z})}};var Br={encode(i,r){let n=i.writeVarInt(r.seq);if(n!==0)return n;let e=i.writeVarBytes(r.headCph);if(e!==0)return e;let t=r.bodyCph?r.bodyCph.length:0,$=i.writeVarInt(t);if($!==0)return $;if(t>0){if(!r.bodyCph)return 10;i.writeBytes(r.bodyCph)}return 0},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);let[e,t]=i.readVarBytes();if(t!==0)return l(t);let[$,f]=i.readVarInt();if(f!==0)return l(f);let Z;if($>0){let[J,h]=i.readBytes($);if(h!==0)return l(h);Z=J}return u({seq:r,headCph:e,bodyCph:Z})}};var _r={encode(i,r){i.writeBytes(r.sig),i.writeBytes(r.kdm);let n=i.writeVarBytes(r.headCph);if(n!==0)return n;return 0},decode(i){let[r,n]=i.readBytes(Fi);if(n!==0)return l(n);let[e,t]=i.readBytes(Ri);if(t!==0)return l(t);let[$,f]=i.readVarBytes();if(f!==0)return l(f);return u({sig:r,kdm:e,headCph:$})}};var Sr={encode(i,r){if(i.writeVarInt(r.idx),i.writeBytes(new Uint8Array([r.status])),r.status===0)i.writeVarInt(r.seq);return 0},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);let[e,t]=i.readBytes(1);if(t!==0)return l(t);let $=e[0];if($!==0)return u({idx:r,status:$});let[f,Z]=i.readVarInt();if(Z!==0)return l(Z);return u({idx:r,status:$,seq:f})}};var nt={async encodeReq(i,r,n,e,t){let $=t.writeStruct(Zi,n);if($!==0)return $;let f=t.writeStructs(Dn,e);if(f!==0)return f;return 0},async handleReq(i,r,n){let{clock:e,crypto:t,storage:$,notifier:f}=i,[Z,J]=r.readStruct(Zi);if(J!==0)return J;let h=await Ni(Z,t,e);if(h!==0)return h;let{pubKey:Q}=Z,[w,V]=await $.hasUser(Q);if(V!==0)return V;if(!w)return 5;let[Y,X]=r.readStructs(Dn);if(X!==0)return X;console.info(`PUSH: ${Y.length} bags`);let c=[],W=[];for(let I=0;I<Y.length;I++){let m=Y[I];if(!await Ee(m,Q,t)){let C={idx:I,status:3},q=n.writeStruct(Sr,C);if(q!==0)return q;continue}c.push(I),W.push(m)}let[z,g]=await $.setBags(Q,W);if(g!==0)return g;if(!z||z.length!==W.length)return 17;let K=[];for(let I=0;I<W.length;I++){let m=W[I],R=c[I],C=z[I],q=new O,y=q.writeStruct(_r,m);if(y!==0)return y;let H=q.result(),U={seq:C,headCph:H};if(Y.length===1&&m.bodyCph.length<=Se)U.bodyCph=m.bodyCph;K.push(U);let D={idx:R,status:0,seq:C},x=n.writeStruct(Sr,D);if(x!==0)return x}if(K.length>0){let I=new O,m=I.writeStructs(Br,K);if(m!==0)return m;let R=I.result();await Promise.resolve(f.push(Q,R))}return 0},decodeResp(i){return i.readStructs(Sr)}};var et={async encodeReq(i,r,n,e,t){return t.writeStruct(Zi,n)},async handleReq(i,r,n){let{clock:e,crypto:t,storage:$}=i,[f,Z]=r.readStruct(Zi);if(Z!==0)return Z;let J=await Ni(f,t,e);if(J!==0)return J;let{pubKey:h}=f;if(!r.done())return 8;let[Q,w]=await $.addUser(h);if(w!==0)return w;return 0},decodeResp(i){return u(void 0)}};class pn{url;websocket;constructor(i){this.url=i}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(i,r,n=()=>{},e=()=>{}){let{url:t}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let $=new O;$.writeStruct(Zi,i);let f=$.result(),Z=fi(f);return t.searchParams.set("t",Z),this.websocket=new WebSocket(t),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),e()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,n()},this.websocket.onmessage=(J)=>{let h=new Uint8Array(J.data);r(h)},this.websocket.onerror=(J)=>{console.log(`ERROR: ${JSON.stringify(J)}`),this.websocket=void 0,n()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}var S={user:{path:"/user",endpoint:et,name:0},push:{path:"/push",endpoint:nt,name:2},peek:{path:"/peek",endpoint:it,name:1},pull:{path:"/pull",endpoint:rt,name:3}},C$={0:S.user,2:S.push,1:S.peek,3:S.pull},_l={[S.user.path]:S.user,[S.push.path]:S.push,[S.peek.path]:S.peek,[S.pull.path]:S.pull};class xn{url;listener;constructor(i){this.url=i;this.listener=new pn(i)}async call(i,r){let{path:n}=C$[i],e=new URL(n,this.url);try{return await M$(e,r)}catch{return l(25)}}}var Er=(i)=>{return new xn(i.handle)};async function M$(i,r){let n=await fetch(i,{method:"POST",body:r.result().slice()});if(!n.ok)return l(24);let e=await N.fromResponse(n);return u(e)}class vr{enclave;crypto;host;clock;transport;updateHostMeta;constructor(i,r,n,e,t,$){this.enclave=i;this.crypto=r;this.host=n;this.clock=e;this.transport=t;this.updateHostMeta=$}async call(i,r){let{clock:n,transport:e}=this,{endpoint:t,name:$}=i,f=await this.identity(),Z=n.now(),[J,h]=await Pn(f,Z);if(h!==0)return l(h);let Q=new O,w=await t.encodeReq(this,f,J,r,Q);if(w!==0)return l(w);let V=n.now(),[Y,X]=await e.call($,Q),c=n.now();if(X!==0)return l(X);let[W,z]=Y.readStruct(Hn);if(z!==0)return l(z);if(W.status!==0)return l(W.status);let K={clockOffset:be(V,W.timeRcvd,W.timeSent,c),subscription:W.subscription},I=await this.updateHostMeta(K);if(I!==0)return l(I);return t.decodeResp(Y)}identity=()=>{let{host:i,enclave:r}=this;return r.deriveIdentity(i.label,i.idx??0)};seal=async(i)=>{let{crypto:r,enclave:n}=this,e=await this.identity();return ve(i,e,r,n)};register=()=>this.call(S.user,[]);peek=(i)=>this.call(S.peek,[i]);push=(i)=>this.call(S.push,i);pull=(i)=>this.call(S.pull,i);listen=async(i,r,n)=>{let{clock:e,transport:t}=this,{listener:$}=t,f=await this.identity(),Z=e.now(),[J,h]=await Pn(f,Z);if(h!==0)return h;return await $.connect(J,i,r,n)};isConnected(){let i=this.transport?.listener;if(i&&typeof i.connected==="function")return i.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}var jn={encode(i,r){let n=i.writeVarString(r.lbl);if(n!==0)return n;let e=i.writeVarInt(r.idx);if(e!==0)return e;let t=i.writeVarInt(r.num);if(t!==0)return t;return i.writeBytes(r.hsh),i.writeBytes(r.sig),0},decode(i){let[r,n]=i.readVarString();if(n!==0)return l(n);let[e,t]=i.readVarInt();if(t!==0)return l(t);let[$,f]=i.readVarInt();if(f!==0)return l(f);let[Z,J]=i.readBytes(kr);if(J!==0)return l(J);let[h,Q]=i.readBytes(Fi);if(Q!==0)return l(Q);return u({lbl:r,idx:e,num:$,hsh:Z,sig:h})}};var Ln={encode(i,r){let n=i.writeStruct(jn,r.head);if(n!==0)return n;let e=i.writeVarBytes(r.indexEnc);if(e!==0)return e;let t=i.writeVarBytes(r.bodyEnc);if(t!==0)return t;return 0},decode(i){let[r,n]=i.readStruct(jn);if(n!==0)return l(n);let[e,t]=i.readVarBytes();if(t!==0)return l(t);let[$,f]=i.readVarBytes();if(f!==0)return l(f);return u({head:r,indexEnc:e,bodyEnc:$})}};var sn={encode(i,r){i.writeBytes(r.kdm);let n=i.writeVarBytes(r.headCph);if(n!==0)return n;let e=i.writeVarInt(r.lenBody);if(e!==0)return e;if(r.lenBody>0&&r.offBody!==void 0){let t=i.writeVarInt(r.offBody);if(t!==0)return t}return 0},decode(i){let[r,n]=i.readBytes(Ri);if(n!==0)return l(n);let[e,t]=i.readVarBytes();if(t!==0)return l(t);let[$,f]=i.readVarInt();if(f!==0)return l(f);let Z;if($>0){let[J,h]=i.readVarInt();if(h!==0)return l(h);Z=J}return u({kdm:r,headCph:e,lenBody:$,offBody:Z})}};async function tt(i,r,n,e,t){let $=await t.deriveIdentity(i,r),f=new O,Z=new O,J=0,h=0;for(let z of n){let g=new O,K=g.writeStruct(li,z.head);if(K!==0)return l(K);let I=g.result(),m=await $.kdmFor(I),R=t.deriveCipher(m,"encrypt"),C=await R.encrypt(I),q=z.body?await R.encrypt(z.body):new Uint8Array(0),y=z.head.len>0&&z.head.hsh!==void 0?q.length:0,H={kdm:m,headCph:C,lenBody:y,offBody:y>0?h:void 0},U=f.writeStruct(sn,H);if(U!==0)return l(U);if(z.body)Z.writeBytes(q),h+=q.length;J++}let Q=Z.result(),w=f.result(),V=await e.blake3(w),Y=await $.sign(V),X={lbl:i,idx:r,num:J,hsh:V,sig:Y},c=new O;c.writeStruct(Ln,{head:X,indexEnc:w,bodyEnc:Q});let W=c.result();return u(W)}async function $t(i,r,n){let[e,t]=Ln.decode(new N(i));if(t!==0)return l(t);let{head:$,indexEnc:f,bodyEnc:Z}=e,J=await n.deriveIdentity($.lbl,$.idx);if(!await r.checkSigEd25519($.sig,$.hsh,J.publicKey))return l(3);let Q=await r.blake3(f);if(!b(Q,$.hsh))return l(19);let w=new N(f),V=[];for(let X=0;X<$.num;X++){let[c,W]=w.readStruct(sn);if(W!==0)return l(W);V.push(c)}if(V.length!==$.num)return l(14);let Y=[];for(let X of V){let c=n.deriveCipher(X.kdm,"decrypt"),W;try{W=await c.decrypt(X.headCph)}catch{return l(20)}let[z,g]=li.decode(new N(W));if(g!==0)return l(g);let K;if(X.lenBody>0&&X.offBody!==void 0){if(z.hsh===void 0)return l(14);let I=Z.slice(X.offBody,X.offBody+X.lenBody);try{K=await c.decrypt(I)}catch{return l(20)}let m=await r.blake3(K);if(!b(m,z.hsh))return l(19)}Y.push({head:z,body:K})}return u(Y)}async function ft({now:i,bod:r,crypto:n}){let e=await n.genRandomBytes(8),t=new O,$=t.writeStruct(_,{id:e,ts:i});if($!==0)return l($);let f=t.result();return br({now:i,eid:f,ctr:0,bod:r,crypto:n})}async function br({now:i,eid:r,ctr:n,bod:e,crypto:t}){let $=new N(r),[f,Z]=_.decode($);if(Z!==0)return l(Z);let J=i.getTime()-f.ts.getTime(),h,Q=e?.length??0;if(e&&Q>0)h=await t.blake3(e);return u({eid:r,off:J,ctr:n,len:Q,hsh:h})}function Zt(i,r){let n=i.length<r.length?i.length:r.length;for(let e=0;e<n;e++)if(i[e]!==r[e])return i[e]-r[e];return i.length-r.length}async function nr(i,r){let n=Array.from(i);n.sort(Zt);let e=0;for(let f of n)e+=f.length;let t=new Uint8Array(e),$=0;for(let f of n)t.set(f,$),$+=f.length;return r.blake3(t)}function lt(i){let r=new O,n=r.writeVarBytes(i.eid);if(n!==0)return l(n);let e=r.writeDate(i.updatedAt);if(e!==0)return l(e);let t=r.writeVarInt(i.ctr);if(t!==0)return l(t);return u(r.result())}async function Kr(i,r){let n=[];for(let e of i){let[t,$]=lt(e);if($!==0||!t)return l($);n.push(t)}return u(await nr(n,r))}var pJ=Symbol("MasterSeed"),xJ=Symbol("SealedMasterKey"),ui=32,kn=24+ui+16;function ii(i){if(i.byteLength!==ui)return l(10);return u(i)}function gi(i){if(i.byteLength!==kn)return l(10);return u(i)}var LJ=Symbol("EntityID");function Jt(i){return"type"in i}var sJ=Symbol("DerivationSeed"),kJ=Symbol("PublicKey"),BJ=Symbol("PrivateKey"),_J=Symbol("HostSpecificKeyPair"),SJ=Symbol("Hash");function H$(i){if(!i)return!1;if(typeof i!=="object")return!1;if("body"in i===!1)return!1;if("type"in i===!1)return!1;return!0}function A$(i){if(!i.bod||i.bod.length===0){let e={off:i.off,ctr:i.ctr,eid:i.eid};return u(e)}let r=yn(i.bod);if(H$(r)===!1)return console.warn("msg body invalid",r),l(14);let n={off:i.off,ctr:i.ctr,eid:i.eid,gid:r.gid,pid:r.pid,tags:r.tags,type:r.type,body:r.body};return u(n)}class Gr{applier;emitter=new di;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(i,r,n,e){this.applier=i;this.clearer=r,this.onDirtyEids=n,this.cacheDriven=e?.cacheDriven??!1,this.peerIngest=e?.peerIngest}apply=async(i)=>{let r=[],n=[];for(let Z of i){let[J,h]=A$(Z);if(n.push(h),h!==0)continue;r.push(J)}let{stats:e,types:t,eids:$}=await this.applier(r),f=[];for(let Z=0;Z<i.length;Z++){let J=n[Z],h=e[Z];if(J!==0){f.push(J);continue}if(h!==0){f.push(h);continue}f.push(0)}if(!this.cacheDriven)for(let Z of t)this.emitter.emit(Z,null);if($.length>0)this.onDirtyEids?.($);return f};clear=async()=>{let i=await this.clearer();if(i!==0)return i;return this.emitter.emitAll(null),i};notify=(i)=>{for(let r of i)this.emitter.emit(r,null)};refresh=async(i)=>{if(this.peerIngest){await this.peerIngest(i);return}};on=(i,r)=>{this.emitter.addEventListener(i,r)};off=(i,r)=>{this.emitter.removeEventListener(i,r)}}var Bn={apply:async function(i){return i.map(()=>0)},clear:async function(){return 0},notify:function(i){},refresh:async function(i){},on:function(i,r){},off:function(i,r){}};var L="entities",rn="entity_type_created_at",Sn="entity_type_updated_at",En="entity_type_group_id",vn="entity_type_parent_id",er="entity_tags",ht="db",Qt=13;function T$(i){return"typ"in i}function D$(i){let r={bod:i.body,crd:i.createdAt,...i.ctr!==0?{ctr:i.ctr}:{},eid:d(i.eid),gid:i.gid,pid:i.pid?d(i.pid):void 0,tgs:i.tags,typ:i.type,upd:i.updatedAt};if(r.gid===void 0)delete r.gid;if(r.pid===void 0)delete r.pid;if(r.tgs===void 0)delete r.tgs;if(r.ctr===void 0)delete r.ctr;return r}function p$(i){if(!T(i))return{eid:d(i.eid),upd:i.updatedAt,...i.ctr!==0?{ctr:i.ctr}:{}};return D$(i)}function tr(i){return{body:i.bod,createdAt:i.crd,updatedAt:i.upd,ctr:i.ctr??0,type:i.typ,eid:v(i.eid),gid:i.gid,pid:i.pid?v(i.pid):void 0,...i.tgs!==void 0?{tags:i.tgs}:{}}}function _n(i){if(T$(i))return tr(i);return{eid:v(i.eid),updatedAt:i.upd,ctr:i.ctr??0}}class bn{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=j$().then((i)=>{return i.onversionchange=()=>{if(i.close(),this.db===i)this.db=void 0},this.db=i,this.opening=void 0,i},(i)=>{throw this.opening=void 0,i}),this.opening}apply=async(i)=>{let r=new Set,n=[],e;try{e=await this.ensureDb()}catch{return{stats:i.map(()=>16),types:r,eids:n}}let t=e.transaction(L,"readwrite"),$=t.objectStore(L);return new Promise((f)=>{let Z=Array(i.length).fill(0);if(i.length<1){f({stats:[],types:r,eids:n});return}t.oncomplete=()=>{f({stats:Z,types:r,eids:n})},t.onerror=()=>{for(let h=0;h<Z.length;h++)if(Z[h]===void 0)Z[h]=18;f({stats:Z,types:r,eids:n})};let J=new Map;for(let h=0;h<i.length;h++){let Q=i[h],w=d(Q.eid),V={op:Q,index:h},Y=J.get(w);if(Y)Y.push(V);else J.set(w,[V])}for(let[h,Q]of J){if(Q.length<1)continue;let w=$.get(h);w.onsuccess=()=>{let V=w.result,Y=V?_n(V):void 0,X=!1;for(let{op:c,index:W}of Q){let[z,g]=$r(Y,c);if(g!==0){Z[W]=g;continue}if(z===void 0){Z[W]=12;continue}X=!0;for(let K of fr(Y,z))r.add(K);Y=z}if(X)n.push(Q[0].op.eid);if(Y){let c=$.put(p$(Y));c.onerror=(W)=>{W.preventDefault();for(let{index:z}of Q)Z[z]=18}}},w.onerror=()=>{for(let{index:V}of Q)Z[V]=18}}})};async clear(){let i;try{i=await this.ensureDb()}catch{return 16}let r=i.transaction(L,"readwrite"),n=r.objectStore(L);return new Promise((e)=>{r.oncomplete=()=>e(0),r.onerror=()=>e(18),n.clear()})}async getRow(i){let r;try{r=await this.ensureDb()}catch{return l(16)}let n=d(i),t=r.transaction(L,"readonly").objectStore(L);return new Promise(($)=>{let f=t.get(n);f.onsuccess=()=>{let Z=f.result;if(!Z)$(u(void 0));else $(u(_n(Z)))},f.onerror=()=>$(l(18))})}async getEnt(i){let[r,n]=await this.getRow(i);if(n!==0)return l(n);if(r===void 0||!T(r))return u(void 0);return u(r)}async getAllOfTypeUpdatedBetween(i,r,n){let e;try{e=await this.ensureDb()}catch{return l(16)}let $=e.transaction(L,"readonly").objectStore(L).index(Sn);return new Promise((f)=>{let Z=$.getAll(IDBKeyRange.bound([i,r],[i,n]));Z.onsuccess=()=>{let J=Z.result;f(u(J.map(tr)))},Z.onerror=()=>f(l(18))})}async getGroupMembers(i,r){let n;try{n=await this.ensureDb()}catch{return l(16)}let t=n.transaction(L,"readonly").objectStore(L).index(En);return new Promise(($)=>{let f=t.getAll(IDBKeyRange.only([i,r]));f.onsuccess=()=>{let Z=f.result;$(u(Z.map(tr)))},f.onerror=()=>$(l(18))})}async getAllOfType(i){let r;try{r=await this.ensureDb()}catch{return l(16)}let e=r.transaction(L,"readonly").objectStore(L).index(rn);return new Promise((t)=>{let $=e.getAll(IDBKeyRange.bound([i],[i,[]]));$.onsuccess=()=>{let f=$.result;t(u(f.map(tr)))},$.onerror=()=>t(l(18))})}async getByTag(i,r){let n;try{n=await this.ensureDb()}catch{return l(16)}let t=n.transaction(L,"readonly").objectStore(L).index(er);return new Promise(($)=>{let f=t.getAll(IDBKeyRange.only(r));f.onsuccess=()=>{let J=f.result.filter((h)=>h.typ===i).map(tr);$(u(J))},f.onerror=()=>$(l(18))})}async getAllEntities(i){if("pid"in i){let r;try{r=await this.ensureDb()}catch{return l(16)}let n=d(i.pid),t=r.transaction(L,"readonly").objectStore(L).index(vn);return new Promise(($)=>{let f=t.getAll(IDBKeyRange.only([i.type,n]));f.onsuccess=()=>{let J=f.result.map(tr);$(u(J))},f.onerror=()=>$(l(18))})}else if("gid"in i)return await this.getGroupMembers(i.type,i.gid);else if("tag"in i)return await this.getByTag(i.type,i.tag);else if("updatedBetween"in i)return await this.getAllOfTypeUpdatedBetween(i.type,i.updatedBetween.start,i.updatedBetween.end);return await this.getAllOfType(i.type)}async getEntities(i){let[r,n]=await this.getAllEntities(i);if(n!==0)return l(n);return u(r)}async countEntities({type:i}){let r;try{r=await this.ensureDb()}catch{return l(16)}let e=r.transaction(L,"readonly").objectStore(L).index(rn);return new Promise((t)=>{let $=IDBKeyRange.bound([i],[i,[]]),f=e.count($);f.onsuccess=()=>t(u(f.result)),f.onerror=()=>t(l(18))})}async checksum(i){let r;try{r=await this.ensureDb()}catch{return l(16)}let e=r.transaction(L,"readonly").objectStore(L),t=[];return new Promise(($)=>{let f=e.openCursor();f.onsuccess=()=>{let Z=f.result;if(Z){let J=Z.value;t.push(or(_n(J))),Z.continue()}else Kr(t,i).then($)},f.onerror=()=>$(l(18))})}}function x$(i,r){if(!i.objectStoreNames.contains(L))i.createObjectStore(L,{keyPath:"eid",autoIncrement:!1});let n=r.objectStore(L);if(!n.indexNames.contains(rn))n.createIndex(rn,["typ","crd"],{unique:!1});if(!n.indexNames.contains(Sn))n.createIndex(Sn,["typ","upd"],{unique:!1});if(!n.indexNames.contains(En))n.createIndex(En,["typ","gid"],{unique:!1});if(!n.indexNames.contains(vn))n.createIndex(vn,["typ","pid"],{unique:!1});if(n.indexNames.contains(er)){if(n.index(er).keyPath!=="tgs")n.deleteIndex(er)}if(!n.indexNames.contains(er))n.createIndex(er,"tgs",{unique:!1,multiEntry:!0})}function j$(){return new Promise((i,r)=>{let n=indexedDB.open(ht,Qt);n.onupgradeneeded=()=>{let{result:e,transaction:t}=n;if(!t){r(Error("Transaction is null during EntDB upgrade"));return}try{x$(e,t)}catch($){r($ instanceof Error?$:Error(String($)))}},n.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${ht} → v${Qt}); waiting for other connections to close`)},n.onsuccess=()=>i(n.result),n.onerror=()=>r(n.error??Error("EntDB IndexedDB open failed"))})}async function wt(){let i=new bn;return await i.init(),i}class nn{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeGid=new Map;byTypeTag=new Map;constructor(i=[],r){this.useIndex=r?.indexes!==!1;for(let n of i)this.put(n)}put(i){let r=d(i.eid),n=this.ents.get(r);if(n!==void 0&&T(n))this.unindex(r,n);if(this.ents.set(r,i),T(i))this.index(r,i)}del(i){let r=this.ents.get(i);if(r===void 0)return;if(T(r))this.unindex(i,r);this.ents.delete(i)}index(i,r){if(!this.useIndex)return;let n=this.byType.get(r.type);if(!n)n=new Map,this.byType.set(r.type,n);if(n.set(i,r),r.pid){let e=d(r.pid),t=this.byTypePid.get(r.type);if(!t)t=new Map,this.byTypePid.set(r.type,t);let $=t.get(e);if(!$)$=new Map,t.set(e,$);$.set(i,r)}if(typeof r.gid==="string"){let e=this.byTypeGid.get(r.type);if(!e)e=new Map,this.byTypeGid.set(r.type,e);let t=e.get(r.gid);if(!t)t=new Map,e.set(r.gid,t);t.set(i,r)}if(r.tags){let e=this.byTypeTag.get(r.type);if(!e)e=new Map,this.byTypeTag.set(r.type,e);for(let t of r.tags){let $=e.get(t);if(!$)$=new Map,e.set(t,$);$.set(i,r)}}}unindex(i,r){if(!this.useIndex)return;let n=this.byType.get(r.type);if(n){if(n.delete(i),n.size===0)this.byType.delete(r.type)}if(r.pid){let e=d(r.pid),t=this.byTypePid.get(r.type),$=t?.get(e);if($){if($.delete(i),$.size===0)t?.delete(e)}if(t&&t.size===0)this.byTypePid.delete(r.type)}if(typeof r.gid==="string"){let e=this.byTypeGid.get(r.type),t=e?.get(r.gid);if(t){if(t.delete(i),t.size===0)e?.delete(r.gid)}if(e&&e.size===0)this.byTypeGid.delete(r.type)}if(r.tags){let e=this.byTypeTag.get(r.type);if(e){for(let t of r.tags){let $=e.get(t);if($){if($.delete(i),$.size===0)e.delete(t)}}if(e.size===0)this.byTypeTag.delete(r.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeGid.clear(),this.byTypeTag.clear()}bucketList(i){if(!i||i.size===0)return[];let r=[];for(let n of i.values())r.push(n);return r}async apply(i){let r=new Set,n=[],e=[];for(let t of i){let $=d(t.eid),f=this.ents.get($),[Z,J]=$r(f,t);if(J!==0){e.push(J);continue}if(Z===void 0){e.push(12);continue}for(let h of fr(f,Z))r.add(h);this.put(Z),n.push(t.eid),e.push(0)}return{stats:e,types:r,eids:n}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(i){let r=d(i),n=this.ents.get(r);return u(n)}async getEnt(i){let[r,n]=await this.getRow(i);if(n!==0)return l(n);if(r===void 0||!T(r))return u(void 0);return u(r)}async getAllEntities({type:i,gid:r,pid:n,tag:e,updatedBetween:t}){if(this.useIndex){if(n!==void 0){let f=d(n);return u(this.bucketList(this.byTypePid.get(i)?.get(f)))}if(r!==void 0)return u(this.bucketList(this.byTypeGid.get(i)?.get(r)));if(e!==void 0)return u(this.bucketList(this.byTypeTag.get(i)?.get(e)));if(t!==void 0){let f=[],Z=this.byType.get(i);if(Z){for(let J of Z.values())if(J.updatedAt>=t.start&&J.updatedAt<=t.end)f.push(J)}return u(f)}return u(this.bucketList(this.byType.get(i)))}let $=[];if(n!==void 0){for(let f of this.ents.values())if(T(f)&&f.type===i&&f.pid&&b(f.pid,n))$.push(f)}else if(r!==void 0){for(let f of this.ents.values())if(T(f)&&f.type===i&&(typeof f.gid==="string"&&f.gid===r))$.push(f)}else if(e!==void 0){for(let f of this.ents.values())if(T(f)&&f.type===i&&f.tags&&f.tags.includes(e))$.push(f)}else if(t!==void 0){for(let f of this.ents.values())if(T(f)&&f.type===i&&f.updatedAt>=t.start&&f.updatedAt<=t.end)$.push(f)}else for(let f of this.ents.values())if(T(f)&&f.type===i)$.push(f);return u($)}async getEntities(i){let[r,n]=await this.getAllEntities(i);if(n!==0)return l(n);return u(r)}async countEntities({type:i}){if(this.useIndex)return u(this.byType.get(i)?.size??0);let r=0;for(let n of this.ents.values())if(T(n)&&n.type===i)r+=1;return u(r)}async checksum(i){let r=[];for(let n of this.ents.values())r.push(or(n));return Kr(r,i)}}async function ie(i){let r=await wt();if(i?.cache===!1)return r;return new mr(r,void 0,{indexes:i?.indexes})}class mr{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();constructor(i,r,n){if(this.durable=i,this.mem=new nn(r??[],{indexes:n?.indexes}),r)for(let e of r)this.warmed.add(e.type)}subscribe(i){return this.listeners.add(i),()=>{this.listeners.delete(i)}}emit(i){if(i.size<1)return;for(let r of this.listeners)r(i)}run(i){let r=this.chain.then(i,i);return this.chain=r.then(()=>{return},()=>{return}),r}apply(i){return this.run(async()=>{await this.pullEids(i.map(($)=>$.eid));let r=S$(this.mem,i);this.emit(r.types);let n=await this.durable.apply(i),{changed:e,status:t}=await this.pullEids(i.map(($)=>$.eid));if(this.emit(e),t!==0)return{stats:i.map(()=>t),types:n.types,eids:n.eids};return n})}clear(){return this.run(async()=>{let i=await this.durable.clear();if(i!==0)return i;let r=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(i){return this.run(async()=>{let{changed:r,status:n}=await this.pullEids(i);return this.emit(r),n})}async pullEids(i){let r=new Set,n=new Set;for(let e of i){let t=d(e);if(n.has(t))continue;n.add(t);let $=this.mem.ents.get(t),[f,Z]=await this.durable.getRow(e);if(Z!==0)return{changed:r,status:Z};if(f){if(this.mem.put(f),!$||!L$($,f)){if(T(f))r.add(f.type);if($!==void 0&&T($))r.add($.type)}}else if($!==void 0){if(this.mem.del(t),T($))r.add($.type)}}return{changed:r,status:0}}async warmType(i){if(this.warmed.has(i))return 0;let[r,n]=await this.durable.getEntities({type:i});if(n!==0)return n;if(r)for(let e of r){let t=d(e.eid),$=this.mem.ents.get(t);if(!$||_$(e,$))this.mem.put(e)}return this.warmed.add(i),0}async getRow(i){let r=d(i);if(this.mem.ents.has(r))return this.mem.getRow(i);return this.run(async()=>{if(this.mem.ents.has(r))return this.mem.getRow(i);let[n,e]=await this.durable.getRow(i);if(e!==0)return l(e);if(n)this.mem.put(n);return u(n)})}async getEnt(i){let[r,n]=await this.getRow(i);if(n!==0)return l(n);if(r===void 0||!T(r))return u(void 0);return u(r)}async getEntities(i){if(!this.warmed.has(i.type)){let r=await this.run(()=>this.warmType(i.type));if(r!==0)return l(r)}return this.mem.getEntities(i)}async countEntities({type:i}){if(!this.warmed.has(i)){let r=await this.run(()=>this.warmType(i));if(r!==0)return l(r)}return this.mem.countEntities({type:i})}async checksum(i){return this.durable.checksum(i)}}function L$(i,r){if(T(i)!==T(r))return!1;if(i.ctr!==r.ctr)return!1;if(i.updatedAt.getTime()!==r.updatedAt.getTime())return!1;if(!b(i.eid,r.eid))return!1;if(!T(i)||!T(r))return!0;if(i.createdAt.getTime()!==r.createdAt.getTime())return!1;if(i.type!==r.type)return!1;if(i.gid!==r.gid)return!1;if(!k$(i.pid,r.pid))return!1;if(!s$(i.tags,r.tags))return!1;return B$(i.body,r.body)}function s$(i,r){if(i===r)return!0;if(i===void 0||r===void 0)return!1;if(i.length!==r.length)return!1;for(let n=0;n<i.length;n++)if(i[n]!==r[n])return!1;return!0}function k$(i,r){if(i===void 0&&r===void 0)return!0;if(i===void 0||r===void 0)return!1;return b(i,r)}function B$(i,r){if(Object.is(i,r))return!0;if(i instanceof Uint8Array&&r instanceof Uint8Array)return b(i,r);if(i instanceof Date&&r instanceof Date)return i.getTime()===r.getTime();try{return b(Di(i),Di(r))}catch{return!1}}function _$(i,r){let n=i.updatedAt.getTime(),e=r.updatedAt.getTime();if(n!==e)return n>e;return i.ctr>r.ctr}function S$(i,r){let n=new Set,e=[];for(let t of r){let $=d(t.eid),f=i.ents.get($),[Z,J]=$r(f,t);if(J!==0){e.push(J);continue}if(Z===void 0){e.push(12);continue}for(let h of fr(f,Z))n.add(h);i.put(Z),e.push(0)}return{stats:e,types:n}}function en(i){if(i instanceof mr){let r=new Gr((n)=>i.apply(n),()=>i.clear(),void 0,{cacheDriven:!0,peerIngest:async(n)=>{await i.ingestFromDurable(n)}});return i.subscribe((n)=>r.notify(n)),r}return new Gr((r)=>i.apply(r),()=>i.clear())}function T(i){return"type"in i}function E$(i){return!T(i)}function ut(i){if(!Array.isArray(i)||i.length===0)return;let r=new Set,n=[];for(let e of i){if(typeof e!=="string"||e.length===0)continue;if(r.has(e))continue;r.add(e),n.push(e)}return n.length>0?n:void 0}function or(i){return{eid:i.eid,ctr:i.ctr,updatedAt:i.updatedAt}}function re(i){let r=new N(i.eid),[n,e]=r.readStruct(_);if(e!==0)return l(e);return u({eid:i.eid,ctr:i.ctr,updatedAt:new Date(n.ts.getTime()+i.off)})}function $r(i,r){let n=new N(r.eid),[e,t]=n.readStruct(_);if(t!==0)return l(t);let $=new Date(e.ts.getTime()+r.off);if(i!==void 0&&$<=i.updatedAt)return l(15);if(Jt(r)){let f=ut(r.tags);return u({eid:r.eid,gid:r.gid,pid:r.pid,...f!==void 0?{tags:f}:{},type:r.type,createdAt:e.ts,updatedAt:$,ctr:r.ctr,body:r.body})}return u({eid:r.eid,updatedAt:$,ctr:r.ctr})}function fr(i,r){let n=new Set;if(i!==void 0&&T(i))n.add(i.type);if(T(r))n.add(r.type);return[...n]}var v$={getEnt:async()=>l(21),getRow:async()=>l(21),getEntities:async(i)=>l(21),countEntities:async()=>l(21),checksum:async()=>l(21),apply:async(i)=>({stats:i.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};class tn{inflight=null;again=!1;run(i){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(i),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(i){try{this.again=!1;let r=await i();while(this.again)this.again=!1,r=await i();return r}finally{this.inflight=null}}}var $n=100;class ar{timer=null;delayMs;work;tail=new tn;constructor(i,r){this.delayMs=i<0?0:i,this.work=r}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 Vt(i){let r=new N(i.eid),[n,e]=_.decode(r);if(e!==0)return;return n.ts.getTime()+i.off}function b$(i,r){let n=Vt(i),e=Vt(r);if(n===void 0&&e===void 0)return 0;if(n===void 0)return 1;if(e===void 0)return-1;if(e!==n)return e-n;return r.ctr-i.ctr}function Zr(i,r){return i.slice().sort((n,e)=>b$(r(n),r(e)))}var pi={phase:"idle"},lr=50;function fn(i,r,n){if(i<=0||r<=0)return!1;if(i===1||i===r)return!0;return i%n===0}function Zn(i,r){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(i,r);return}let n=URL.createObjectURL(i),e=document.createElement("a");e.href=n,e.download=r,document.body.appendChild(e),e.click(),document.body.removeChild(e),URL.revokeObjectURL(n)}function Yt(i,r,n){let e=[],t=[],$=0;for(let f of i){let Z=r(f);if(t.length>0&&$+Z>n)e.push(t),t=[],$=0;if(t.push(f),$+=Z,$>=n)e.push(t),t=[],$=0}if(t.length>0)e.push(t);return e}async function ne(i,r,n){let e=i.length;if(e<1)return[];let t=Array(e),$=0,f=Math.min(Math.max(1,r),e),Z=async()=>{while(!0){let h=$;if($+=1,h>=e)return;t[h]=await n(i[h],h)}},J=[];for(let h=0;h<f;h++)J.push(Z());return await Promise.all(J),t}async function ln(i,r,n,e){let t=new N(i.headCph),[$,f]=t.readStruct(_r);if(f!==0)return l(f);let{sig:Z,kdm:J,headCph:h}=$;if(!await e.checkSigEd25519(Z,h,r))return l(3);let w=n.deriveCipher(J,"decrypt"),V;try{V=await w.decrypt(h)}catch{return l(20)}return u({kdm:J,headEnc:V})}var zi="f",yi="t",Yi="e";function i0(i){return i===zi||i===yi||i===Yi}function Jr(i){if(i===!0||i===yi)return yi;if(i===Yi)return Yi;return zi}function r0(i){return Jr(i.apld)===zi}function ee(i){return i!==0&&i!==15&&i!==18&&i!==17}function xi(i,r,n){if(i.apld=r,r===Yi&&n!==void 0)i.err=n;else delete i.err}async function Pi(i,r,n,e){let t=e?.body!==!1,$=Jr(r.apld),f=r.body,Z=f?.length??0,J;if(t&&f&&Z>0)J=await n.blake3(f);let h={eid:r.eid,off:r.off??0,ctr:r.ctr??0,len:Z,hsh:J},Q={hash:i,head:h,apld:$};if(t&&f!==void 0)Q.body=f;if($===Yi&&r.err!==void 0)Q.err=r.err;return Q}var te=1048576,$e=1048576,ct=64;function n0(i){return i.sig.length+i.kdm.length+i.headCph.length+i.bodyCph.length}async function e0(i,r,n,e,t){if(e.length<1)return 0;let[$,f]=await i.push(e);if(f!==0)return f;if(!$)return 27;for(let J of $){if(J.status!==0){console.error("push err",J);continue}let h=t[J.idx];if(!h){console.error("no hash",J);continue}await r.uploads.deq(n,[h])}let Z=await r.hosts.get(n);if(Z){let J=Z.lastSeq,h=J,Q=[];for(let w of $)if(w.status===0)Q.push(w.seq);Q.sort((w,V)=>w-V);for(let w of Q)if(w===J+1)J=w;if(J>h)await r.hosts.touch(n,J)}return 0}async function Xt(i,r){if(r.length<1)return u([]);let n=new Map,e=[];for(let Z of r)n.set(Z.seq,Z),e.push(Z.seq);let[t,$]=await i.pull(e);if($!==0)return l($);if(!t)return l(27);let f=[];for(let{seq:Z,bodyCph:J}of t){let h=n.get(Z);if(!h)continue;f.push({dl:h,bodyCph:J})}return u(f)}async function t0(i,r,n,e){if(e.length<1)return u({parts:[],hashes:[]});let t=[],$=[],f=[],Z=new Map;for(let{dl:h,bodyCph:Q}of e){let{head:w,kdm:V,seq:Y,host:X}=h,[c,W]=await Wt(h,n);if(W!==0||!c){let y=Z.get(X)??[];y.push(Y),Z.set(X,y);continue}let{headEnc:z,headEncHash:g}=c,K=r.deriveCipher(V,"decrypt"),[I,m]=await Mn(z,Q,K,n,g);if(m!==0||!I){let y=Z.get(X)??[];y.push(Y),Z.set(X,y);continue}let R={head:w,body:I.bod},C=I.headHash;f.push({key:C,data:zt(R)}),t.push(R),$.push(C);let q=Z.get(X)??[];q.push(Y),Z.set(X,q)}let J=await i.messages.add(f);for(let[h,Q]of Z)await i.downloads.deq(h,Q);for(let h=0;h<J.length;h++){let Q=J[h];if(Q!==0&&Q!==15)console.error("ERR storing",G[Q],"for message",h)}return u({parts:t,hashes:$})}async function Wt(i,r){let n=i.headEnc;if(!n){let t=new O,$=t.writeStruct(li,i.head);if($!==0)return l($);n=t.result()}if(i.headEncHash)return u({headEnc:n,headEncHash:i.headEncHash});let e=await r.blake3(n);return u({headEnc:n,headEncHash:e})}async function It(i,r,n){let e=new Set;for(let f of r)e.add(d(f));if(e.size<1)return;let t=Array.from(await i.downloads.list());if(t.length<1)return;let $=new Map;for(let f of t){let Z;if(f.headEncHash)Z=d(f.headEncHash);else{let[h,Q]=await Wt(f,n);if(Q!==0||!h)continue;Z=d(h.headEncHash)}if(!e.has(Z))continue;let J=$.get(f.host)??[];J.push(f.seq),$.set(f.host,J)}for(let[f,Z]of $)await i.downloads.deq(f,Z)}async function fe({conn:i,store:r,enclave:n,host:e,crypto:t,onProgress:$,peekProgressEvery:f,peekConcurrency:Z}){let J=await i.identity(),h=[],[Q,w]=await i.peek(e.lastSeq);if(w!==0)return w;let V=Q.length,Y=f??lr,X=Z??ct;if($&&V>0)$({phase:"peek",host:e.label,done:0,total:V});let c=0,W=await ne(Q,X,async(g)=>{let[K,I]=await ln(g,J.publicKey,n,t),m;if(I!==0||!K)m={ok:!1,seq:g.seq,stat:I};else{let R=await t.blake3(K.headEnc);m={ok:!0,seq:g.seq,kdm:K.kdm,headEnc:K.headEnc,headEncHash:R}}if(c+=1,$&&fn(c,V,Y))$({phase:"peek",host:e.label,done:c,total:V});return m}),z=new Set;for(let g of W){if(!g.ok){console.error("peek: decrypting item head",g.stat);continue}let K=d(g.headEncHash);if(await r.messages.has(g.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await r.uploads.deq(e.label,[g.headEncHash]),await r.downloads.deq(e.label,[g.seq]);continue}if(z.has(K)){await r.downloads.deq(e.label,[g.seq]);continue}let m=new N(g.headEnc),[R,C]=m.readStruct(li);if(C!==0){console.error("peek: reading item head",C);continue}z.add(K),h.push({kdm:g.kdm,head:R,seq:g.seq,host:e.label,headEnc:g.headEnc,headEncHash:g.headEncHash})}if(await r.downloads.enq(h),Q.length>0){let g=Math.max(...Q.map((K)=>K.seq));await r.hosts.recordStats(e.label,{lastSeq:g})}if($)$({phase:"peek",host:e.label,done:V,total:V});return 0}async function gt({conn:i,store:r,host:n,maxPushBytes:e,onProgress:t}){let $=e??te,f=await r.uploads.list(n.label),Z=f.length,J=0;if(t&&Z>0)t({phase:"push",host:n.label,done:0,total:Z});let h=[],Q=[],w=0,V=async()=>{if(h.length<1)return 0;let Y=h.length,X=await e0(i,r,n.label,h,Q);if(h=[],Q=[],w=0,X===0){if(J+=Y,t)t({phase:"push",host:n.label,done:J,total:Z})}return X};for(let Y of f){let X=await r.messages.get(Y);if(!X){J+=1;continue}let c={...X.head,bod:X.body},[W,z]=await i.seal(c);if(z!==0)return z;if(!W)return 12;let g=n0(W);if(h.length>0&&w+g>$){let K=await V();if(K!==0)return K}if(h.push(W),Q.push(Y),w+=g,w>=$){let K=await V();if(K!==0)return K}}return V()}async function Ze({conn:i,store:r,enclave:n,host:e,crypto:t,maxPullBytes:$,onProgress:f},Z){let J=$??$e,h=await r.downloads.list(),Q=Array.from(h).filter((W)=>W.host===e.label);if(Q.length<1)return 15;let w=Zr(Q,(W)=>W.head),V=Yt(w,(W)=>W.head.len,J),Y=w.length,X=0;if(f)f({phase:"pull",host:e.label,done:0,total:Y});let c=Xt(i,V[0]);for(let W=0;W<V.length;W++){let[z,g]=await c;if(g!==0||!z)return g;if(X+=V[W].length,f)f({phase:"pull",host:e.label,done:X,total:Y});let K=V[W+1];if(K)c=Xt(i,K);if(f)f({phase:"open",host:e.label,done:X,total:Y});let I=Zr(z,(R)=>R.dl.head),[,m]=await t0(r,n,t,I);if(m!==0)return m;if(Z){if(f)f({phase:"exec",host:e.label,done:X,total:Y});await Z()}}return 0}function zt({head:i,body:r}){let n={eid:i.eid,body:r,apld:zi};if(i.off!==0)n.off=i.off;if(i.ctr!==0)n.ctr=i.ctr;return n}async function Ut(i,{conn:r,store:n,enclave:e,host:t,crypto:$,onProgress:f},Z){let J=t.label,h=await r.identity(),Q=new N(i),[w,V]=Q.readStructs(Br);if(V!==0){console.error("Failed decoding notif",G[V]);return}let Y=!1,c=(await n.hosts.get(J))?.lastSeq,W=[],z=!1;for(let I of w){let[m,R]=await ln({seq:I.seq,headCph:I.headCph},h.publicKey,e,$);if(R!==0){console.error("Failed decrypting notif",G[R]);continue}let C=await $.blake3(m.headEnc);if(await n.messages.has(C))continue;let q=new N(m.headEnc),[y,H]=q.readStruct(li);if(H!==0){console.error("Failed to parse head",G[H]);continue}if(!I.bodyCph&&y.len>0)z=!0,await n.downloads.enq([{seq:I.seq,host:J,kdm:m.kdm,head:y,headEnc:m.headEnc,headEncHash:C}]);else W.push({...m,head:y,bodyCph:I.bodyCph,headEncHash:C});if(c===void 0||I.seq!==c+1)console.log("out of seq",I.seq,c),Y=!0;else c=I.seq}if(c!==void 0)await n.hosts.touch(t.label,c);let g=[];for(let I of W){let m=e.deriveCipher(I.kdm,"decrypt"),[R,C]=await Mn(I.headEnc,I.bodyCph,m,$);if(C!==0){console.error("Failed to open body",G[C]);continue}g.push({key:I.headEncHash,data:zt({head:I.head,body:R.bod})})}let K=await n.messages.add(g);for(let I=0;I<K.length;I++){let m=K[I];if(m!==0&&m!==15)console.error("ERR storing",G[m],"for message",I)}if(f&&g.length>0)f({phase:"open",host:t.label,done:g.length,total:g.length});if(Y||z||g.length>0)Z()}async function le(i,r={}){let n=r.pull!==!1,e=r.push===!0,{conn:t,store:$,enclave:f,host:Z,crypto:J,onProgress:h,peekProgressEvery:Q,peekConcurrency:w}=i,V=await t.identity(),[Y,X]=await t.peek(0);if(X!==0)return l(X);let c=Y.length,W=Q??lr,z=w??ct;if(h&&c>0)h({phase:"peek",host:Z.label,done:0,total:c});let g=0,K=await ne(Y,z,async(F)=>{let[M,P]=await ln(F,V.publicKey,f,J),A;if(P!==0||!M)A={ok:!1,seq:F.seq,stat:P};else{let a=await J.blake3(M.headEnc);A={ok:!0,seq:F.seq,kdm:M.kdm,headEnc:M.headEnc,headEncHash:a}}if(g+=1,h&&fn(g,c,W))h({phase:"peek",host:Z.label,done:g,total:c});return A}),I=new Map;for(let F of K){if(!F.ok)continue;let M=d(F.headEncHash),P=I.get(M);if(P)P.count+=1;else I.set(M,{hash:F.headEncHash,count:1,sample:F})}let m=0,R=[];for(let F of I.values()){if(F.count>1)m+=F.count-1;R.push(F.hash)}let C=Y.length,q=I.size,y=await nr(R,J),H=[],U=0;for(let F of I.values()){if(await $.messages.has(F.hash)){await $.uploads.deq(Z.label,[F.hash]);continue}if(U+=1,!n)continue;let P=F.sample,A=new N(P.headEnc),[a,k]=A.readStruct(li);if(k!==0){console.error("reconcile: reading msg header",k);continue}H.push({kdm:P.kdm,head:a,seq:P.seq,host:Z.label,headEnc:P.headEnc,headEncHash:P.headEncHash})}if(H.length>0)await $.downloads.enq(H);let D=0;if(e){let F=await $.messages.listKeys(),M=new Set(I.keys()),P=[];for(let A of F)if(!M.has(d(A)))D+=1,P.push(A);if(P.length>0)await $.uploads.enq(Z.label,P)}else{let F=await $.messages.listKeys(),M=new Set(I.keys());for(let P of F)if(!M.has(d(P)))D+=1}let x=Y.length>0?Math.max(...Y.map((F)=>F.seq)):0;if(await $.hosts.recordStats(Z.label,{setLastSeq:x}),h)h({phase:"peek",host:Z.label,done:c,total:c});return u({msgcheck:y,numBags:C,uniqueMsgs:q,numDupes:m,missingLocal:U,missingHost:D})}class ji{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new tn;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=lr;lastProgress=pi;scheduledSync;constructor(i,r,n,e,t,$=!0,f=te,Z=$e,J){this.clock=i;this.state=r;this.store=n;this.transport=e;this.crypto=t;this.forceSkewHandlingByDefault=$;this.onScheduleSync=J;this.maxPushBytes=f,this.maxPullBytes=Z,this.clientState=new Vi(()=>this.getClientState()),this.xferState=new Vi(()=>this.getXferState()),this.scheduledSync=new ar($n,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(h){console.error("Debounced sync failed:",h)}})}emitProgress=(i)=>{this.lastProgress=i,this.xferState.emit()};async setSeed(i,r){await this.store.seed.save(i,r),this.clientState.emit()}async getClientState(){let{store:i,connections:r}=this,n=await i.seed.load(),e=await i.hosts.list(),t=!1;for(let $ of r.values())if($.isConnected()){t=!0;break}return{hasSeed:n!==void 0,hasHost:Array.from(e).length>0,connected:t}}async getXferState(){let{uploads:i,downloads:r}=this.store,n=await i.count();return{numDownloads:await r.count(),numUploads:n,progress:this.lastProgress}}apply=(i,r)=>{return this.enqueueApplyJob(()=>this.doApply(i,r))};async doApply(i,r={enqueueUpload:!0,triggerUpload:!0}){let n=[],e=[];for(let{head:$,body:f}of i){let Z=new O;Z.writeStruct(li,$);let J=Z.result(),h=await this.crypto.blake3(J),Q={eid:$.eid,body:f,apld:zi};if($.off!==0)Q.off=$.off;if($.ctr!==0)Q.ctr=$.ctr;n.push(h),e.push({key:h,data:Q})}await this.store.messages.add(e),await It(this.store,n,this.crypto);let t=await this.doApplyHashes(n);if(r.enqueueUpload){let $=[];for(let f=0;f<n.length;f++){let Z=t[f];if(Z===0||Z===15)$.push(n[f])}if($.length>0){let f=await this.store.hosts.list();for(let Z of f)await this.store.uploads.enq(Z.label,$);this.xferState.emit()}}if(r.triggerUpload)this.scheduleSync();return t}enqueueApplyJob(i){let r=this.applyChain.then(i,i);return this.applyChain=r.then(()=>{return},()=>{return}),r}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let i=await this.store.messages.list({apld:zi});if(i.length<1)return[];let r=Zr(i,(n)=>n.head);return this.applyStored(r)}applyHashes=(i)=>{return this.enqueueApplyJob(()=>this.doApplyHashes(i))};async doApplyHashes(i){let r=[];for(let t of i){let $=await this.store.messages.get(t);if($)r.push($)}let n=await this.applyStored(r),e=new Map;for(let t=0;t<r.length;t++)e.set(d(r[t].hash),n[t]??12);return i.map((t)=>e.get(d(t))??13)}async applyStored(i){if(i.length<1)return[];let r=i.map(($)=>({...$.head,bod:$.body})),n=await this.state.apply(r),e=[],t=[];for(let $=0;$<i.length;$++){let f=n[$];if(f===0||f===15)e.push(i[$].hash);else if(f!==void 0&&ee(f))t.push({key:i[$].hash,err:f})}if(e.length>0)await this.store.messages.markApplied(e);if(t.length>0)await this.store.messages.markFailed(t);return n}async insertRaw(i){let{clock:r,crypto:n}=this,[e,t]=await ft({now:r.now(),bod:i,crypto:n});if(t!==0)return l(t);let f=(await this.apply([{head:e,body:i}]))[0];if(f!==0&&f!==15)return l(f??12);return u(e)}async makeUpdate(i,r){let{clock:n,crypto:e}=this,t=n.now();if(i.updatedAt.getTime()>t.getTime())return l(4);let $=i.ctr+1,[f,Z]=await br({now:t,eid:i.eid,ctr:$,bod:r,crypto:e});if(Z!==0)return l(Z);return u({head:f,body:r})}async updateWithSkew(i,r,n){if(n===!1)return l(4);let{clock:e,crypto:t}=this,$=e.now(),f=new N(i.eid),[Z,J]=f.readStruct(_);if(J!==0)return l(J);let h=i.updatedAt.getTime()-Z.ts.getTime(),Q={eid:i.eid,off:h+1,ctr:i.ctr+1,len:0},V=(await this.apply([{head:Q,body:void 0}]))[0];if(V!==0&&V!==15)return l(V??12);if(r===void 0)return u(Q);let[Y,X]=rr({id:Z.id,ts:$});if(X!==0)return l(X);let[c,W]=await br({now:$,eid:Y,ctr:0,bod:r,crypto:t});if(W!==0)return l(W);let g=(await this.apply([{head:c,body:r}]))[0];if(g!==0&&g!==15)return l(g??12);return u(c)}async updateRaw(i,r,n=this.forceSkewHandlingByDefault){if(i.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(i,r,n);return this.enqueueApplyJob(async()=>{let[e,t]=await this.makeUpdate(i,r);if(t!==0)return l(t);let f=(await this.doApply([e]))[0];if(f!==0&&f!==15)return l(f??12);return u(e.head)})}async insert(i){let{body:r,type:n,gid:e,pid:t,tags:$}=i,Z=Di({body:r,type:n,gid:e,pid:t,tags:$});return this.insertRaw(Z)}async update(i){let{prior:r,body:n,type:e,gid:t,pid:$,tags:f,force:Z}=i,h=Di({body:n,type:e,gid:t,pid:$,tags:f});return this.updateRaw(r,h,Z??this.forceSkewHandlingByDefault)}async delete(i){let r=i.force??!0;if("prior"in i)return this.updateRaw(i.prior,void 0,r);let[n,e]=await this.revFromArchive(i.eid);if(e!==0)return l(e);return this.updateRaw(n,void 0,r)}async revFromArchive(i){let r=await this.store.messages.last(i);if(r)return re(r.head);let n=new N(i),[e,t]=n.readStruct(_);if(t!==0)return l(t);return u({eid:i,ctr:-1,updatedAt:e.ts})}async genEID(i){let{clock:r,crypto:n}=this,e=r.now();if(i!==void 0)return rr({id:i,ts:e});let t=await n.genRandomBytes(8);return rr({id:t,ts:e})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:i,crypto:r,store:n}=this,e=await n.seed.load();if(!e)return 22;await this.drainApplyQueue();for(let[t,$]of i){let f=await n.hosts.get(t);if(!f)continue;let Z={conn:$,store:n,enclave:e,host:f,crypto:r,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},J=await fe(Z);if(J!==0)return console.error(`Failed to peek: ${J}`),this.emitProgress({phase:"idle"}),J;this.xferState.emit();let h=await gt(Z);if(h!==0)return console.error(`Failed to push: ${h}`),this.emitProgress({phase:"idle"}),h;this.xferState.emit();let Q=await Ze(Z,async()=>{await this.drainApplyQueue()});if(Q!==0&&Q!==15)return console.error(`Failed to pull: ${Q}`),this.emitProgress({phase:"idle"}),Q;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(i){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),i?.checkHost??!0){let n=await this.repull();if(n!==0)return n}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let i=await this.store.messages.listKeys();return nr(i,this.crypto)}listMsgs(i){return this.store.messages.list(i)}countMsgs(i){return this.store.messages.count(i)}async reconcile(i,r){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:n,crypto:e,store:t}=this,$=await t.seed.load();if(!$)return l(22);let f=await t.hosts.get(i);if(!f)return l(13);let Z=n.get(i);if(!Z||!Z.isConnected()){if(await this.connectToHost(f,!1,!1),f=await t.hosts.get(i),!f)return l(13);Z=n.get(i)}if(!Z)return l(12);let J={conn:Z,store:t,enclave:$,crypto:e,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[h,Q]=await le({...J,host:f},r);if(this.xferState.emit(),Q!==0)return this.emitProgress({phase:"idle"}),l(Q);if(!h)return this.emitProgress({phase:"idle"}),l(12);if(r?.sync===!1)return this.emitProgress({phase:"idle"}),u(h);let w=await this.sync();if(w!==0)return l(w);let V=await t.hosts.get(i);if(!V)return l(13);let[Y,X]=await le({...J,host:V},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),X!==0)return l(X);if(!Y)return l(12);return u(Y)}async repull(){let{connections:i,crypto:r,store:n}=this,e=await n.seed.load();if(!e)return 22;let t=Array.from(await n.hosts.list());if(t.length<1)return 0;for(let $ of t){let f=i.get($.label);if(!f||!f.isConnected())await this.connectToHost($,!1,!1)}for(let[$,f]of i){let Z=await n.hosts.get($);if(!Z)continue;let J={conn:f,store:n,enclave:e,host:{...Z,lastSeq:0},crypto:r,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},h=await fe(J);if(h!==0)return console.error(`rebuild: failed to peek: ${h}`),this.emitProgress({phase:"idle"}),h;this.xferState.emit();let Q=await Ze(J);if(Q!==0&&Q!==15)return console.error(`rebuild: failed to pull: ${Q}`),this.emitProgress({phase:"idle"}),Q;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let i=await this.state.clear();if(i!==0)return i;let r=await this.store.messages.list(),n=Zr(r,($)=>$.head),e=n.length;if(e<1)return this.emitProgress({phase:"idle"}),0;let t=0;while(t<n.length){let $=0,f=0,Z=t;for(let h=t;h<n.length&&f<100&&$<102400;h++)$+=n[h].head.len,f++,Z=h+1;let J=n.slice(t,Z);await this.applyStored(J),this.emitProgress({phase:"exec",done:Z,total:e}),t=Z}return this.emitProgress({phase:"idle"}),0}async wipe(i){let r=i?.msgs!==!1,n=i?.ents!==!1,e=i?.meta!==!1,t=i?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:$}=this;if(e)await $.hosts.wipe(),await $.uploads.wipe(),await $.downloads.wipe();if(r)await $.messages.wipe();if(t)await $.seed.wipe();if(n)await this.state.clear();this.lastProgress=pi,this.clientState.emit(),this.xferState.emit()}import=async(i,r)=>{let{crypto:n,store:e}=this,t=r?.onProgress,$=await e.seed.load();if(!$)return 22;console.time("import: decoding file...");let f=await i.bytes(),[Z,J]=await $t(f,n,$);if(J!==0)return J;console.timeEnd("import: decoding file...");let h=0;while(h<Z.length){let Q=0,w=0,V=h;for(let c=h;c<Z.length&&w<100&&Q<102400;c++)Q+=Z[c].head.len,w++,V=c+1;let Y=Z.slice(h,V);console.time(`import: applying [${h}, ${V}]`);let X=await this.apply(Y,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${h}, ${V}]`);for(let c=0;c<Y.length;c++){let W=X[c];if(W!==0&&W!==15)console.warn(`failed to import msg ${h+c}: ${G[W]}`)}if(t)queueMicrotask(()=>t(V,Z.length,0));this.emitProgress({phase:"import",done:V,total:Z.length}),h=V}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:i,store:r}=this,n=await r.seed.load();if(!n)return l(22);let e=await r.messages.list();return tt("export",0,e,i,n)}async export(i){let[r,n]=await this.exportBytes();if(n!==0)return n;if(!r)return 12;let e=new Blob([r.slice()]);return Zn(e,i),0}async link(i,r=!0){if(await this.store.hosts.add(i),this.clientState.emit(),r){let n=await this.store.hosts.get(i.label);if(n)await this.connectToHost(n)}}async unlink(i){await this.store.hosts.del(i),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(i,r=!0,n=!0)=>{let{clock:e,connections:t,crypto:$,store:f,transport:Z}=this,J=t.get(i.label);if(J){if(J.isConnected())return;try{J.closeListener()}catch{}t.delete(i.label)}let h=await f.seed.load();if(!h)return;console.info(`Connecting to ${i.handle} (${i.label})`);let Q=new vr(h,$,i,e,Z(i),(w)=>f.hosts.set(i.label,w));if(await Q.register(),r)await Q.listen(async(w)=>{let V={conn:Q,store:f,enclave:h,host:i,crypto:$,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return Ut(w,V,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(t.set(i.label,Q),this.clientState.emit(),n)this.scheduleSync()};async connect(i=!0,r=!0){let{connectToHost:n,scheduleSync:e,store:t}=this;if(!await t.seed.load())return;await this.drainApplyQueue();let f=await t.hosts.list();for(let Z of f)await n(Z,i,!1);if(r)e()}disconnect=async()=>{for(let i of this.connections.values())try{i.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}var Li=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function Jn(i){if(!Number.isSafeInteger(i)||i<0)throw Error("positive integer expected, got "+i)}function Je(i){return i instanceof Uint8Array||ArrayBuffer.isView(i)&&i.constructor.name==="Uint8Array"}function B(i,...r){if(!Je(i))throw Error("Uint8Array expected");if(r.length>0&&!r.includes(i.length))throw Error("Uint8Array expected of length "+r+", got length="+i.length)}function he(i,r=!0){if(i.destroyed)throw Error("Hash instance has been destroyed");if(r&&i.finished)throw Error("Hash#digest() has already been called")}function Kt(i,r){B(i);let n=r.outputLen;if(i.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Qe(i){if(typeof i!=="boolean")throw Error(`boolean expected, not ${i}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var Ui=(i)=>new Uint32Array(i.buffer,i.byteOffset,Math.floor(i.byteLength/4));var $0=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!$0)throw Error("Non little-endian hardware is not supported");function f0(i){if(typeof i!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(i))}function hn(i){if(typeof i==="string")i=f0(i);else if(Je(i))i=Qn(i);else throw Error("Uint8Array expected, got "+typeof i);return i}function Gt(i,r){if(r==null||typeof r!=="object")throw Error("options must be defined");return Object.assign(i,r)}function ot(i,r){if(i.length!==r.length)return!1;let n=0;for(let e=0;e<i.length;e++)n|=i[e]^r[e];return n===0}var mt=(i,r)=>{function n(e,...t){if(B(e),i.nonceLength!==void 0){let Q=t[0];if(!Q)throw Error("nonce / iv required");if(i.varSizeNonce)B(Q);else B(Q,i.nonceLength)}let $=i.tagLength;if($&&t[1]!==void 0)B(t[1]);let f=r(e,...t),Z=(Q,w)=>{if(w!==void 0){if(Q!==2)throw Error("cipher output not supported");B(w)}},J=!1;return{encrypt(Q,w){if(J)throw Error("cannot encrypt() twice with same key + nonce");return J=!0,B(Q),Z(f.encrypt.length,w),f.encrypt(Q,w)},decrypt(Q,w){if(B(Q),$&&Q.length<$)throw Error("invalid ciphertext length: smaller than tagLength="+$);return Z(f.decrypt.length,w),f.decrypt(Q,w)}}}return Object.assign(n,i),n};function we(i,r,n=!0){if(r===void 0)return new Uint8Array(i);if(r.length!==i)throw Error("invalid output length, expected "+i+", got: "+r.length);if(n&&!Z0(r))throw Error("invalid output, must be aligned");return r}function Z0(i){return i.byteOffset%4===0}function Qn(i){return Uint8Array.from(i)}function Xi(...i){for(let r=0;r<i.length;r++)i[r].fill(0)}function wn(i=32){if(Li&&typeof Li.getRandomValues==="function")return Li.getRandomValues(new Uint8Array(i));if(Li&&typeof Li.randomBytes==="function")return Li.randomBytes(i);throw Error("crypto.getRandomValues must be defined")}var dt=(i)=>Uint8Array.from(i.split("").map((r)=>r.charCodeAt(0))),l0=dt("expand 16-byte k"),J0=dt("expand 32-byte k"),h0=Ui(l0),Q0=Ui(J0);function o(i,r){return i<<r|i>>>32-r}function ue(i){return i.byteOffset%4===0}var un=64,w0=16,Ft=4294967295,at=new Uint32Array;function u0(i,r,n,e,t,$,f,Z){let J=t.length,h=new Uint8Array(un),Q=Ui(h),w=ue(t)&&ue($),V=w?Ui(t):at,Y=w?Ui($):at;for(let X=0;X<J;f++){if(i(r,n,e,Q,f,Z),f>=Ft)throw Error("arx: counter overflow");let c=Math.min(un,J-X);if(w&&c===un){let W=X/4;if(X%4!==0)throw Error("arx: invalid block position");for(let z=0,g;z<w0;z++)g=W+z,Y[g]=V[g]^Q[z];X+=un;continue}for(let W=0,z;W<c;W++)z=X+W,$[z]=t[z]^h[W];X+=c}}function Rt(i,r){let{allowShortKeys:n,extendNonceFn:e,counterLength:t,counterRight:$,rounds:f}=Gt({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},r);if(typeof i!=="function")throw Error("core must be a function");return Jn(t),Jn(f),Qe($),Qe(n),(Z,J,h,Q,w=0)=>{B(Z),B(J),B(h);let V=h.length;if(Q===void 0)Q=new Uint8Array(V);if(B(Q),Jn(w),w<0||w>=Ft)throw Error("arx: counter overflow");if(Q.length<V)throw Error(`arx: output (${Q.length}) is shorter than data (${V})`);let Y=[],X=Z.length,c,W;if(X===32)Y.push(c=Qn(Z)),W=Q0;else if(X===16&&n)c=new Uint8Array(32),c.set(Z),c.set(Z,16),W=h0,Y.push(c);else throw Error(`arx: invalid 32-byte key, got length=${X}`);if(!ue(J))Y.push(J=Qn(J));let z=Ui(c);if(e){if(J.length!==24)throw Error("arx: extended nonce must be 24 bytes");e(W,z,Ui(J.subarray(0,16)),z),J=J.subarray(16)}let g=16-t;if(g!==J.length)throw Error(`arx: nonce must be ${g} or 16 bytes`);if(g!==12){let I=new Uint8Array(12);I.set(J,$?0:12-J.length),J=I,Y.push(J)}let K=Ui(J);return u0(i,W,z,K,h,Q,w,f),Xi(...Y),Q}}var E=(i,r)=>i[r++]&255|(i[r++]&255)<<8;class Nt{constructor(i){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,i=hn(i),B(i,32);let r=E(i,0),n=E(i,2),e=E(i,4),t=E(i,6),$=E(i,8),f=E(i,10),Z=E(i,12),J=E(i,14);this.r[0]=r&8191,this.r[1]=(r>>>13|n<<3)&8191,this.r[2]=(n>>>10|e<<6)&7939,this.r[3]=(e>>>7|t<<9)&8191,this.r[4]=(t>>>4|$<<12)&255,this.r[5]=$>>>1&8190,this.r[6]=($>>>14|f<<2)&8191,this.r[7]=(f>>>11|Z<<5)&8065,this.r[8]=(Z>>>8|J<<8)&8191,this.r[9]=J>>>5&127;for(let h=0;h<8;h++)this.pad[h]=E(i,16+2*h)}process(i,r,n=!1){let e=n?0:2048,{h:t,r:$}=this,f=$[0],Z=$[1],J=$[2],h=$[3],Q=$[4],w=$[5],V=$[6],Y=$[7],X=$[8],c=$[9],W=E(i,r+0),z=E(i,r+2),g=E(i,r+4),K=E(i,r+6),I=E(i,r+8),m=E(i,r+10),R=E(i,r+12),C=E(i,r+14),q=t[0]+(W&8191),y=t[1]+((W>>>13|z<<3)&8191),H=t[2]+((z>>>10|g<<6)&8191),U=t[3]+((g>>>7|K<<9)&8191),D=t[4]+((K>>>4|I<<12)&8191),x=t[5]+(I>>>1&8191),F=t[6]+((I>>>14|m<<2)&8191),M=t[7]+((m>>>11|R<<5)&8191),P=t[8]+((R>>>8|C<<8)&8191),A=t[9]+(C>>>5|e),a=0,k=a+q*f+y*(5*c)+H*(5*X)+U*(5*Y)+D*(5*V);a=k>>>13,k&=8191,k+=x*(5*w)+F*(5*Q)+M*(5*h)+P*(5*J)+A*(5*Z),a+=k>>>13,k&=8191;let ri=a+q*Z+y*f+H*(5*c)+U*(5*X)+D*(5*Y);a=ri>>>13,ri&=8191,ri+=x*(5*V)+F*(5*w)+M*(5*Q)+P*(5*h)+A*(5*J),a+=ri>>>13,ri&=8191;let $i=a+q*J+y*Z+H*f+U*(5*c)+D*(5*X);a=$i>>>13,$i&=8191,$i+=x*(5*Y)+F*(5*V)+M*(5*w)+P*(5*Q)+A*(5*h),a+=$i>>>13,$i&=8191;let j=a+q*h+y*J+H*Z+U*f+D*(5*c);a=j>>>13,j&=8191,j+=x*(5*X)+F*(5*Y)+M*(5*V)+P*(5*w)+A*(5*Q),a+=j>>>13,j&=8191;let Wi=a+q*Q+y*h+H*J+U*Z+D*f;a=Wi>>>13,Wi&=8191,Wi+=x*(5*c)+F*(5*X)+M*(5*Y)+P*(5*V)+A*(5*w),a+=Wi>>>13,Wi&=8191;let ki=a+q*w+y*Q+H*h+U*J+D*Z;a=ki>>>13,ki&=8191,ki+=x*f+F*(5*c)+M*(5*X)+P*(5*Y)+A*(5*V),a+=ki>>>13,ki&=8191;let Bi=a+q*V+y*w+H*Q+U*h+D*J;a=Bi>>>13,Bi&=8191,Bi+=x*Z+F*f+M*(5*c)+P*(5*X)+A*(5*Y),a+=Bi>>>13,Bi&=8191;let _i=a+q*Y+y*V+H*w+U*Q+D*h;a=_i>>>13,_i&=8191,_i+=x*J+F*Z+M*f+P*(5*c)+A*(5*X),a+=_i>>>13,_i&=8191;let Si=a+q*X+y*Y+H*V+U*w+D*Q;a=Si>>>13,Si&=8191,Si+=x*h+F*J+M*Z+P*f+A*(5*c),a+=Si>>>13,Si&=8191;let Ei=a+q*c+y*X+H*Y+U*V+D*w;a=Ei>>>13,Ei&=8191,Ei+=x*Q+F*h+M*J+P*Z+A*f,a+=Ei>>>13,Ei&=8191,a=(a<<2)+a|0,a=a+k|0,k=a&8191,a=a>>>13,ri+=a,t[0]=k,t[1]=ri,t[2]=$i,t[3]=j,t[4]=Wi,t[5]=ki,t[6]=Bi,t[7]=_i,t[8]=Si,t[9]=Ei}finalize(){let{h:i,pad:r}=this,n=new Uint16Array(10),e=i[1]>>>13;i[1]&=8191;for(let f=2;f<10;f++)i[f]+=e,e=i[f]>>>13,i[f]&=8191;i[0]+=e*5,e=i[0]>>>13,i[0]&=8191,i[1]+=e,e=i[1]>>>13,i[1]&=8191,i[2]+=e,n[0]=i[0]+5,e=n[0]>>>13,n[0]&=8191;for(let f=1;f<10;f++)n[f]=i[f]+e,e=n[f]>>>13,n[f]&=8191;n[9]-=8192;let t=(e^1)-1;for(let f=0;f<10;f++)n[f]&=t;t=~t;for(let f=0;f<10;f++)i[f]=i[f]&t|n[f];i[0]=(i[0]|i[1]<<13)&65535,i[1]=(i[1]>>>3|i[2]<<10)&65535,i[2]=(i[2]>>>6|i[3]<<7)&65535,i[3]=(i[3]>>>9|i[4]<<4)&65535,i[4]=(i[4]>>>12|i[5]<<1|i[6]<<14)&65535,i[5]=(i[6]>>>2|i[7]<<11)&65535,i[6]=(i[7]>>>5|i[8]<<8)&65535,i[7]=(i[8]>>>8|i[9]<<5)&65535;let $=i[0]+r[0];i[0]=$&65535;for(let f=1;f<8;f++)$=(i[f]+r[f]|0)+($>>>16)|0,i[f]=$&65535;Xi(n)}update(i){he(this);let{buffer:r,blockLen:n}=this;i=hn(i);let e=i.length;for(let t=0;t<e;){let $=Math.min(n-this.pos,e-t);if($===n){for(;n<=e-t;t+=n)this.process(i,t);continue}if(r.set(i.subarray(t,t+$),this.pos),this.pos+=$,t+=$,this.pos===n)this.process(r,0,!1),this.pos=0}return this}destroy(){Xi(this.h,this.r,this.buffer,this.pad)}digestInto(i){he(this),Kt(i,this),this.finished=!0;let{buffer:r,h:n}=this,{pos:e}=this;if(e){r[e++]=1;for(;e<16;e++)r[e]=0;this.process(r,0,!0)}this.finalize();let t=0;for(let $=0;$<8;$++)i[t++]=n[$]>>>0,i[t++]=n[$]>>>8;return i}digest(){let{buffer:i,outputLen:r}=this;this.digestInto(i);let n=i.slice(0,r);return this.destroy(),n}}function V0(i){let r=(e,t)=>i(t).update(hn(e)).digest(),n=i(new Uint8Array(32));return r.outputLen=n.outputLen,r.blockLen=n.blockLen,r.create=(e)=>i(e),r}var Ve=V0((i)=>new Nt(i));function Y0(i,r,n,e,t,$=20){let f=i[0],Z=r[0],J=r[1],h=r[2],Q=r[3],w=i[1],V=n[0],Y=n[1],X=t,c=0,W=i[2],z=r[4],g=r[5],K=r[6],I=r[7],m=i[3],R=f,C=Z,q=J,y=h,H=Q,U=w,D=V,x=Y,F=X,M=c,P=W,A=z,a=g,k=K,ri=I,$i=m;for(let Wi=0;Wi<$;Wi+=2)H^=o(R+a|0,7),F^=o(H+R|0,9),a^=o(F+H|0,13),R^=o(a+F|0,18),M^=o(U+C|0,7),k^=o(M+U|0,9),C^=o(k+M|0,13),U^=o(C+k|0,18),ri^=o(P+D|0,7),q^=o(ri+P|0,9),D^=o(q+ri|0,13),P^=o(D+q|0,18),y^=o($i+A|0,7),x^=o(y+$i|0,9),A^=o(x+y|0,13),$i^=o(A+x|0,18),C^=o(R+y|0,7),q^=o(C+R|0,9),y^=o(q+C|0,13),R^=o(y+q|0,18),D^=o(U+H|0,7),x^=o(D+U|0,9),H^=o(x+D|0,13),U^=o(H+x|0,18),A^=o(P+M|0,7),F^=o(A+P|0,9),M^=o(F+A|0,13),P^=o(M+F|0,18),a^=o($i+ri|0,7),k^=o(a+$i|0,9),ri^=o(k+a|0,13),$i^=o(ri+k|0,18);let j=0;e[j++]=f+R|0,e[j++]=Z+C|0,e[j++]=J+q|0,e[j++]=h+y|0,e[j++]=Q+H|0,e[j++]=w+U|0,e[j++]=V+D|0,e[j++]=Y+x|0,e[j++]=X+F|0,e[j++]=c+M|0,e[j++]=W+P|0,e[j++]=z+A|0,e[j++]=g+a|0,e[j++]=K+k|0,e[j++]=I+ri|0,e[j++]=m+$i|0}function X0(i,r,n,e){let t=i[0],$=r[0],f=r[1],Z=r[2],J=r[3],h=i[1],Q=n[0],w=n[1],V=n[2],Y=n[3],X=i[2],c=r[4],W=r[5],z=r[6],g=r[7],K=i[3];for(let m=0;m<20;m+=2)J^=o(t+W|0,7),V^=o(J+t|0,9),W^=o(V+J|0,13),t^=o(W+V|0,18),Y^=o(h+$|0,7),z^=o(Y+h|0,9),$^=o(z+Y|0,13),h^=o($+z|0,18),g^=o(X+Q|0,7),f^=o(g+X|0,9),Q^=o(f+g|0,13),X^=o(Q+f|0,18),Z^=o(K+c|0,7),w^=o(Z+K|0,9),c^=o(w+Z|0,13),K^=o(c+w|0,18),$^=o(t+Z|0,7),f^=o($+t|0,9),Z^=o(f+$|0,13),t^=o(Z+f|0,18),Q^=o(h+J|0,7),w^=o(Q+h|0,9),J^=o(w+Q|0,13),h^=o(J+w|0,18),c^=o(X+Y|0,7),V^=o(c+X|0,9),Y^=o(V+c|0,13),X^=o(Y+V|0,18),W^=o(K+g|0,7),z^=o(W+K|0,9),g^=o(z+W|0,13),K^=o(g+z|0,18);let I=0;e[I++]=t,e[I++]=h,e[I++]=X,e[I++]=K,e[I++]=Q,e[I++]=w,e[I++]=V,e[I++]=Y}var Ye=Rt(Y0,{counterRight:!0,extendNonceFn:X0}),Xe=mt({blockSize:64,nonceLength:24,tagLength:16},(i,r)=>{return{encrypt(n,e){e=we(n.length+32,e,!1);let t=e.subarray(0,32),$=e.subarray(32);e.set(n,32),Xi(t),Ye(i,r,e,e);let f=Ve($,t);return e.set(f,16),Xi(e.subarray(0,16),f),e.subarray(16)},decrypt(n,e){B(n),e=we(n.length+32,e,!1);let t=e.subarray(0,32),$=e.subarray(32,48),f=e.subarray(48);e.set(n,32),Xi(t);let Z=Ye(i,r,t,t),J=Ve(f,Z);if(!ot($,J))throw Error("invalid tag");return Ye(i,r,e.subarray(16),e.subarray(16)),Xi(t,$,J),f}}});/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function c0(i){return i instanceof Uint8Array||ArrayBuffer.isView(i)&&i.constructor.name==="Uint8Array"}function dr(i){if(!Number.isSafeInteger(i)||i<0)throw Error("positive integer expected, got "+i)}function si(i,...r){if(!c0(i))throw Error("Uint8Array expected");if(r.length>0&&!r.includes(i.length))throw Error("Uint8Array expected of length "+r+", got length="+i.length)}function Fr(i,r=!0){if(i.destroyed)throw Error("Hash instance has been destroyed");if(r&&i.finished)throw Error("Hash#digest() has already been called")}function Vn(i,r){si(i);let n=r.outputLen;if(i.length<n)throw Error("digestInto() expects output buffer of length at least "+n)}function Ot(i){return new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}function hr(i){return new Uint32Array(i.buffer,i.byteOffset,Math.floor(i.byteLength/4))}function Qr(...i){for(let r=0;r<i.length;r++)i[r].fill(0)}function Rr(i,r){return i<<32-r|i>>>r}var yt=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function Pt(i){return i<<24&4278190080|i<<8&16711680|i>>>8&65280|i>>>24&255}var qt=yt?(i)=>i:(i)=>Pt(i);function W0(i){for(let r=0;r<i.length;r++)i[r]=Pt(i[r]);return i}var ei=yt?(i)=>i:W0;function I0(i){if(typeof i!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(i))}function wr(i){if(typeof i==="string")i=I0(i);return si(i),i}class ce{}function Ct(i){let r=(e,t)=>i(t).update(wr(e)).digest(),n=i({});return r.outputLen=n.outputLen,r.blockLen=n.blockLen,r.create=(e)=>i(e),r}var Mt=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var Yn=BigInt(4294967295),Ht=BigInt(32);function We(i,r=!1){if(r)return{h:Number(i&Yn),l:Number(i>>Ht&Yn)};return{h:Number(i>>Ht&Yn)|0,l:Number(i&Yn)|0}}function Ki(i,r,n,e,t){return i=i+r+t|0,e=Rr(e^i,16),n=n+e|0,r=Rr(r^n,12),{a:i,b:r,c:n,d:e}}function Gi(i,r,n,e,t){return i=i+r+t|0,e=Rr(e^i,8),n=n+e|0,r=Rr(r^n,7),{a:i,b:r,c:n,d:e}}class Ie extends ce{constructor(i,r){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,dr(i),dr(r),this.blockLen=i,this.outputLen=r,this.buffer=new Uint8Array(i),this.buffer32=hr(this.buffer)}update(i){Fr(this),i=wr(i),si(i);let{blockLen:r,buffer:n,buffer32:e}=this,t=i.length,$=i.byteOffset,f=i.buffer;for(let Z=0;Z<t;){if(this.pos===r)ei(e),this.compress(e,0,!1),ei(e),this.pos=0;let J=Math.min(r-this.pos,t-Z),h=$+Z;if(J===r&&!(h%4)&&Z+J<t){let Q=new Uint32Array(f,h,Math.floor((t-Z)/4));ei(Q);for(let w=0;Z+r<t;w+=e.length,Z+=r)this.length+=r,this.compress(Q,w,!1);ei(Q);continue}n.set(i.subarray(Z,Z+J),this.pos),this.pos+=J,this.length+=J,Z+=J}return this}digestInto(i){Fr(this),Vn(i,this);let{pos:r,buffer32:n}=this;this.finished=!0,Qr(this.buffer.subarray(r)),ei(n),this.compress(n,0,!0),ei(n);let e=hr(i);this.get().forEach((t,$)=>e[$]=qt(t))}digest(){let{buffer:i,outputLen:r}=this;this.digestInto(i);let n=i.slice(0,r);return this.destroy(),n}_cloneInto(i){let{buffer:r,length:n,finished:e,destroyed:t,outputLen:$,pos:f}=this;return i||(i=new this.constructor({dkLen:$})),i.set(...this.get()),i.buffer.set(r),i.destroyed=t,i.finished=e,i.length=n,i.pos=f,i.outputLen=$,i}clone(){return this._cloneInto()}}function ge(i,r,n,e,t,$,f,Z,J,h,Q,w,V,Y,X,c,W,z,g,K){let I=0;for(let m=0;m<e;m++)({a:t,b:J,c:V,d:W}=Ki(t,J,V,W,n[r+i[I++]])),{a:t,b:J,c:V,d:W}=Gi(t,J,V,W,n[r+i[I++]]),{a:$,b:h,c:Y,d:z}=Ki($,h,Y,z,n[r+i[I++]]),{a:$,b:h,c:Y,d:z}=Gi($,h,Y,z,n[r+i[I++]]),{a:f,b:Q,c:X,d:g}=Ki(f,Q,X,g,n[r+i[I++]]),{a:f,b:Q,c:X,d:g}=Gi(f,Q,X,g,n[r+i[I++]]),{a:Z,b:w,c,d:K}=Ki(Z,w,c,K,n[r+i[I++]]),{a:Z,b:w,c,d:K}=Gi(Z,w,c,K,n[r+i[I++]]),{a:t,b:h,c:X,d:K}=Ki(t,h,X,K,n[r+i[I++]]),{a:t,b:h,c:X,d:K}=Gi(t,h,X,K,n[r+i[I++]]),{a:$,b:Q,c,d:W}=Ki($,Q,c,W,n[r+i[I++]]),{a:$,b:Q,c,d:W}=Gi($,Q,c,W,n[r+i[I++]]),{a:f,b:w,c:V,d:z}=Ki(f,w,V,z,n[r+i[I++]]),{a:f,b:w,c:V,d:z}=Gi(f,w,V,z,n[r+i[I++]]),{a:Z,b:J,c:Y,d:g}=Ki(Z,J,Y,g,n[r+i[I++]]),{a:Z,b:J,c:Y,d:g}=Gi(Z,J,Y,g,n[r+i[I++]]);return{v0:t,v1:$,v2:f,v3:Z,v4:J,v5:h,v6:Q,v7:w,v8:V,v9:Y,v10:X,v11:c,v12:W,v13:z,v14:g,v15:K}}var ci={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},oi=Mt.slice(),At=(()=>{let i=Array.from({length:16},(e,t)=>t),r=(e)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((t)=>e[t]),n=[];for(let e=0,t=i;e<7;e++,t=r(t))n.push(...t);return Uint8Array.from(n)})();class ze extends Ie{constructor(i={},r=0){super(64,i.dkLen===void 0?32:i.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:e}=i,t=e!==void 0;if(n!==void 0){if(t)throw Error('Only "key" or "context" can be specified at same time');let $=wr(n).slice();si($,32),this.IV=hr($),ei(this.IV),this.flags=r|ci.KEYED_HASH}else if(t){let $=wr(e),f=new ze({dkLen:32},ci.DERIVE_KEY_CONTEXT).update($).digest();this.IV=hr(f),ei(this.IV),this.flags=r|ci.DERIVE_KEY_MATERIAL}else this.IV=oi.slice(),this.flags=r;this.state=this.IV.slice(),this.bufferOut=Ot(this.bufferOut32)}get(){return[]}set(){}b2Compress(i,r,n,e=0){let{state:t,pos:$}=this,{h:f,l:Z}=We(BigInt(i),!0),{v0:J,v1:h,v2:Q,v3:w,v4:V,v5:Y,v6:X,v7:c,v8:W,v9:z,v10:g,v11:K,v12:I,v13:m,v14:R,v15:C}=ge(At,e,n,7,t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],oi[0],oi[1],oi[2],oi[3],f,Z,$,r);t[0]=J^W,t[1]=h^z,t[2]=Q^g,t[3]=w^K,t[4]=V^I,t[5]=Y^m,t[6]=X^R,t[7]=c^C}compress(i,r=0,n=!1){let e=this.flags;if(!this.chunkPos)e|=ci.CHUNK_START;if(this.chunkPos===15||n)e|=ci.CHUNK_END;if(!n)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,e,i,r),this.chunkPos+=1,this.chunkPos===16||n){let t=this.state;this.state=this.IV.slice();for(let $,f=this.chunksDone+1;n||!(f&1);f>>=1){if(!($=this.stack.pop()))break;this.buffer32.set($,0),this.buffer32.set(t,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|ci.PARENT,this.buffer32,0),t=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(t)}this.pos=0}_cloneInto(i){i=super._cloneInto(i);let{IV:r,flags:n,state:e,chunkPos:t,posOut:$,chunkOut:f,stack:Z,chunksDone:J}=this;return i.state.set(e.slice()),i.stack=Z.map((h)=>Uint32Array.from(h)),i.IV.set(r),i.flags=n,i.chunkPos=t,i.chunksDone=J,i.posOut=$,i.chunkOut=f,i.enableXOF=this.enableXOF,i.bufferOut32.set(this.bufferOut32),i}destroy(){this.destroyed=!0,Qr(this.state,this.buffer32,this.IV,this.bufferOut32),Qr(...this.stack)}b2CompressOut(){let{state:i,pos:r,flags:n,buffer32:e,bufferOut32:t}=this,{h:$,l:f}=We(BigInt(this.chunkOut++));ei(e);let{v0:Z,v1:J,v2:h,v3:Q,v4:w,v5:V,v6:Y,v7:X,v8:c,v9:W,v10:z,v11:g,v12:K,v13:I,v14:m,v15:R}=ge(At,0,e,7,i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],oi[0],oi[1],oi[2],oi[3],f,$,r,n);t[0]=Z^c,t[1]=J^W,t[2]=h^z,t[3]=Q^g,t[4]=w^K,t[5]=V^I,t[6]=Y^m,t[7]=X^R,t[8]=i[0]^c,t[9]=i[1]^W,t[10]=i[2]^z,t[11]=i[3]^g,t[12]=i[4]^K,t[13]=i[5]^I,t[14]=i[6]^m,t[15]=i[7]^R,ei(e),ei(t),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,Qr(this.buffer.subarray(this.pos));let i=this.flags|ci.ROOT;if(this.stack.length)i|=ci.PARENT,ei(this.buffer32),this.compress(this.buffer32,0,!0),ei(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else i|=(!this.chunkPos?ci.CHUNK_START:0)|ci.CHUNK_END;this.flags=i,this.b2CompressOut()}writeInto(i){Fr(this,!1),si(i),this.finish();let{blockLen:r,bufferOut:n}=this;for(let e=0,t=i.length;e<t;){if(this.posOut>=r)this.b2CompressOut();let $=Math.min(r-this.posOut,t-e);i.set(n.subarray(this.posOut,this.posOut+$),e),this.posOut+=$,e+=$}return i}xofInto(i){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(i)}xof(i){return dr(i),this.xofInto(new Uint8Array(i))}digestInto(i){if(Vn(i,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(i),this.destroy(),i}digest(){return this.digestInto(new Uint8Array(this.outputLen))}}var Tt=Ct((i)=>new ze(i));var Ue=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Dt(i){let r=new Uint8Array(Ue.length+32);return r.set(Ue),r.set(i.subarray(0,32),Ue.length),r}function pt(i){return typeof i==="string"?new TextEncoder().encode(i):i}function ur(i){let r=new ArrayBuffer(i.byteLength);return new Uint8Array(r).set(i),r}class Ke{verifyKeys=new Map;signKeys=new Map;async genRandomBytes(i){return wn(i)}async gen256BitSecureRandomSeed(){return wn(32)}async encryptXSalsa20Poly1305Combined(i,r){let n=wn(24),t=Xe(r,n).encrypt(i);return new Uint8Array([...n,...t])}async decryptXSalsa20Poly1305Combined(i,r){let n=i.slice(0,24),e=i.slice(24);return Xe(r,n).decrypt(e)}async deriveEd25519KeyPair(i){let r=i,n=Dt(r),e=await globalThis.crypto.subtle.importKey("pkcs8",ur(n),{name:"Ed25519"},!0,["sign"]),t=await globalThis.crypto.subtle.exportKey("jwk",e);if(typeof t.x!=="string")throw Error("Ed25519 JWK missing x");let $=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:t.x},{name:"Ed25519"},!0,["verify"]),f=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",$)),Z=new Uint8Array(64);return Z.set(r,0),Z.set(f,32),this.signKeys.set(fi(r),e),this.verifyKeys.set(fi(f),$),{keyType:"ed25519",privateKey:Z,publicKey:f}}async importSignKey(i){let r=i.subarray(0,32),n=fi(r),e=this.signKeys.get(n);if(e)return e;let t=Dt(r),$=await globalThis.crypto.subtle.importKey("pkcs8",ur(t),{name:"Ed25519"},!1,["sign"]);return this.signKeys.set(n,$),$}async importVerifyKey(i){let r=fi(i),n=this.verifyKeys.get(r);if(n)return n;let e=await globalThis.crypto.subtle.importKey("raw",ur(i),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(r,e),e}async signEd25519(i,r){let n=pt(i),e=await this.importSignKey(r),t=await globalThis.crypto.subtle.sign({name:"Ed25519"},e,ur(n));return new Uint8Array(t)}async checkSigEd25519(i,r,n){let e=pt(r);try{let t=await this.importVerifyKey(n);return await globalThis.crypto.subtle.verify({name:"Ed25519"},t,ur(i),ur(e))}catch{return!1}}async blake3(i){return Tt(i)}}var g0=new Ke,mi=g0;import{useEffect as an,useState as ye}from"react";class Ge{db;constructor(i){this.db=i}async enq(i){let r=[...i];if(r.length===0)return;let n=this.db.transaction(Ji,"readwrite"),e=n.objectStore(Ji);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error);for(let f of r){let Z=`${f.host}:${f.seq}`;e.put(f,Z)}})}async deq(i,r){let n=[...r];if(n.length===0)return;let e=this.db.transaction(Ji,"readwrite"),t=e.objectStore(Ji);return new Promise(($,f)=>{e.oncomplete=()=>$(),e.onerror=()=>f(e.error);for(let Z of n){let J=`${i}:${Z}`;t.delete(J)}})}async list(){let r=this.db.transaction(Ji,"readonly").objectStore(Ji);return new Promise((n,e)=>{let t=r.getAll();t.onsuccess=()=>n(t.result),t.onerror=()=>e(t.error)})}async count(){let r=this.db.transaction(Ji,"readonly").objectStore(Ji);return new Promise((n,e)=>{let t=r.count();t.onsuccess=()=>n(t.result),t.onerror=()=>e(t.error)})}async wipe(){let i=this.db.transaction(Ji,"readwrite"),r=i.objectStore(Ji);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.clear()})}}function xt(i){return{label:i.label,handle:new URL(i.handle),idx:i.idx,lastSeq:i.lastSeq||0,clockOffset:i.clockOffset,subscription:i.subscription}}function z0(i,r){let n={...i};if(r.setLastSeq!==void 0)n.lastSeq=r.setLastSeq;else if(r.lastSeq!==void 0){let e=n.lastSeq||0;if(r.lastSeq>e)n.lastSeq=r.lastSeq}return delete n.numBags,delete n.numDupes,n}class oe{db;constructor(i){this.db=i}async add(i){return this.put({...i,lastSeq:0})}async put(i){let r={...i,handle:i.handle.toString(),lastSeq:i.lastSeq??0},n=this.db.transaction(ti,"readwrite"),e=n.objectStore(ti);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error),e.put(r)})}async touch(i,r){return this.recordStats(i,{lastSeq:r})}async recordStats(i,r){let n=this.db.transaction(ti,"readwrite"),e=n.objectStore(ti);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error);let f=e.get(i);f.onsuccess=()=>{let Z=f.result;if(!Z)return;e.put(z0(Z,r))}})}async get(i){let n=this.db.transaction(ti,"readonly").objectStore(ti);return new Promise((e,t)=>{let $=n.get(i);$.onsuccess=()=>{let f=$.result;if(!f)e(void 0);else e(xt(f))},$.onerror=()=>t($.error)})}async set(i,r){let n=await this.get(i);if(!n)return 13;try{return await this.put({...n,...r}),0}catch{return 18}}async del(i){let r=this.db.transaction(ti,"readwrite"),n=r.objectStore(ti);return new Promise((e,t)=>{r.oncomplete=()=>e(),r.onerror=()=>t(r.error),n.delete(i)})}async list(){let r=this.db.transaction(ti,"readonly").objectStore(ti);return new Promise((n,e)=>{let t=r.getAll();t.onsuccess=()=>{let $=t.result;n($.map(xt))},t.onerror=()=>e(t.error)})}async wipe(){let i=this.db.transaction(ti,"readwrite"),r=i.objectStore(ti);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.clear()})}}class me{crypto;db;constructor(i,r){this.crypto=r;this.db=i}async add(i){let r=this.db.transaction(p,"readwrite"),n=r.objectStore(p);return new Promise((e)=>{if(i.length===0){e([]);return}let t=Array(i.length).fill(0);r.oncomplete=()=>e(t),r.onerror=()=>{for(let $=0;$<t.length;$++)t[$]=18;e(t)};for(let $=0;$<i.length;$++){let{key:f,data:Z}=i[$],J=d(f),h=n.put(Z,J);h.onerror=(Q)=>{Q.preventDefault(),t[$]=18}}})}async del(i){let r=[...i];if(r.length===0)return;let n=this.db.transaction(p,"readwrite"),e=n.objectStore(p);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error);for(let f of r){let Z=d(f);e.delete(Z)}})}async get(i){let n=this.db.transaction(p,"readonly").objectStore(p);return new Promise((e,t)=>{let $=d(i),f=n.get($);f.onsuccess=async()=>{let Z=f.result;if(Z)e(await Pi(i,Z,this.crypto));else e(void 0)},f.onerror=()=>t(f.error)})}async has(i){return await this.get(i)!==void 0}async list(i){let r=i?.apld,n=i?.body!==!1,t=this.db.transaction(p,"readonly").objectStore(p);return new Promise(($,f)=>{let Z=[],J=r===void 0?t.openCursor():t.index(Nr).openCursor(IDBKeyRange.only(r));J.onsuccess=(h)=>{let Q=h.target.result;if(Q){let w=r===void 0?Q.key:Q.primaryKey,V=Q.value;Z.push({hash:v(w),data:V}),Q.continue()}else Promise.all(Z.map(({hash:w,data:V})=>Pi(w,V,this.crypto,{body:n}))).then($).catch(f)},J.onerror=()=>f(J.error)})}async count(i){let n=this.db.transaction(p,"readonly").objectStore(p);return new Promise((e,t)=>{let $=i===void 0?n.count():n.index(Nr).count(IDBKeyRange.only(i));$.onsuccess=()=>e($.result),$.onerror=()=>t($.error)})}async listKeys(){let r=this.db.transaction(p,"readonly").objectStore(p);return new Promise((n,e)=>{let t=[],$=r.openKeyCursor();$.onsuccess=(f)=>{let Z=f.target.result;if(Z)t.push(v(Z.key)),Z.continue();else n(t)},$.onerror=()=>e($.error)})}async last(i){let n=this.db.transaction(p,"readonly").objectStore(p);return new Promise((e,t)=>{let $,f=n.openCursor();f.onsuccess=async(Z)=>{let J=Z.target.result;if(J){let{key:h,value:Q}=J;if(b(i,Q.eid)){if(!$||(Q.ctr??0)>($.data.ctr??0)||(Q.ctr??0)===($.data.ctr??0)&&(Q.off??0)>($.data.off??0))$={key:h,data:Q}}J.continue()}else if($){let h=v($.key);e(await Pi(h,$.data,this.crypto))}else e(void 0)},f.onerror=()=>t(f.error)})}async markApplied(i){let r=[...i];if(r.length===0)return;let n=this.db.transaction(p,"readwrite"),e=n.objectStore(p);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error);for(let f of r){let Z=d(f),J=e.get(Z);J.onsuccess=()=>{let h=J.result;if(!h)return;xi(h,yi),e.put(h,Z)},J.onerror=(h)=>{h.preventDefault()}}})}async markFailed(i){let r=[...i];if(r.length===0)return;let n=this.db.transaction(p,"readwrite"),e=n.objectStore(p);return new Promise((t,$)=>{n.oncomplete=()=>t(),n.onerror=()=>$(n.error);for(let{key:f,err:Z}of r){let J=d(f),h=e.get(J);h.onsuccess=()=>{let Q=h.result;if(!Q)return;xi(Q,Yi,Z),e.put(Q,J)},h.onerror=(Q)=>{Q.preventDefault()}}})}async wipe(){let i=this.db.transaction(p,"readwrite"),r=i.objectStore(p);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.clear()})}}var qi={encode(i,r){let n=i.writeVarString(r.handle);if(n!==0)return n;let e=i.writeVarString(r.label);if(e!==0)return e;return i.writeVarInt(r.idx??0)},decode(i){let[r,n]=i.readVarString();if(n!==0)return l(n);let[e,t]=i.readVarString();if(t!==0)return l(t);let[$,f]=i.readVarInt();if(f!==0)return l(f);return u({handle:r,label:e,idx:$})}};var Or=1,Xn={encode(i,r){if(r.v!==Or)return 10;let[,n]=ii(r.masterSeed);if(n!==0)return n;let e=i.writeVarInt(r.v);if(e!==0)return e;i.writeBytes(r.masterSeed);let t=i.writeVarInt(r.hosts.length);if(t!==0)return t;for(let $ of r.hosts){let f=i.writeStruct(qi,$);if(f!==0)return f}return 0},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);if(r!==Or)return l(14);let[e,t]=i.readBytes(ui);if(t!==0)return l(t);if(e===void 0)return l(14);let[$,f]=ii(e);if(f!==0)return l(f);if($===void 0)return l(14);let[Z,J]=i.readVarInt();if(J!==0)return l(J);if(Z===void 0||Z<0)return l(10);let h=[];for(let Q=0;Q<Z;Q++){let[w,V]=i.readStruct(qi);if(V!==0)return l(V);if(w===void 0)return l(14);h.push(w)}return u({v:Or,masterSeed:$,hosts:h})}};function ae(i,r){let[n,e]=ii(i);if(e!==0)return l(e);if(n===void 0)return l(10);let[t,$]=ii(n.slice());if($!==0)return l($);if(t===void 0)return l(10);return u({v:Or,masterSeed:t,hosts:r.map((f)=>({handle:f.handle,label:f.label,idx:f.idx??0}))})}var yr={encode(i,r){let[,n]=ii(r.masterSeed);if(n!==0)return n;i.writeBytes(r.masterSeed);let e=i.writeVarInt(r.hosts.length);if(e!==0)return e;for(let t of r.hosts){let $=i.writeStruct(qi,t);if($!==0)return $}return 0},decode(i){let[r,n]=i.readBytes(ui);if(n!==0)return l(n);if(r===void 0)return l(14);let[e,t]=ii(r);if(t!==0)return l(t);if(e===void 0)return l(14);let[$,f]=i.readVarInt();if(f!==0)return l(f);if($===void 0||$<0)return l(10);let Z=[];for(let J=0;J<$;J++){let[h,Q]=i.readStruct(qi);if(Q!==0)return l(Q);if(h===void 0)return l(14);Z.push(h)}return u({masterSeed:e,hosts:Z})}};function ai(i){let r=new Uint8Array(i);if(i>0)crypto.getRandomValues(r);return r}var Ci=32,jt=-7,Lt=-8,st=-257,Pr=[{type:"public-key",alg:jt},{type:"public-key",alg:Lt},{type:"public-key",alg:st}];function cn(i){return i.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function Mi(i){let r=new Uint8Array(i.byteLength);return r.set(i),r}function Hi(i){if(i?.rpId!==void 0)return u(i.rpId);if(typeof location>"u")return l(9);return u(cn(location.hostname))}function Ai(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function Ti(i){if(i===null||i.type!=="public-key"||!("rawId"in i)||typeof i.getClientExtensionResults!=="function")return l(27);return u(i)}async function qr(i){if(typeof PublicKeyCredential>"u")return!1;let r=PublicKeyCredential.getClientCapabilities;if(typeof r!=="function")return!0;let n=await r.call(PublicKeyCredential);if(i in n)return n[i]===!0;return!0}function kt(){return qr("extension:largeBlob")}async function Wn(i){let r=Ai();if(r!==0)return l(r);let[n,e]=Hi(i);if(e!==0)return l(e);if(n===void 0)return l(9);let t=i?.userName??"diplomatic-seed",$={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(i?.authenticatorAttachment!==void 0)$.authenticatorAttachment=i.authenticatorAttachment;let f={largeBlob:{support:"required"}},Z;try{Z=await navigator.credentials.create({publicKey:{challenge:ai(Ci),rp:{id:n,name:i?.rpName??"DIPLOMATIC"},user:{id:ai(16),name:t,displayName:t},pubKeyCredParams:Pr,authenticatorSelection:$,extensions:f}})}catch{return l(24)}let[J,h]=Ti(Z);if(h!==0)return l(h);if(J===void 0)return l(27);if(J.getClientExtensionResults().largeBlob?.supported!==!0)return l(24);return u(new Uint8Array(J.rawId))}async function Cr(i,r,n){let e=Ai();if(e!==0)return e;let[t,$]=Hi(n);if($!==0)return $;if(t===void 0)return 9;let f={largeBlob:{write:Mi(r)}},Z;try{Z=await navigator.credentials.get({publicKey:{challenge:ai(Ci),rpId:t,allowCredentials:[{type:"public-key",id:Mi(i)}],userVerification:"required",extensions:f}})}catch{return 24}let[J,h]=Ti(Z);if(h!==0)return h;if(J===void 0)return 27;if(J.getClientExtensionResults().largeBlob?.written!==!0)return 24;return 0}async function In(i,r){let n=Ai();if(n!==0)return l(n);let[e,t]=Hi(r);if(t!==0)return l(t);if(e===void 0)return l(9);let $={largeBlob:{read:!0}},f;try{let w={challenge:ai(Ci),rpId:e,userVerification:"required",extensions:$};if(i!==void 0)w.allowCredentials=[{type:"public-key",id:Mi(i)}];f=await navigator.credentials.get({publicKey:w})}catch{return l(24)}let[Z,J]=Ti(f);if(J!==0)return l(J);if(Z===void 0)return l(27);let Q=Z.getClientExtensionResults().largeBlob?.blob;if(Q===void 0)return l(7);return u({blob:new Uint8Array(Q),credId:new Uint8Array(Z.rawId)})}var Mr=new TextEncoder().encode("diplomatic.prf.v1"),de=32;async function U0(){return qr("extension:prf")}async function Fe(i){let r=Ai();if(r!==0)return l(r);let[n,e]=Hi(i);if(e!==0)return l(e);if(n===void 0)return l(9);let t=i?.userName??"diplomatic-prf",$={residentKey:"required",requireResidentKey:!0,userVerification:"required",authenticatorAttachment:i?.authenticatorAttachment??"platform"},f;try{f=await navigator.credentials.create({publicKey:{challenge:ai(Ci),rp:{id:n,name:i?.rpName??"DIPLOMATIC"},user:{id:ai(16),name:t,displayName:t},pubKeyCredParams:Pr,authenticatorSelection:$,extensions:{prf:{}}}})}catch{return l(24)}let[Z,J]=Ti(f);if(J!==0)return l(J);if(Z===void 0)return l(27);let h=Z.getClientExtensionResults();return u({credId:new Uint8Array(Z.rawId),prfEnabled:h.prf?.enabled===!0})}async function Vr(i){let r=Ai();if(r!==0)return l(r);let[n,e]=Hi(i);if(e!==0)return l(e);if(n===void 0)return l(9);let t=i?.salt??Mr,$=Mi(t),f={challenge:ai(Ci),rpId:n,userVerification:"required",extensions:{prf:{eval:{first:$}}}};if(i?.credId!==void 0)f.allowCredentials=[{type:"public-key",id:Mi(i.credId)}];let Z;try{Z=await navigator.credentials.get({publicKey:f})}catch{return l(24)}let[J,h]=Ti(Z);if(h!==0)return l(h);if(J===void 0)return l(27);let Q=J.getClientExtensionResults().prf?.results;if(Q?.first===void 0)return l(7);let w=Q.first,V=w instanceof ArrayBuffer?new Uint8Array(w):new Uint8Array(w.buffer,w.byteOffset,w.byteLength),Y=V.byteLength>=de?V.slice(0,de):V;if(Y.byteLength!==de)return l(27);return u({prf:Y,credId:new Uint8Array(J.rawId)})}var gn='var w0=64;var XJ=32,T0=8;var I$=32;var WJ=30000,GJ=512,j;((w)=>{w[w.Success=0]="Success";w[w.InvalidSignature=3]="InvalidSignature";w[w.ClockOutOfSync=4]="ClockOutOfSync";w[w.UserNotRegistered=5]="UserNotRegistered";w[w.ServerMisconfigured=6]="ServerMisconfigured";w[w.MissingBody=7]="MissingBody";w[w.ExtraBodyContent=8]="ExtraBodyContent";w[w.MissingParam=9]="MissingParam";w[w.InvalidParam=10]="InvalidParam";w[w.InvalidRequest=11]="InvalidRequest";w[w.InternalError=12]="InternalError";w[w.NotFound=13]="NotFound";w[w.InvalidMessage=14]="InvalidMessage";w[w.NoChange=15]="NoChange";w[w.DatabaseClosed=16]="DatabaseClosed";w[w.StorageError=17]="StorageError";w[w.DatabaseError=18]="DatabaseError";w[w.HashMismatch=19]="HashMismatch";w[w.DecryptionError=20]="DecryptionError";w[w.NotImplemented=21]="NotImplemented";w[w.MissingSeed=22]="MissingSeed";w[w.OutOfBounds=23]="OutOfBounds";w[w.HostError=24]="HostError";w[w.CommunicationError=25]="CommunicationError";w[w.VarLimitExceeded=26]="VarLimitExceeded";w[w.InvalidResponse=27]="InvalidResponse";w[w.ConnectionClosed=28]="ConnectionClosed"})(j||={});function zJ($){if(!$||typeof $!=="object")return!1;if(!("op"in $)||!("id"in $))return!1;return typeof $.op==="string"&&typeof $.id==="number"}function KJ($){let Z=$.length,J=0,Q=0;while(Q<Z){let V=$.charCodeAt(Q++);if((V&4294967168)===0){J++;continue}else if((V&4294965248)===0)J+=2;else{if(V>=55296&&V<=56319){if(Q<Z){let Y=$.charCodeAt(Q);if((Y&64512)===56320)++Q,V=((V&1023)<<10)+(Y&1023)+65536}}if((V&4294901760)===0)J+=3;else J+=4}}return J}function LQ($,Z,J){let Q=$.length,V=J,Y=0;while(Y<Q){let X=$.charCodeAt(Y++);if((X&4294967168)===0){Z[V++]=X;continue}else if((X&4294965248)===0)Z[V++]=X>>6&31|192;else{if(X>=55296&&X<=56319){if(Y<Q){let W=$.charCodeAt(Y);if((W&64512)===56320)++Y,X=((X&1023)<<10)+(W&1023)+65536}}if((X&4294901760)===0)Z[V++]=X>>12&15|224,Z[V++]=X>>6&63|128;else Z[V++]=X>>18&7|240,Z[V++]=X>>12&63|128,Z[V++]=X>>6&63|128}Z[V++]=X&63|128}}var xQ=new TextEncoder,fQ=50;function kQ($,Z,J){xQ.encodeInto($,Z.subarray(J))}function FJ($,Z,J){if($.length>fQ)kQ($,Z,J);else LQ($,Z,J)}var BQ=4096;function e$($,Z,J){let Q=Z,V=Q+J,Y=[],X="";while(Q<V){let W=$[Q++];if((W&128)===0)Y.push(W);else if((W&224)===192){let z=$[Q++]&63;Y.push((W&31)<<6|z)}else if((W&240)===224){let z=$[Q++]&63,K=$[Q++]&63;Y.push((W&31)<<12|z<<6|K)}else if((W&248)===240){let z=$[Q++]&63,K=$[Q++]&63,F=$[Q++]&63,N=(W&7)<<18|z<<12|K<<6|F;if(N>65535)N-=65536,Y.push(N>>>10&1023|55296),N=56320|N&1023;Y.push(N)}else Y.push(W);if(Y.length>=BQ)X+=String.fromCharCode(...Y),Y.length=0}if(Y.length>0)X+=String.fromCharCode(...Y);return X}var EQ=new TextDecoder,mQ=200;function gQ($,Z,J){let Q=$.subarray(Z,Z+J);return EQ.decode(Q)}function NJ($,Z,J){if(J>mQ)return gQ($,Z,J);else return e$($,Z,J)}class u0{type;data;constructor($,Z){this.type=$,this.data=Z}}class s extends Error{constructor($){super($);let Z=Object.create(s.prototype);Object.setPrototypeOf(this,Z),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:s.name})}}var l0=4294967295;function RJ($,Z,J){let Q=J/4294967296,V=J;$.setUint32(Z,Q),$.setUint32(Z+4,V)}function H$($,Z,J){let Q=Math.floor(J/4294967296),V=J;$.setUint32(Z,Q),$.setUint32(Z+4,V)}function M$($,Z){let J=$.getInt32(Z),Q=$.getUint32(Z+4);return J*4294967296+Q}function UJ($,Z){let J=$.getUint32(Z),Q=$.getUint32(Z+4);return J*4294967296+Q}var SQ=-1,vQ=4294967295,bQ=17179869183;function yQ({sec:$,nsec:Z}){if($>=0&&Z>=0&&$<=bQ)if(Z===0&&$<=vQ){let J=new Uint8Array(4);return new DataView(J.buffer).setUint32(0,$),J}else{let J=$/4294967296,Q=$&4294967295,V=new Uint8Array(8),Y=new DataView(V.buffer);return Y.setUint32(0,Z<<2|J&3),Y.setUint32(4,Q),V}else{let J=new Uint8Array(12),Q=new DataView(J.buffer);return Q.setUint32(0,Z),H$(Q,4,$),J}}function iQ($){let Z=$.getTime(),J=Math.floor(Z/1000),Q=(Z-J*1000)*1e6,V=Math.floor(Q/1e9);return{sec:J+V,nsec:Q-V*1e9}}function hQ($){if($ instanceof Date){let Z=iQ($);return yQ(Z)}else return null}function uQ($){let Z=new DataView($.buffer,$.byteOffset,$.byteLength);switch($.byteLength){case 4:{let J=Z.getUint32(0),Q=0;return{sec:J,nsec:0}}case 8:{let J=Z.getUint32(0),Q=Z.getUint32(4),V=(J&3)*4294967296+Q,Y=J>>>2;return{sec:V,nsec:Y}}case 12:{let J=M$(Z,4),Q=Z.getUint32(0);return{sec:J,nsec:Q}}default:throw new s(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${$.length}`)}}function lQ($){let Z=uQ($);return new Date(Z.sec*1000+Z.nsec/1e6)}var OJ={type:SQ,encode:hQ,decode:lQ};class p0{static defaultCodec=new p0;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(OJ)}register({type:$,encode:Z,decode:J}){if($>=0)this.encoders[$]=Z,this.decoders[$]=J;else{let Q=-1-$;this.builtInEncoders[Q]=Z,this.builtInDecoders[Q]=J}}tryToEncode($,Z){for(let J=0;J<this.builtInEncoders.length;J++){let Q=this.builtInEncoders[J];if(Q!=null){let V=Q($,Z);if(V!=null){let Y=-1-J;return new u0(Y,V)}}}for(let J=0;J<this.encoders.length;J++){let Q=this.encoders[J];if(Q!=null){let V=Q($,Z);if(V!=null)return new u0(J,V)}}if($ instanceof u0)return $;return null}decode($,Z,J){let Q=Z<0?this.builtInDecoders[-1-Z]:this.decoders[Z];if(Q)return Q($,Z,J);else return new u0(Z,$)}}function pQ($){return $ instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&$ instanceof SharedArrayBuffer}function Q$($){if($ instanceof Uint8Array)return $;else if(ArrayBuffer.isView($))return new Uint8Array($.buffer,$.byteOffset,$.byteLength);else if(pQ($))return new Uint8Array($);else return Uint8Array.from($)}var nQ=100,cQ=2048;class C${extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor($){this.extensionCodec=$?.extensionCodec??p0.defaultCodec,this.context=$?.context,this.useBigInt64=$?.useBigInt64??!1,this.maxDepth=$?.maxDepth??nQ,this.initialBufferSize=$?.initialBufferSize??cQ,this.sortKeys=$?.sortKeys??!1,this.forceFloat32=$?.forceFloat32??!1,this.ignoreUndefined=$?.ignoreUndefined??!1,this.forceIntegerToFloat=$?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new C$({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($){if(this.entered)return this.clone().encodeSharedRef($);try{return this.entered=!0,this.reinitializeState(),this.doEncode($,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode($){if(this.entered)return this.clone().encode($);try{return this.entered=!0,this.reinitializeState(),this.doEncode($,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode($,Z){if(Z>this.maxDepth)throw Error(`Too deep objects in depth ${Z}`);if($==null)this.encodeNil();else if(typeof $==="boolean")this.encodeBoolean($);else if(typeof $==="number")if(!this.forceIntegerToFloat)this.encodeNumber($);else this.encodeNumberAsFloat($);else if(typeof $==="string")this.encodeString($);else if(this.useBigInt64&&typeof $==="bigint")this.encodeBigInt64($);else this.encodeObject($,Z)}ensureBufferSizeToWrite($){let Z=this.pos+$;if(this.view.byteLength<Z)this.resizeBuffer(Z*2)}resizeBuffer($){let Z=new ArrayBuffer($),J=new Uint8Array(Z),Q=new DataView(Z);J.set(this.bytes),this.view=Q,this.bytes=J}encodeNil(){this.writeU8(192)}encodeBoolean($){if($===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber($){if(!this.forceIntegerToFloat&&Number.isSafeInteger($))if($>=0)if($<128)this.writeU8($);else if($<256)this.writeU8(204),this.writeU8($);else if($<65536)this.writeU8(205),this.writeU16($);else if($<4294967296)this.writeU8(206),this.writeU32($);else if(!this.useBigInt64)this.writeU8(207),this.writeU64($);else this.encodeNumberAsFloat($);else if($>=-32)this.writeU8(224|$+32);else if($>=-128)this.writeU8(208),this.writeI8($);else if($>=-32768)this.writeU8(209),this.writeI16($);else if($>=-2147483648)this.writeU8(210),this.writeI32($);else if(!this.useBigInt64)this.writeU8(211),this.writeI64($);else this.encodeNumberAsFloat($);else this.encodeNumberAsFloat($)}encodeNumberAsFloat($){if(this.forceFloat32)this.writeU8(202),this.writeF32($);else this.writeU8(203),this.writeF64($)}encodeBigInt64($){if($>=BigInt(0))this.writeU8(207),this.writeBigUint64($);else this.writeU8(211),this.writeBigInt64($)}writeStringHeader($){if($<32)this.writeU8(160+$);else if($<256)this.writeU8(217),this.writeU8($);else if($<65536)this.writeU8(218),this.writeU16($);else if($<4294967296)this.writeU8(219),this.writeU32($);else throw Error(`Too long string: ${$} bytes in UTF-8`)}encodeString($){let J=KJ($);this.ensureBufferSizeToWrite(5+J),this.writeStringHeader(J),FJ($,this.bytes,this.pos),this.pos+=J}encodeObject($,Z){let J=this.extensionCodec.tryToEncode($,this.context);if(J!=null)this.encodeExtension(J);else if(Array.isArray($))this.encodeArray($,Z);else if(ArrayBuffer.isView($))this.encodeBinary($);else if(typeof $==="object")this.encodeMap($,Z);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply($)}`)}encodeBinary($){let Z=$.byteLength;if(Z<256)this.writeU8(196),this.writeU8(Z);else if(Z<65536)this.writeU8(197),this.writeU16(Z);else if(Z<4294967296)this.writeU8(198),this.writeU32(Z);else throw Error(`Too large binary: ${Z}`);let J=Q$($);this.writeU8a(J)}encodeArray($,Z){let J=$.length;if(J<16)this.writeU8(144+J);else if(J<65536)this.writeU8(220),this.writeU16(J);else if(J<4294967296)this.writeU8(221),this.writeU32(J);else throw Error(`Too large array: ${J}`);for(let Q of $)this.doEncode(Q,Z+1)}countWithoutUndefined($,Z){let J=0;for(let Q of Z)if($[Q]!==void 0)J++;return J}encodeMap($,Z){let J=Object.keys($);if(this.sortKeys)J.sort();let Q=this.ignoreUndefined?this.countWithoutUndefined($,J):J.length;if(Q<16)this.writeU8(128+Q);else if(Q<65536)this.writeU8(222),this.writeU16(Q);else if(Q<4294967296)this.writeU8(223),this.writeU32(Q);else throw Error(`Too large map object: ${Q}`);for(let V of J){let Y=$[V];if(!(this.ignoreUndefined&&Y===void 0))this.encodeString(V),this.doEncode(Y,Z+1)}}encodeExtension($){if(typeof $.data==="function"){let J=$.data(this.pos+6),Q=J.length;if(Q>=4294967296)throw Error(`Too large extension object: ${Q}`);this.writeU8(201),this.writeU32(Q),this.writeI8($.type),this.writeU8a(J);return}let Z=$.data.length;if(Z===1)this.writeU8(212);else if(Z===2)this.writeU8(213);else if(Z===4)this.writeU8(214);else if(Z===8)this.writeU8(215);else if(Z===16)this.writeU8(216);else if(Z<256)this.writeU8(199),this.writeU8(Z);else if(Z<65536)this.writeU8(200),this.writeU16(Z);else if(Z<4294967296)this.writeU8(201),this.writeU32(Z);else throw Error(`Too large extension object: ${Z}`);this.writeI8($.type),this.writeU8a($.data)}writeU8($){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,$),this.pos++}writeU8a($){let Z=$.length;this.ensureBufferSizeToWrite(Z),this.bytes.set($,this.pos),this.pos+=Z}writeI8($){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,$),this.pos++}writeU16($){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,$),this.pos+=2}writeI16($){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,$),this.pos+=2}writeU32($){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,$),this.pos+=4}writeI32($){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,$),this.pos+=4}writeF32($){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,$),this.pos+=4}writeF64($){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,$),this.pos+=8}writeU64($){this.ensureBufferSizeToWrite(8),RJ(this.view,this.pos,$),this.pos+=8}writeI64($){this.ensureBufferSizeToWrite(8),H$(this.view,this.pos,$),this.pos+=8}writeBigUint64($){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,$),this.pos+=8}writeBigInt64($){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,$),this.pos+=8}}function _0($,Z){return new C$(Z).encodeSharedRef($)}function P$($){return`${$<0?"-":""}0x${Math.abs($).toString(16).padStart(2,"0")}`}var dQ=16,rQ=16;class $Z{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor($=dQ,Z=rQ){this.maxKeyLength=$,this.maxLengthPerKey=Z,this.caches=[];for(let J=0;J<this.maxKeyLength;J++)this.caches.push([])}canBeCached($){return $>0&&$<=this.maxKeyLength}find($,Z,J){let Q=this.caches[J-1];$:for(let V of Q){let Y=V.bytes;for(let X=0;X<J;X++)if(Y[X]!==$[Z+X])continue $;return V.str}return null}store($,Z){let J=this.caches[$.length-1],Q={bytes:$,str:Z};if(J.length>=this.maxLengthPerKey)J[Math.random()*J.length|0]=Q;else J.push(Q)}decode($,Z,J){let Q=this.find($,Z,J);if(Q!=null)return this.hit++,Q;this.miss++;let V=e$($,Z,J),Y=Uint8Array.prototype.slice.call($,Z,Z+J);return this.store(Y,V),V}}var ZZ="array",Y$="map_key",IJ="map_value",oQ=($)=>{if(typeof $==="string"||typeof $==="number")return $;throw new s("The type of key must be string or number but "+typeof $)};class HJ{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState($){let Z=this.getUninitializedStateFromPool();Z.type=ZZ,Z.position=0,Z.size=$,Z.array=Array($)}pushMapState($){let Z=this.getUninitializedStateFromPool();Z.type=Y$,Z.readCount=0,Z.size=$,Z.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let $={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push($)}return this.stack[this.stackHeadPosition]}release($){if(this.stack[this.stackHeadPosition]!==$)throw Error("Invalid stack state. Released state is not on top of the stack.");if($.type===ZZ){let J=$;J.size=0,J.array=void 0,J.position=0,J.type=void 0}if($.type===Y$||$.type===IJ){let J=$;J.size=0,J.map=void 0,J.readCount=0,J.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}}var V$=-1,JZ=new DataView(new ArrayBuffer(0)),aQ=new Uint8Array(JZ.buffer);try{JZ.getInt8(0)}catch($){if(!($ 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 qJ=RangeError("Insufficient data"),sQ=new $Z;class w${extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=JZ;bytes=aQ;headByte=V$;stack=new HJ;entered=!1;constructor($){this.extensionCodec=$?.extensionCodec??p0.defaultCodec,this.context=$?.context,this.useBigInt64=$?.useBigInt64??!1,this.rawStrings=$?.rawStrings??!1,this.maxStrLength=$?.maxStrLength??l0,this.maxBinLength=$?.maxBinLength??l0,this.maxArrayLength=$?.maxArrayLength??l0,this.maxMapLength=$?.maxMapLength??l0,this.maxExtLength=$?.maxExtLength??l0,this.keyDecoder=$?.keyDecoder!==void 0?$.keyDecoder:sQ,this.mapKeyConverter=$?.mapKeyConverter??oQ}clone(){return new w$({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=V$,this.stack.reset()}setBuffer($){let Z=Q$($);this.bytes=Z,this.view=new DataView(Z.buffer,Z.byteOffset,Z.byteLength),this.pos=0}appendBuffer($){if(this.headByte===V$&&!this.hasRemaining(1))this.setBuffer($);else{let Z=this.bytes.subarray(this.pos),J=Q$($),Q=new Uint8Array(Z.length+J.length);Q.set(Z),Q.set(J,Z.length),this.setBuffer(Q)}}hasRemaining($){return this.view.byteLength-this.pos>=$}createExtraByteError($){let{view:Z,pos:J}=this;return RangeError(`Extra ${Z.byteLength-J} of ${Z.byteLength} byte(s) found at buffer[${$}]`)}decode($){if(this.entered)return this.clone().decode($);try{this.entered=!0,this.reinitializeState(),this.setBuffer($);let Z=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return Z}finally{this.entered=!1}}*decodeMulti($){if(this.entered){yield*this.clone().decodeMulti($);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer($);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync($){if(this.entered)return this.clone().decodeAsync($);try{this.entered=!0;let Z=!1,J;for await(let X of $){if(Z)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(X);try{J=this.doDecodeSync(),Z=!0}catch(W){if(!(W instanceof RangeError))throw W}this.totalPos+=this.pos}if(Z){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return J}let{headByte:Q,pos:V,totalPos:Y}=this;throw RangeError(`Insufficient data in parsing ${P$(Q)} at ${Y} (${V} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream($){return this.decodeMultiAsync($,!0)}decodeStream($){return this.decodeMultiAsync($,!1)}async*decodeMultiAsync($,Z){if(this.entered){yield*this.clone().decodeMultiAsync($,Z);return}try{this.entered=!0;let J=Z,Q=-1;for await(let V of $){if(Z&&Q===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(V),J)Q=this.readArraySize(),J=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--Q===0)break}catch(Y){if(!(Y instanceof RangeError))throw Y}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){$:while(!0){let $=this.readHeadByte(),Z;if($>=224)Z=$-256;else if($<192)if($<128)Z=$;else if($<144){let Q=$-128;if(Q!==0){this.pushMapState(Q),this.complete();continue $}else Z={}}else if($<160){let Q=$-144;if(Q!==0){this.pushArrayState(Q),this.complete();continue $}else Z=[]}else{let Q=$-160;Z=this.decodeString(Q,0)}else if($===192)Z=null;else if($===194)Z=!1;else if($===195)Z=!0;else if($===202)Z=this.readF32();else if($===203)Z=this.readF64();else if($===204)Z=this.readU8();else if($===205)Z=this.readU16();else if($===206)Z=this.readU32();else if($===207)if(this.useBigInt64)Z=this.readU64AsBigInt();else Z=this.readU64();else if($===208)Z=this.readI8();else if($===209)Z=this.readI16();else if($===210)Z=this.readI32();else if($===211)if(this.useBigInt64)Z=this.readI64AsBigInt();else Z=this.readI64();else if($===217){let Q=this.lookU8();Z=this.decodeString(Q,1)}else if($===218){let Q=this.lookU16();Z=this.decodeString(Q,2)}else if($===219){let Q=this.lookU32();Z=this.decodeString(Q,4)}else if($===220){let Q=this.readU16();if(Q!==0){this.pushArrayState(Q),this.complete();continue $}else Z=[]}else if($===221){let Q=this.readU32();if(Q!==0){this.pushArrayState(Q),this.complete();continue $}else Z=[]}else if($===222){let Q=this.readU16();if(Q!==0){this.pushMapState(Q),this.complete();continue $}else Z={}}else if($===223){let Q=this.readU32();if(Q!==0){this.pushMapState(Q),this.complete();continue $}else Z={}}else if($===196){let Q=this.lookU8();Z=this.decodeBinary(Q,1)}else if($===197){let Q=this.lookU16();Z=this.decodeBinary(Q,2)}else if($===198){let Q=this.lookU32();Z=this.decodeBinary(Q,4)}else if($===212)Z=this.decodeExtension(1,0);else if($===213)Z=this.decodeExtension(2,0);else if($===214)Z=this.decodeExtension(4,0);else if($===215)Z=this.decodeExtension(8,0);else if($===216)Z=this.decodeExtension(16,0);else if($===199){let Q=this.lookU8();Z=this.decodeExtension(Q,1)}else if($===200){let Q=this.lookU16();Z=this.decodeExtension(Q,2)}else if($===201){let Q=this.lookU32();Z=this.decodeExtension(Q,4)}else throw new s(`Unrecognized type byte: ${P$($)}`);this.complete();let J=this.stack;while(J.length>0){let Q=J.top();if(Q.type===ZZ)if(Q.array[Q.position]=Z,Q.position++,Q.position===Q.size)Z=Q.array,J.release(Q);else continue $;else if(Q.type===Y$){if(Z==="__proto__")throw new s("The key __proto__ is not allowed");Q.key=this.mapKeyConverter(Z),Q.type=IJ;continue $}else if(Q.map[Q.key]=Z,Q.readCount++,Q.readCount===Q.size)Z=Q.map,J.release(Q);else{Q.key=null,Q.type=Y$;continue $}}return Z}}readHeadByte(){if(this.headByte===V$)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=V$}readArraySize(){let $=this.readHeadByte();switch($){case 220:return this.readU16();case 221:return this.readU32();default:if($<160)return $-144;else throw new s(`Unrecognized array type byte: ${P$($)}`)}}pushMapState($){if($>this.maxMapLength)throw new s(`Max length exceeded: map length (${$}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState($)}pushArrayState($){if($>this.maxArrayLength)throw new s(`Max length exceeded: array length (${$}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState($)}decodeString($,Z){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String($,Z);return this.decodeBinary($,Z)}decodeUtf8String($,Z){if($>this.maxStrLength)throw new s(`Max length exceeded: UTF-8 byte length (${$}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+Z+$)throw qJ;let J=this.pos+Z,Q;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached($))Q=this.keyDecoder.decode(this.bytes,J,$);else Q=NJ(this.bytes,J,$);return this.pos+=Z+$,Q}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===Y$;return!1}decodeBinary($,Z){if($>this.maxBinLength)throw new s(`Max length exceeded: bin length (${$}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining($+Z))throw qJ;let J=this.pos+Z,Q=this.bytes.subarray(J,J+$);return this.pos+=Z+$,Q}decodeExtension($,Z){if($>this.maxExtLength)throw new s(`Max length exceeded: ext length (${$}) > maxExtLength (${this.maxExtLength})`);let J=this.view.getInt8(this.pos+Z),Q=this.decodeBinary($,Z+1);return this.extensionCodec.decode(Q,J,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 $=this.view.getUint8(this.pos);return this.pos++,$}readI8(){let $=this.view.getInt8(this.pos);return this.pos++,$}readU16(){let $=this.view.getUint16(this.pos);return this.pos+=2,$}readI16(){let $=this.view.getInt16(this.pos);return this.pos+=2,$}readU32(){let $=this.view.getUint32(this.pos);return this.pos+=4,$}readI32(){let $=this.view.getInt32(this.pos);return this.pos+=4,$}readU64(){let $=UJ(this.view,this.pos);return this.pos+=8,$}readI64(){let $=M$(this.view,this.pos);return this.pos+=8,$}readU64AsBigInt(){let $=this.view.getBigUint64(this.pos);return this.pos+=8,$}readI64AsBigInt(){let $=this.view.getBigInt64(this.pos);return this.pos+=8,$}readF32(){let $=this.view.getFloat32(this.pos);return this.pos+=4,$}readF64(){let $=this.view.getFloat64(this.pos);return this.pos+=8,$}}function QZ($,Z){return new w$(Z).decode($)}class X${listeners=new Map;addEventListener($,Z){let J=this.listeners.get($);if(!J)J=new Set,this.listeners.set($,J);return J.add(Z),()=>{this.removeEventListener($,Z)}}removeEventListener($,Z){let J=this.listeners.get($);if(J){if(J.delete(Z),J.size===0)this.listeners.delete($)}}emit($,Z){let J=this.listeners.get($);if(J){let Q=Array.from(J);for(let V of Q)V(Z)}}emitAll($){let Z=Array.from(this.listeners.keys());for(let J of Z)this.emit(J,$)}}class L0{getter;static eventName="update";emitter;constructor($){this.getter=$;this.emitter=new X$}get=()=>this.getter();async emit(){let $=await this.getter();queueMicrotask(()=>this.emitter.emit(L0.eventName,$))}listen($){return this.emitter.addEventListener(L0.eventName,$),()=>{this.emitter.removeEventListener(L0.eventName,$)}}}function R($){return[$,0]}function G($){return[void 0,$]}function tQ($){if($<0)console.info("N",$),console.trace();if(typeof $!=="bigint")$=BigInt($);if($<0n)return G(10);let Z=[];while($>0n){let J=Number($&0x7fn);if($>>=7n,$>0n)Z.push(J|128);else Z.push(J)}if(Z.length===0)return R(new Uint8Array([0]));if(Z.length>8)return G(26);return R(new Uint8Array(Z))}function eQ($,Z=0){let J=0n,Q=0,V=Z;while(!0){if(V>=$.length)return G(14);let Y=$[V++];if(Y===void 0)return G(14);if(J|=BigInt(Y&127)<<BigInt(Q),(Y&128)===0){if(V-Z>8)return G(26);return R({value:J>0x1fffffffffffffn?J:Number(J),bytesRead:V-Z})}if(Q+=7,Q>=56)return G(26)}}class g{data;pos=0;constructor($){this.data=$}static async fromResponse($){let Z=await $.arrayBuffer(),J=new Uint8Array(Z);return new g(J)}readBigInt(){if(this.pos+8>this.data.length)return G(7);let $=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,R($)}readDate(){let[$,Z]=this.readVarInt();if(Z!==0)return G(Z);return R(new Date($))}readVarInt(){let[$,Z]=eQ(this.data,this.pos);if(Z!==0)return G(Z);this.pos+=$.bytesRead;let J=$.value;return R(typeof J==="bigint"?Number(J):J)}readVarString(){let[$,Z]=this.readVarInt();if(Z!==0)return G(Z);let[J,Q]=this.readBytes($);if(Q!==0)return G(Q);let V=new TextDecoder().decode(J);return R(V)}readBytes($){if($<0)return G(10);if(this.pos+$>this.data.length)return G(23);let Z=this.data.slice(this.pos,this.pos+$);return this.pos+=$,R(Z)}readVarBytes(){let[$,Z]=this.readVarInt();if(Z!==0)return G(Z);return this.readBytes($)}readStruct($){return $.decode(this)}readStructs($){let Z=[];while(!this.done()){let[J,Q]=this.readStruct($);if(Q!==0)return G(Q);Z.push(J)}return R(Z)}readBytesSeq($){let Z=[];while(!this.done()){let[J,Q]=this.readBytes($);if(Q!==0)return G(Q);Z.push(J)}return R(Z)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class S{parts=[];writeBigInt($){let Z=new Uint8Array(8);new DataView(Z.buffer).setBigUint64(0,$,!1),this.parts.push(Z)}writeDate($){let Z=$.getTime();return this.writeVarInt(Z)}writeVarInt($){let[Z,J]=tQ($);if(J!==0)return J;return this.parts.push(Z),0}writeVarString($){let Z=new TextEncoder().encode($),J=this.writeVarInt(Z.length);if(J!==0)return J;return this.writeBytes(Z),0}prependBytes($){this.parts.unshift($)}writeBytes($){this.parts.push($)}writeVarBytes($){let Z=this.writeVarInt($.length);if(Z!==0)return Z;return this.writeBytes($),0}writeStruct($,Z){return $.encode(this,Z)}writeStructs($,Z){for(let J of Z){let Q=this.writeStruct($,J);if(Q!==0)return Q}return 0}writeBytesSeq($){for(let Z of $)this.writeBytes(Z)}result(){let $=this.parts.reduce((Q,V)=>Q+V.length,0),Z=new Uint8Array($),J=0;for(let Q of this.parts)Z.set(Q,J),J+=Q.length;return Z}*scan(){for(let $ of this.parts)yield $}}async function VZ($,Z){let J=new S,Q=J.writeDate(Z);if(Q!==0)return G(Q);let V=J.result(),Y=await $.sign(V);return R({pubKey:$.publicKey,sig:Y,timestamp:Z})}async function D0($,Z,J){let Q=J.now().getTime(),V=$.timestamp.getTime();if(Math.abs(Q-V)>WJ)return 4;let X=new S;X.writeDate($.timestamp);let W=X.result();if(!await Z.checkSigEd25519($.sig,W,$.pubKey))return 3;return 0}var Q0={encode($,Z){let J=$.writeVarBytes(Z.id);if(J!==0)return J;let Q=$.writeDate(Z.ts);if(Q!==0)return Q;return 0},decode($){let[Z,J]=$.readVarBytes();if(J!==0)return G(J);let[Q,V]=$.readDate();if(V!==0)return G(V);return R({id:Z,ts:Q})}};function T$($){let Z=new S,J=Z.writeStruct(Q0,$);if(J!==0)return G(J);let Q=Z.result();return R(Q)}var X0={encode($,Z){let J=$.writeVarBytes(Z.eid);if(J!==0)return J;let Q=$.writeVarInt(Z.off);if(Q!==0)return Q;let V=$.writeVarInt(Z.ctr);if(V!==0)return V;let Y=$.writeVarInt(Z.len);if(Y!==0)return Y;if(Z.hsh)$.writeBytes(Z.hsh);return 0},decode($){let[Z,J]=$.readVarBytes();if(J!==0)return G(J);let Q=new g(Z),[,V]=Q0.decode(Q);if(V!==0)return G(V);let[Y,X]=$.readVarInt();if(X!==0)return G(X);let[W,z]=$.readVarInt();if(z!==0)return G(z);let[K,F]=$.readVarInt();if(F!==0)return G(F);let N;if(K>0){let[U,O]=$.readBytes(I$);if(O!==0)return G(O);N=U}return R({eid:Z,off:Y,ctr:W,len:K,hsh:N})}};function N0($){return Array.from($).map((J)=>J.toString(16).padStart(2,"0")).join("")}function D$($){if($.length%2!==0)throw Error("Invalid hex string");let Z=new Uint8Array($.length/2);for(let J=0;J<$.length;J+=2)Z[J/2]=Number.parseInt($.substr(J,2),16);return Z}function V0($,Z){if($===Z)return!0;if($.byteLength!==Z.byteLength)return!1;return $.every((J,Q)=>J===Z[Q])}var f;if(typeof Uint8Array.prototype.toBase64==="function")f=($)=>$.toBase64();else f=($)=>btoa(String.fromCharCode(...$));var F0;if(typeof Uint8Array.fromBase64==="function")F0=($)=>Uint8Array.fromBase64($);else F0=($)=>Uint8Array.from(atob($),(Z)=>Z.charCodeAt(0));function W$($,Z){let J=new Uint8Array($.length+Z.length);return J.set($,0),J.set(Z,$.length),J}function MJ($,Z,J){return J.checkSigEd25519($.sig,$.headCph,Z)}async function CJ($,Z,J,Q){let V;if($.bod&&$.len>0)V=await J.blake3($.bod);let Y=new S,X=X0.encode(Y,{...$,hsh:V});if(X!==0)return G(X);let W=Y.result(),z=await Z.kdmFor(W),K=Q.deriveCipher(z,"encrypt"),F=await K.encrypt(W),N=$.bod?await K.encrypt($.bod):new Uint8Array(0),U=await Z.sign(F);return R({sig:U,kdm:z,headCph:F,bodyCph:N})}async function YZ($,Z,J,Q,V){let Y=new g($),[X,W]=X0.decode(Y);if(W!==0)return G(14);let z;try{z=Z&&Z.length>0?await J.decrypt(Z):void 0}catch{return G(20)}let K=X.hsh&&z===void 0,F=X.hsh===void 0&&z!==void 0;if(K||F)return G(19);if(X.hsh&&z){let U=await Q.blake3(z);if(!V0(U,X.hsh))return G(19)}let N=V??await Q.blake3($);return R({msgHead:X,bod:z,headHash:N})}class XZ{now(){return new Date}}function PJ($,Z,J,Q){let V=Z.getTime()-$.getTime(),Y=J.getTime()-Q.getTime();return(V+Y)/2}var G$={encode($,Z){if($.writeVarInt(Z.quota),Z.quota>0){if(Z.usage===void 0)return 9;$.writeVarInt(Z.usage)}return 0},decode($){let[Z,J]=$.readVarInt();if(J!==0)return G(J);let Q;if(Z>0){let[V,Y]=$.readVarInt();if(Y!==0)return G(Y);Q=V}return R({quota:Z,usage:Q})}};var WZ={encode($,Z){$.writeBytes(new Uint8Array([Z.status]));let J=$.writeDate(Z.timeRcvd);if(J!==0)return J;let Q=$.writeDate(Z.timeSent);if(Q!==0)return Q;let V=$.writeVarInt(Z.subscription.term);if(V!==0)return V;let Y=$.writeVarInt(Z.subscription.elapsed);if(Y!==0)return Y;let X=$.writeStruct(G$,Z.subscription.stat);if(X!==0)return X;let W=$.writeStruct(G$,Z.subscription.dyn);if(W!==0)return W;return 0},decode($){let[Z,J]=$.readBytes(1);if(J!==0)return G(J);let Q=Z[0],[V,Y]=$.readDate();if(Y!==0)return G(Y);let[X,W]=$.readDate();if(W!==0)return G(W);let[z,K]=$.readVarInt();if(K!==0)return G(K);let[F,N]=$.readVarInt();if(N!==0)return G(N);let[U,O]=$.readStruct(G$);if(O!==0)return G(O);let[q,I]=$.readStruct(G$);if(I!==0)return G(I);return R({status:Q,timeRcvd:V,timeSent:X,subscription:{term:z,elapsed:F,stat:U,dyn:q}})}};var GZ={encode($,Z){let J=$.writeVarBytes(Z.headCph);if(J!==0)return J;let Q=$.writeVarInt(Z.seq);if(Q!==0)return Q;return 0},decode($){let[Z,J]=$.readVarBytes();if(J!==0)return G(J);let[Q,V]=$.readVarInt();if(V!==0)return G(V);return R({headCph:Z,seq:Q})}};var Y0={encode($,Z){$.writeBytes(Z.pubKey),$.writeBytes(Z.sig);let J=$.writeDate(Z.timestamp);if(J!==0)return J;return 0},decode($){let[Z,J]=$.readBytes(XJ);if(J!==0)return G(J);let[Q,V]=$.readBytes(w0);if(V!==0)return G(V);let[Y,X]=$.readDate();if(X!==0)return G(X);return R({pubKey:Z,sig:Q,timestamp:Y})}};var wJ={async encodeReq($,Z,J,Q,V){let Y=V.writeStruct(Y0,J);if(Y!==0)return Y;for(let X of Q)V.writeVarInt(X);return 0},async handleReq($,Z,J){let{clock:Q,crypto:V,storage:Y}=$,[X,W]=Z.readStruct(Y0);if(W!==0)return W;let z=await D0(X,V,Q);if(z!==0)return z;let{pubKey:K}=X,[F,N]=await Y.hasUser(K);if(N!==0)return N;if(!F)return 5;let[U,O]=Z.readVarInt();if(O!==0)return O;if(!Z.done())return 8;let[q,I]=await Y.listHeads(K,U);if(I!==0)return I;return J.writeStructs(GZ,q)},decodeResp($){return $.readStructs(GZ)}};var zZ={encode($,Z){$.writeVarInt(Z.seq);let J=$.writeVarBytes(Z.bodyCph);if(J!==0)return J;return 0},decode($){let[Z,J]=$.readVarInt();if(J!==0)return G(J);let[Q,V]=$.readVarBytes();if(V!==0)return G(V);return R({seq:Z,bodyCph:Q})}};var TJ={async encodeReq($,Z,J,Q,V){let Y=V.writeStruct(Y0,J);if(Y!==0)return Y;for(let X of Q){let W=V.writeVarInt(X);if(W!==0)return W}return 0},async handleReq($,Z,J){let{clock:Q,crypto:V,storage:Y}=$,[X,W]=Z.readStruct(Y0);if(W!==0)return W;let z=await D0(X,V,Q);if(z!==0)return z;let{pubKey:K}=X,[F,N]=await Y.hasUser(K);if(N!==0)return N;if(!F)return 5;let U=[];while(!Z.done()){let[I,H]=Z.readVarInt();if(H!==0)return H;U.push(I)}console.info(`PULL: ${U.length} bags`);let[O,q]=await Y.getBodies(K,U);if(q!==0)return q;if(!O)return 17;for(let{seq:I,bodyCph:H}of O){let P={seq:I,bodyCph:H},C=J.writeStruct(zZ,P);if(C!==0)return C}return 0},decodeResp($){return $.readStructs(zZ)}};var KZ={encode($,Z){$.writeBytes(Z.sig),$.writeBytes(Z.kdm);let J=$.writeVarBytes(Z.headCph);if(J!==0)return J;let Q=$.writeVarBytes(Z.bodyCph);if(Q!==0)return Q;return 0},decode($){let[Z,J]=$.readBytes(w0);if(J!==0)return G(J);let[Q,V]=$.readBytes(T0);if(V!==0)return G(V);let[Y,X]=$.readVarBytes();if(X!==0)return G(X);let[W,z]=$.readVarBytes();if(z!==0)return G(z);return R({sig:Z,kdm:Q,headCph:Y,bodyCph:W})}};var j$={encode($,Z){let J=$.writeVarInt(Z.seq);if(J!==0)return J;let Q=$.writeVarBytes(Z.headCph);if(Q!==0)return Q;let V=Z.bodyCph?Z.bodyCph.length:0,Y=$.writeVarInt(V);if(Y!==0)return Y;if(V>0){if(!Z.bodyCph)return 10;$.writeBytes(Z.bodyCph)}return 0},decode($){let[Z,J]=$.readVarInt();if(J!==0)return G(J);let[Q,V]=$.readVarBytes();if(V!==0)return G(V);let[Y,X]=$.readVarInt();if(X!==0)return G(X);let W;if(Y>0){let[z,K]=$.readBytes(Y);if(K!==0)return G(K);W=z}return R({seq:Z,headCph:Q,bodyCph:W})}};var A$={encode($,Z){$.writeBytes(Z.sig),$.writeBytes(Z.kdm);let J=$.writeVarBytes(Z.headCph);if(J!==0)return J;return 0},decode($){let[Z,J]=$.readBytes(w0);if(J!==0)return G(J);let[Q,V]=$.readBytes(T0);if(V!==0)return G(V);let[Y,X]=$.readVarBytes();if(X!==0)return G(X);return R({sig:Z,kdm:Q,headCph:Y})}};var _$={encode($,Z){if($.writeVarInt(Z.idx),$.writeBytes(new Uint8Array([Z.status])),Z.status===0)$.writeVarInt(Z.seq);return 0},decode($){let[Z,J]=$.readVarInt();if(J!==0)return G(J);let[Q,V]=$.readBytes(1);if(V!==0)return G(V);let Y=Q[0];if(Y!==0)return R({idx:Z,status:Y});let[X,W]=$.readVarInt();if(W!==0)return G(W);return R({idx:Z,status:Y,seq:X})}};var DJ={async encodeReq($,Z,J,Q,V){let Y=V.writeStruct(Y0,J);if(Y!==0)return Y;let X=V.writeStructs(KZ,Q);if(X!==0)return X;return 0},async handleReq($,Z,J){let{clock:Q,crypto:V,storage:Y,notifier:X}=$,[W,z]=Z.readStruct(Y0);if(z!==0)return z;let K=await D0(W,V,Q);if(K!==0)return K;let{pubKey:F}=W,[N,U]=await Y.hasUser(F);if(U!==0)return U;if(!N)return 5;let[O,q]=Z.readStructs(KZ);if(q!==0)return q;console.info(`PUSH: ${O.length} bags`);let I=[],H=[];for(let M=0;M<O.length;M++){let A=O[M];if(!await MJ(A,F,V)){let m={idx:M,status:3},E=J.writeStruct(_$,m);if(E!==0)return E;continue}I.push(M),H.push(A)}let[P,C]=await Y.setBags(F,H);if(C!==0)return C;if(!P||P.length!==H.length)return 17;let T=[];for(let M=0;M<H.length;M++){let A=H[M],x=I[M],m=P[M],E=new S,k=E.writeStruct(A$,A);if(k!==0)return k;let b=E.result(),w={seq:m,headCph:b};if(O.length===1&&A.bodyCph.length<=GJ)w.bodyCph=A.bodyCph;T.push(w);let h={idx:x,status:0,seq:m},l=J.writeStruct(_$,h);if(l!==0)return l}if(T.length>0){let M=new S,A=M.writeStructs(j$,T);if(A!==0)return A;let x=M.result();await Promise.resolve(X.push(F,x))}return 0},decodeResp($){return $.readStructs(_$)}};var jJ={async encodeReq($,Z,J,Q,V){return V.writeStruct(Y0,J)},async handleReq($,Z,J){let{clock:Q,crypto:V,storage:Y}=$,[X,W]=Z.readStruct(Y0);if(W!==0)return W;let z=await D0(X,V,Q);if(z!==0)return z;let{pubKey:K}=X;if(!Z.done())return 8;let[F,N]=await Y.addUser(K);if(N!==0)return N;return 0},decodeResp($){return R(void 0)}};class FZ{url;websocket;constructor($){this.url=$}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect($,Z,J=()=>{},Q=()=>{}){let{url:V}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let Y=new S;Y.writeStruct(Y0,$);let X=Y.result(),W=N0(X);return V.searchParams.set("t",W),this.websocket=new WebSocket(V),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),Q()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,J()},this.websocket.onmessage=(z)=>{let K=new Uint8Array(z.data);Z(K)},this.websocket.onerror=(z)=>{console.log(`ERROR: ${JSON.stringify(z)}`),this.websocket=void 0,J()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}var r={user:{path:"/user",endpoint:jJ,name:0},push:{path:"/push",endpoint:DJ,name:2},peek:{path:"/peek",endpoint:wJ,name:1},pull:{path:"/pull",endpoint:TJ,name:3}},$V={0:r.user,2:r.push,1:r.peek,3:r.pull},QW={[r.user.path]:r.user,[r.push.path]:r.push,[r.peek.path]:r.peek,[r.pull.path]:r.pull};class AJ{url;listener;constructor($){this.url=$;this.listener=new FZ($)}async call($,Z){let{path:J}=$V[$],Q=new URL(J,this.url);try{return await ZV(Q,Z)}catch{return G(25)}}}var _J=($)=>{return new AJ($.handle)};async function ZV($,Z){let J=await fetch($,{method:"POST",body:Z.result().slice()});if(!J.ok)return G(24);let Q=await g.fromResponse(J);return R(Q)}class L${enclave;crypto;host;clock;transport;updateHostMeta;constructor($,Z,J,Q,V,Y){this.enclave=$;this.crypto=Z;this.host=J;this.clock=Q;this.transport=V;this.updateHostMeta=Y}async call($,Z){let{clock:J,transport:Q}=this,{endpoint:V,name:Y}=$,X=await this.identity(),W=J.now(),[z,K]=await VZ(X,W);if(K!==0)return G(K);let F=new S,N=await V.encodeReq(this,X,z,Z,F);if(N!==0)return G(N);let U=J.now(),[O,q]=await Q.call(Y,F),I=J.now();if(q!==0)return G(q);let[H,P]=O.readStruct(WZ);if(P!==0)return G(P);if(H.status!==0)return G(H.status);let T={clockOffset:PJ(U,H.timeRcvd,H.timeSent,I),subscription:H.subscription},M=await this.updateHostMeta(T);if(M!==0)return G(M);return V.decodeResp(O)}identity=()=>{let{host:$,enclave:Z}=this;return Z.deriveIdentity($.label,$.idx??0)};seal=async($)=>{let{crypto:Z,enclave:J}=this,Q=await this.identity();return CJ($,Q,Z,J)};register=()=>this.call(r.user,[]);peek=($)=>this.call(r.peek,[$]);push=($)=>this.call(r.push,$);pull=($)=>this.call(r.pull,$);listen=async($,Z,J)=>{let{clock:Q,transport:V}=this,{listener:Y}=V,X=await this.identity(),W=Q.now(),[z,K]=await VZ(X,W);if(K!==0)return K;return await Y.connect(z,$,Z,J)};isConnected(){let $=this.transport?.listener;if($&&typeof $.connected==="function")return $.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}var NZ={encode($,Z){let J=$.writeVarString(Z.lbl);if(J!==0)return J;let Q=$.writeVarInt(Z.idx);if(Q!==0)return Q;let V=$.writeVarInt(Z.num);if(V!==0)return V;return $.writeBytes(Z.hsh),$.writeBytes(Z.sig),0},decode($){let[Z,J]=$.readVarString();if(J!==0)return G(J);let[Q,V]=$.readVarInt();if(V!==0)return G(V);let[Y,X]=$.readVarInt();if(X!==0)return G(X);let[W,z]=$.readBytes(I$);if(z!==0)return G(z);let[K,F]=$.readBytes(w0);if(F!==0)return G(F);return R({lbl:Z,idx:Q,num:Y,hsh:W,sig:K})}};var RZ={encode($,Z){let J=$.writeStruct(NZ,Z.head);if(J!==0)return J;let Q=$.writeVarBytes(Z.indexEnc);if(Q!==0)return Q;let V=$.writeVarBytes(Z.bodyEnc);if(V!==0)return V;return 0},decode($){let[Z,J]=$.readStruct(NZ);if(J!==0)return G(J);let[Q,V]=$.readVarBytes();if(V!==0)return G(V);let[Y,X]=$.readVarBytes();if(X!==0)return G(X);return R({head:Z,indexEnc:Q,bodyEnc:Y})}};var UZ={encode($,Z){$.writeBytes(Z.kdm);let J=$.writeVarBytes(Z.headCph);if(J!==0)return J;let Q=$.writeVarInt(Z.lenBody);if(Q!==0)return Q;if(Z.lenBody>0&&Z.offBody!==void 0){let V=$.writeVarInt(Z.offBody);if(V!==0)return V}return 0},decode($){let[Z,J]=$.readBytes(T0);if(J!==0)return G(J);let[Q,V]=$.readVarBytes();if(V!==0)return G(V);let[Y,X]=$.readVarInt();if(X!==0)return G(X);let W;if(Y>0){let[z,K]=$.readVarInt();if(K!==0)return G(K);W=z}return R({kdm:Z,headCph:Q,lenBody:Y,offBody:W})}};async function LJ($,Z,J,Q,V){let Y=await V.deriveIdentity($,Z),X=new S,W=new S,z=0,K=0;for(let P of J){let C=new S,T=C.writeStruct(X0,P.head);if(T!==0)return G(T);let M=C.result(),A=await Y.kdmFor(M),x=V.deriveCipher(A,"encrypt"),m=await x.encrypt(M),E=P.body?await x.encrypt(P.body):new Uint8Array(0),k=P.head.len>0&&P.head.hsh!==void 0?E.length:0,b={kdm:A,headCph:m,lenBody:k,offBody:k>0?K:void 0},w=X.writeStruct(UZ,b);if(w!==0)return G(w);if(P.body)W.writeBytes(E),K+=E.length;z++}let F=W.result(),N=X.result(),U=await Q.blake3(N),O=await Y.sign(U),q={lbl:$,idx:Z,num:z,hsh:U,sig:O},I=new S;I.writeStruct(RZ,{head:q,indexEnc:N,bodyEnc:F});let H=I.result();return R(H)}async function xJ($,Z,J){let[Q,V]=RZ.decode(new g($));if(V!==0)return G(V);let{head:Y,indexEnc:X,bodyEnc:W}=Q,z=await J.deriveIdentity(Y.lbl,Y.idx);if(!await Z.checkSigEd25519(Y.sig,Y.hsh,z.publicKey))return G(3);let F=await Z.blake3(X);if(!V0(F,Y.hsh))return G(19);let N=new g(X),U=[];for(let q=0;q<Y.num;q++){let[I,H]=N.readStruct(UZ);if(H!==0)return G(H);U.push(I)}if(U.length!==Y.num)return G(14);let O=[];for(let q of U){let I=J.deriveCipher(q.kdm,"decrypt"),H;try{H=await I.decrypt(q.headCph)}catch{return G(20)}let[P,C]=X0.decode(new g(H));if(C!==0)return G(C);let T;if(q.lenBody>0&&q.offBody!==void 0){if(P.hsh===void 0)return G(14);let M=W.slice(q.offBody,q.offBody+q.lenBody);try{T=await I.decrypt(M)}catch{return G(20)}let A=await Z.blake3(T);if(!V0(A,P.hsh))return G(19)}O.push({head:P,body:T})}return R(O)}async function fJ({now:$,bod:Z,crypto:J}){let Q=await J.genRandomBytes(8),V=new S,Y=V.writeStruct(Q0,{id:Q,ts:$});if(Y!==0)return G(Y);let X=V.result();return x$({now:$,eid:X,ctr:0,bod:Z,crypto:J})}async function x$({now:$,eid:Z,ctr:J,bod:Q,crypto:V}){let Y=new g(Z),[X,W]=Q0.decode(Y);if(W!==0)return G(W);let z=$.getTime()-X.ts.getTime(),K,F=Q?.length??0;if(Q&&F>0)K=await V.blake3(Q);return R({eid:Z,off:z,ctr:J,len:F,hsh:K})}function JV($,Z){let J=$.length<Z.length?$.length:Z.length;for(let Q=0;Q<J;Q++)if($[Q]!==Z[Q])return $[Q]-Z[Q];return $.length-Z.length}async function z$($,Z){let J=Array.from($);J.sort(JV);let Q=0;for(let X of J)Q+=X.length;let V=new Uint8Array(Q),Y=0;for(let X of J)V.set(X,Y),Y+=X.length;return Z.blake3(V)}function QV($){let Z=new S,J=Z.writeVarBytes($.eid);if(J!==0)return G(J);let Q=Z.writeDate($.updatedAt);if(Q!==0)return G(Q);let V=Z.writeVarInt($.ctr);if(V!==0)return G(V);return R(Z.result())}async function f$($,Z){let J=[];for(let Q of $){let[V,Y]=QV(Q);if(Y!==0||!V)return G(Y);J.push(V)}return R(await z$(J,Z))}var aW=Symbol("MasterSeed"),sW=Symbol("SealedMasterKey"),R0=32,kJ=24+R0+16;function t($){if($.byteLength!==R0)return G(10);return R($)}function j0($){if($.byteLength!==kJ)return G(10);return R($)}var eW=Symbol("EntityID");function BJ($){return"type"in $}var $G=Symbol("DerivationSeed"),ZG=Symbol("PublicKey"),JG=Symbol("PrivateKey"),QG=Symbol("HostSpecificKeyPair"),VG=Symbol("Hash");function VV($){if(!$)return!1;if(typeof $!=="object")return!1;if("body"in $===!1)return!1;if("type"in $===!1)return!1;return!0}function YV($){if(!$.bod||$.bod.length===0){let Q={off:$.off,ctr:$.ctr,eid:$.eid};return R(Q)}let Z=QZ($.bod);if(VV(Z)===!1)return console.warn("msg body invalid",Z),G(14);let J={off:$.off,ctr:$.ctr,eid:$.eid,gid:Z.gid,pid:Z.pid,tags:Z.tags,type:Z.type,body:Z.body};return R(J)}class k${applier;emitter=new X$;clearer;onDirtyEids;cacheDriven;peerIngest;constructor($,Z,J,Q){this.applier=$;this.clearer=Z,this.onDirtyEids=J,this.cacheDriven=Q?.cacheDriven??!1,this.peerIngest=Q?.peerIngest}apply=async($)=>{let Z=[],J=[];for(let W of $){let[z,K]=YV(W);if(J.push(K),K!==0)continue;Z.push(z)}let{stats:Q,types:V,eids:Y}=await this.applier(Z),X=[];for(let W=0;W<$.length;W++){let z=J[W],K=Q[W];if(z!==0){X.push(z);continue}if(K!==0){X.push(K);continue}X.push(0)}if(!this.cacheDriven)for(let W of V)this.emitter.emit(W,null);if(Y.length>0)this.onDirtyEids?.(Y);return X};clear=async()=>{let $=await this.clearer();if($!==0)return $;return this.emitter.emitAll(null),$};notify=($)=>{for(let Z of $)this.emitter.emit(Z,null)};refresh=async($)=>{if(this.peerIngest){await this.peerIngest($);return}};on=($,Z)=>{this.emitter.addEventListener($,Z)};off=($,Z)=>{this.emitter.removeEventListener($,Z)}}var n="entities",B$="entity_type_created_at",qZ="entity_type_updated_at",IZ="entity_type_group_id",HZ="entity_type_parent_id",n0="entity_tags",EJ="db",mJ=13;function XV($){return"typ"in $}function WV($){let Z={bod:$.body,crd:$.createdAt,...$.ctr!==0?{ctr:$.ctr}:{},eid:f($.eid),gid:$.gid,pid:$.pid?f($.pid):void 0,tgs:$.tags,typ:$.type,upd:$.updatedAt};if(Z.gid===void 0)delete Z.gid;if(Z.pid===void 0)delete Z.pid;if(Z.tgs===void 0)delete Z.tgs;if(Z.ctr===void 0)delete Z.ctr;return Z}function GV($){if(!i($))return{eid:f($.eid),upd:$.updatedAt,...$.ctr!==0?{ctr:$.ctr}:{}};return WV($)}function c0($){return{body:$.bod,createdAt:$.crd,updatedAt:$.upd,ctr:$.ctr??0,type:$.typ,eid:F0($.eid),gid:$.gid,pid:$.pid?F0($.pid):void 0,...$.tgs!==void 0?{tags:$.tgs}:{}}}function OZ($){if(XV($))return c0($);return{eid:F0($.eid),updatedAt:$.upd,ctr:$.ctr??0}}class gJ{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=KV().then(($)=>{return $.onversionchange=()=>{if($.close(),this.db===$)this.db=void 0},this.db=$,this.opening=void 0,$},($)=>{throw this.opening=void 0,$}),this.opening}apply=async($)=>{let Z=new Set,J=[],Q;try{Q=await this.ensureDb()}catch{return{stats:$.map(()=>16),types:Z,eids:J}}let V=Q.transaction(n,"readwrite"),Y=V.objectStore(n);return new Promise((X)=>{let W=Array($.length).fill(0);if($.length<1){X({stats:[],types:Z,eids:J});return}V.oncomplete=()=>{X({stats:W,types:Z,eids:J})},V.onerror=()=>{for(let K=0;K<W.length;K++)if(W[K]===void 0)W[K]=18;X({stats:W,types:Z,eids:J})};let z=new Map;for(let K=0;K<$.length;K++){let F=$[K],N=f(F.eid),U={op:F,index:K},O=z.get(N);if(O)O.push(U);else z.set(N,[U])}for(let[K,F]of z){if(F.length<1)continue;let N=Y.get(K);N.onsuccess=()=>{let U=N.result,O=U?OZ(U):void 0,q=!1;for(let{op:I,index:H}of F){let[P,C]=d0(O,I);if(C!==0){W[H]=C;continue}if(P===void 0){W[H]=12;continue}q=!0;for(let T of r0(O,P))Z.add(T);O=P}if(q)J.push(F[0].op.eid);if(O){let I=Y.put(GV(O));I.onerror=(H)=>{H.preventDefault();for(let{index:P}of F)W[P]=18}}},N.onerror=()=>{for(let{index:U}of F)W[U]=18}}})};async clear(){let $;try{$=await this.ensureDb()}catch{return 16}let Z=$.transaction(n,"readwrite"),J=Z.objectStore(n);return new Promise((Q)=>{Z.oncomplete=()=>Q(0),Z.onerror=()=>Q(18),J.clear()})}async getRow($){let Z;try{Z=await this.ensureDb()}catch{return G(16)}let J=f($),V=Z.transaction(n,"readonly").objectStore(n);return new Promise((Y)=>{let X=V.get(J);X.onsuccess=()=>{let W=X.result;if(!W)Y(R(void 0));else Y(R(OZ(W)))},X.onerror=()=>Y(G(18))})}async getEnt($){let[Z,J]=await this.getRow($);if(J!==0)return G(J);if(Z===void 0||!i(Z))return R(void 0);return R(Z)}async getAllOfTypeUpdatedBetween($,Z,J){let Q;try{Q=await this.ensureDb()}catch{return G(16)}let Y=Q.transaction(n,"readonly").objectStore(n).index(qZ);return new Promise((X)=>{let W=Y.getAll(IDBKeyRange.bound([$,Z],[$,J]));W.onsuccess=()=>{let z=W.result;X(R(z.map(c0)))},W.onerror=()=>X(G(18))})}async getGroupMembers($,Z){let J;try{J=await this.ensureDb()}catch{return G(16)}let V=J.transaction(n,"readonly").objectStore(n).index(IZ);return new Promise((Y)=>{let X=V.getAll(IDBKeyRange.only([$,Z]));X.onsuccess=()=>{let W=X.result;Y(R(W.map(c0)))},X.onerror=()=>Y(G(18))})}async getAllOfType($){let Z;try{Z=await this.ensureDb()}catch{return G(16)}let Q=Z.transaction(n,"readonly").objectStore(n).index(B$);return new Promise((V)=>{let Y=Q.getAll(IDBKeyRange.bound([$],[$,[]]));Y.onsuccess=()=>{let X=Y.result;V(R(X.map(c0)))},Y.onerror=()=>V(G(18))})}async getByTag($,Z){let J;try{J=await this.ensureDb()}catch{return G(16)}let V=J.transaction(n,"readonly").objectStore(n).index(n0);return new Promise((Y)=>{let X=V.getAll(IDBKeyRange.only(Z));X.onsuccess=()=>{let z=X.result.filter((K)=>K.typ===$).map(c0);Y(R(z))},X.onerror=()=>Y(G(18))})}async getAllEntities($){if("pid"in $){let Z;try{Z=await this.ensureDb()}catch{return G(16)}let J=f($.pid),V=Z.transaction(n,"readonly").objectStore(n).index(HZ);return new Promise((Y)=>{let X=V.getAll(IDBKeyRange.only([$.type,J]));X.onsuccess=()=>{let z=X.result.map(c0);Y(R(z))},X.onerror=()=>Y(G(18))})}else if("gid"in $)return await this.getGroupMembers($.type,$.gid);else if("tag"in $)return await this.getByTag($.type,$.tag);else if("updatedBetween"in $)return await this.getAllOfTypeUpdatedBetween($.type,$.updatedBetween.start,$.updatedBetween.end);return await this.getAllOfType($.type)}async getEntities($){let[Z,J]=await this.getAllEntities($);if(J!==0)return G(J);return R(Z)}async countEntities({type:$}){let Z;try{Z=await this.ensureDb()}catch{return G(16)}let Q=Z.transaction(n,"readonly").objectStore(n).index(B$);return new Promise((V)=>{let Y=IDBKeyRange.bound([$],[$,[]]),X=Q.count(Y);X.onsuccess=()=>V(R(X.result)),X.onerror=()=>V(G(18))})}async checksum($){let Z;try{Z=await this.ensureDb()}catch{return G(16)}let Q=Z.transaction(n,"readonly").objectStore(n),V=[];return new Promise((Y)=>{let X=Q.openCursor();X.onsuccess=()=>{let W=X.result;if(W){let z=W.value;V.push(E$(OZ(z))),W.continue()}else f$(V,$).then(Y)},X.onerror=()=>Y(G(18))})}}function zV($,Z){if(!$.objectStoreNames.contains(n))$.createObjectStore(n,{keyPath:"eid",autoIncrement:!1});let J=Z.objectStore(n);if(!J.indexNames.contains(B$))J.createIndex(B$,["typ","crd"],{unique:!1});if(!J.indexNames.contains(qZ))J.createIndex(qZ,["typ","upd"],{unique:!1});if(!J.indexNames.contains(IZ))J.createIndex(IZ,["typ","gid"],{unique:!1});if(!J.indexNames.contains(HZ))J.createIndex(HZ,["typ","pid"],{unique:!1});if(J.indexNames.contains(n0)){if(J.index(n0).keyPath!=="tgs")J.deleteIndex(n0)}if(!J.indexNames.contains(n0))J.createIndex(n0,"tgs",{unique:!1,multiEntry:!0})}function KV(){return new Promise(($,Z)=>{let J=indexedDB.open(EJ,mJ);J.onupgradeneeded=()=>{let{result:Q,transaction:V}=J;if(!V){Z(Error("Transaction is null during EntDB upgrade"));return}try{zV(Q,V)}catch(Y){Z(Y instanceof Error?Y:Error(String(Y)))}},J.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${EJ} → v${mJ}); waiting for other connections to close`)},J.onsuccess=()=>$(J.result),J.onerror=()=>Z(J.error??Error("EntDB IndexedDB open failed"))})}async function SJ(){let $=new gJ;return await $.init(),$}class MZ{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeGid=new Map;byTypeTag=new Map;constructor($=[],Z){this.useIndex=Z?.indexes!==!1;for(let J of $)this.put(J)}put($){let Z=f($.eid),J=this.ents.get(Z);if(J!==void 0&&i(J))this.unindex(Z,J);if(this.ents.set(Z,$),i($))this.index(Z,$)}del($){let Z=this.ents.get($);if(Z===void 0)return;if(i(Z))this.unindex($,Z);this.ents.delete($)}index($,Z){if(!this.useIndex)return;let J=this.byType.get(Z.type);if(!J)J=new Map,this.byType.set(Z.type,J);if(J.set($,Z),Z.pid){let Q=f(Z.pid),V=this.byTypePid.get(Z.type);if(!V)V=new Map,this.byTypePid.set(Z.type,V);let Y=V.get(Q);if(!Y)Y=new Map,V.set(Q,Y);Y.set($,Z)}if(typeof Z.gid==="string"){let Q=this.byTypeGid.get(Z.type);if(!Q)Q=new Map,this.byTypeGid.set(Z.type,Q);let V=Q.get(Z.gid);if(!V)V=new Map,Q.set(Z.gid,V);V.set($,Z)}if(Z.tags){let Q=this.byTypeTag.get(Z.type);if(!Q)Q=new Map,this.byTypeTag.set(Z.type,Q);for(let V of Z.tags){let Y=Q.get(V);if(!Y)Y=new Map,Q.set(V,Y);Y.set($,Z)}}}unindex($,Z){if(!this.useIndex)return;let J=this.byType.get(Z.type);if(J){if(J.delete($),J.size===0)this.byType.delete(Z.type)}if(Z.pid){let Q=f(Z.pid),V=this.byTypePid.get(Z.type),Y=V?.get(Q);if(Y){if(Y.delete($),Y.size===0)V?.delete(Q)}if(V&&V.size===0)this.byTypePid.delete(Z.type)}if(typeof Z.gid==="string"){let Q=this.byTypeGid.get(Z.type),V=Q?.get(Z.gid);if(V){if(V.delete($),V.size===0)Q?.delete(Z.gid)}if(Q&&Q.size===0)this.byTypeGid.delete(Z.type)}if(Z.tags){let Q=this.byTypeTag.get(Z.type);if(Q){for(let V of Z.tags){let Y=Q.get(V);if(Y){if(Y.delete($),Y.size===0)Q.delete(V)}}if(Q.size===0)this.byTypeTag.delete(Z.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeGid.clear(),this.byTypeTag.clear()}bucketList($){if(!$||$.size===0)return[];let Z=[];for(let J of $.values())Z.push(J);return Z}async apply($){let Z=new Set,J=[],Q=[];for(let V of $){let Y=f(V.eid),X=this.ents.get(Y),[W,z]=d0(X,V);if(z!==0){Q.push(z);continue}if(W===void 0){Q.push(12);continue}for(let K of r0(X,W))Z.add(K);this.put(W),J.push(V.eid),Q.push(0)}return{stats:Q,types:Z,eids:J}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow($){let Z=f($),J=this.ents.get(Z);return R(J)}async getEnt($){let[Z,J]=await this.getRow($);if(J!==0)return G(J);if(Z===void 0||!i(Z))return R(void 0);return R(Z)}async getAllEntities({type:$,gid:Z,pid:J,tag:Q,updatedBetween:V}){if(this.useIndex){if(J!==void 0){let X=f(J);return R(this.bucketList(this.byTypePid.get($)?.get(X)))}if(Z!==void 0)return R(this.bucketList(this.byTypeGid.get($)?.get(Z)));if(Q!==void 0)return R(this.bucketList(this.byTypeTag.get($)?.get(Q)));if(V!==void 0){let X=[],W=this.byType.get($);if(W){for(let z of W.values())if(z.updatedAt>=V.start&&z.updatedAt<=V.end)X.push(z)}return R(X)}return R(this.bucketList(this.byType.get($)))}let Y=[];if(J!==void 0){for(let X of this.ents.values())if(i(X)&&X.type===$&&X.pid&&V0(X.pid,J))Y.push(X)}else if(Z!==void 0){for(let X of this.ents.values())if(i(X)&&X.type===$&&(typeof X.gid==="string"&&X.gid===Z))Y.push(X)}else if(Q!==void 0){for(let X of this.ents.values())if(i(X)&&X.type===$&&X.tags&&X.tags.includes(Q))Y.push(X)}else if(V!==void 0){for(let X of this.ents.values())if(i(X)&&X.type===$&&X.updatedAt>=V.start&&X.updatedAt<=V.end)Y.push(X)}else for(let X of this.ents.values())if(i(X)&&X.type===$)Y.push(X);return R(Y)}async getEntities($){let[Z,J]=await this.getAllEntities($);if(J!==0)return G(J);return R(Z)}async countEntities({type:$}){if(this.useIndex)return R(this.byType.get($)?.size??0);let Z=0;for(let J of this.ents.values())if(i(J)&&J.type===$)Z+=1;return R(Z)}async checksum($){let Z=[];for(let J of this.ents.values())Z.push(E$(J));return f$(Z,$)}}async function vJ($){let Z=await SJ();if($?.cache===!1)return Z;return new CZ(Z,void 0,{indexes:$?.indexes})}class CZ{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();constructor($,Z,J){if(this.durable=$,this.mem=new MZ(Z??[],{indexes:J?.indexes}),Z)for(let Q of Z)this.warmed.add(Q.type)}subscribe($){return this.listeners.add($),()=>{this.listeners.delete($)}}emit($){if($.size<1)return;for(let Z of this.listeners)Z($)}run($){let Z=this.chain.then($,$);return this.chain=Z.then(()=>{return},()=>{return}),Z}apply($){return this.run(async()=>{await this.pullEids($.map((Y)=>Y.eid));let Z=qV(this.mem,$);this.emit(Z.types);let J=await this.durable.apply($),{changed:Q,status:V}=await this.pullEids($.map((Y)=>Y.eid));if(this.emit(Q),V!==0)return{stats:$.map(()=>V),types:J.types,eids:J.eids};return J})}clear(){return this.run(async()=>{let $=await this.durable.clear();if($!==0)return $;let Z=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable($){return this.run(async()=>{let{changed:Z,status:J}=await this.pullEids($);return this.emit(Z),J})}async pullEids($){let Z=new Set,J=new Set;for(let Q of $){let V=f(Q);if(J.has(V))continue;J.add(V);let Y=this.mem.ents.get(V),[X,W]=await this.durable.getRow(Q);if(W!==0)return{changed:Z,status:W};if(X){if(this.mem.put(X),!Y||!FV(Y,X)){if(i(X))Z.add(X.type);if(Y!==void 0&&i(Y))Z.add(Y.type)}}else if(Y!==void 0){if(this.mem.del(V),i(Y))Z.add(Y.type)}}return{changed:Z,status:0}}async warmType($){if(this.warmed.has($))return 0;let[Z,J]=await this.durable.getEntities({type:$});if(J!==0)return J;if(Z)for(let Q of Z){let V=f(Q.eid),Y=this.mem.ents.get(V);if(!Y||OV(Q,Y))this.mem.put(Q)}return this.warmed.add($),0}async getRow($){let Z=f($);if(this.mem.ents.has(Z))return this.mem.getRow($);return this.run(async()=>{if(this.mem.ents.has(Z))return this.mem.getRow($);let[J,Q]=await this.durable.getRow($);if(Q!==0)return G(Q);if(J)this.mem.put(J);return R(J)})}async getEnt($){let[Z,J]=await this.getRow($);if(J!==0)return G(J);if(Z===void 0||!i(Z))return R(void 0);return R(Z)}async getEntities($){if(!this.warmed.has($.type)){let Z=await this.run(()=>this.warmType($.type));if(Z!==0)return G(Z)}return this.mem.getEntities($)}async countEntities({type:$}){if(!this.warmed.has($)){let Z=await this.run(()=>this.warmType($));if(Z!==0)return G(Z)}return this.mem.countEntities({type:$})}async checksum($){return this.durable.checksum($)}}function FV($,Z){if(i($)!==i(Z))return!1;if($.ctr!==Z.ctr)return!1;if($.updatedAt.getTime()!==Z.updatedAt.getTime())return!1;if(!V0($.eid,Z.eid))return!1;if(!i($)||!i(Z))return!0;if($.createdAt.getTime()!==Z.createdAt.getTime())return!1;if($.type!==Z.type)return!1;if($.gid!==Z.gid)return!1;if(!RV($.pid,Z.pid))return!1;if(!NV($.tags,Z.tags))return!1;return UV($.body,Z.body)}function NV($,Z){if($===Z)return!0;if($===void 0||Z===void 0)return!1;if($.length!==Z.length)return!1;for(let J=0;J<$.length;J++)if($[J]!==Z[J])return!1;return!0}function RV($,Z){if($===void 0&&Z===void 0)return!0;if($===void 0||Z===void 0)return!1;return V0($,Z)}function UV($,Z){if(Object.is($,Z))return!0;if($ instanceof Uint8Array&&Z instanceof Uint8Array)return V0($,Z);if($ instanceof Date&&Z instanceof Date)return $.getTime()===Z.getTime();try{return V0(_0($),_0(Z))}catch{return!1}}function OV($,Z){let J=$.updatedAt.getTime(),Q=Z.updatedAt.getTime();if(J!==Q)return J>Q;return $.ctr>Z.ctr}function qV($,Z){let J=new Set,Q=[];for(let V of Z){let Y=f(V.eid),X=$.ents.get(Y),[W,z]=d0(X,V);if(z!==0){Q.push(z);continue}if(W===void 0){Q.push(12);continue}for(let K of r0(X,W))J.add(K);$.put(W),Q.push(0)}return{stats:Q,types:J}}function i($){return"type"in $}function IV($){if(!Array.isArray($)||$.length===0)return;let Z=new Set,J=[];for(let Q of $){if(typeof Q!=="string"||Q.length===0)continue;if(Z.has(Q))continue;Z.add(Q),J.push(Q)}return J.length>0?J:void 0}function E$($){return{eid:$.eid,ctr:$.ctr,updatedAt:$.updatedAt}}function bJ($){let Z=new g($.eid),[J,Q]=Z.readStruct(Q0);if(Q!==0)return G(Q);return R({eid:$.eid,ctr:$.ctr,updatedAt:new Date(J.ts.getTime()+$.off)})}function d0($,Z){let J=new g(Z.eid),[Q,V]=J.readStruct(Q0);if(V!==0)return G(V);let Y=new Date(Q.ts.getTime()+Z.off);if($!==void 0&&Y<=$.updatedAt)return G(15);if(BJ(Z)){let X=IV(Z.tags);return R({eid:Z.eid,gid:Z.gid,pid:Z.pid,...X!==void 0?{tags:X}:{},type:Z.type,createdAt:Q.ts,updatedAt:Y,ctr:Z.ctr,body:Z.body})}return R({eid:Z.eid,updatedAt:Y,ctr:Z.ctr})}function r0($,Z){let J=new Set;if($!==void 0&&i($))J.add($.type);if(i(Z))J.add(Z.type);return[...J]}class m${inflight=null;again=!1;run($){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain($),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain($){try{this.again=!1;let Z=await $();while(this.again)this.again=!1,Z=await $();return Z}finally{this.inflight=null}}}var yJ=100;class PZ{timer=null;delayMs;work;tail=new m$;constructor($,Z){this.delayMs=$<0?0:$,this.work=Z}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 iJ($){let Z=new g($.eid),[J,Q]=Q0.decode(Z);if(Q!==0)return;return J.ts.getTime()+$.off}function HV($,Z){let J=iJ($),Q=iJ(Z);if(J===void 0&&Q===void 0)return 0;if(J===void 0)return 1;if(Q===void 0)return-1;if(Q!==J)return Q-J;return Z.ctr-$.ctr}function o0($,Z){return $.slice().sort((J,Q)=>HV(Z(J),Z(Q)))}var wZ={phase:"idle"},K$=50;function TZ($,Z,J){if($<=0||Z<=0)return!1;if($===1||$===Z)return!0;return $%J===0}function hJ($,Z){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob($,Z);return}let J=URL.createObjectURL($),Q=document.createElement("a");Q.href=J,Q.download=Z,document.body.appendChild(Q),Q.click(),document.body.removeChild(Q),URL.revokeObjectURL(J)}function uJ($,Z,J){let Q=[],V=[],Y=0;for(let X of $){let W=Z(X);if(V.length>0&&Y+W>J)Q.push(V),V=[],Y=0;if(V.push(X),Y+=W,Y>=J)Q.push(V),V=[],Y=0}if(V.length>0)Q.push(V);return Q}async function DZ($,Z,J){let Q=$.length;if(Q<1)return[];let V=Array(Q),Y=0,X=Math.min(Math.max(1,Z),Q),W=async()=>{while(!0){let K=Y;if(Y+=1,K>=Q)return;V[K]=await J($[K],K)}},z=[];for(let K=0;K<X;K++)z.push(W());return await Promise.all(z),V}async function g$($,Z,J,Q){let V=new g($.headCph),[Y,X]=V.readStruct(A$);if(X!==0)return G(X);let{sig:W,kdm:z,headCph:K}=Y;if(!await Q.checkSigEd25519(W,K,Z))return G(3);let N=J.deriveCipher(z,"decrypt"),U;try{U=await N.decrypt(K)}catch{return G(20)}return R({kdm:z,headEnc:U})}var s0="f",S$="t",a0="e";function MV($){if($===!0||$===S$)return S$;if($===a0)return a0;return s0}function lJ($){return $!==0&&$!==15&&$!==18&&$!==17}function jZ($,Z,J){if($.apld=Z,Z===a0&&J!==void 0)$.err=J;else delete $.err}async function v$($,Z,J,Q){let V=Q?.body!==!1,Y=MV(Z.apld),X=Z.body,W=X?.length??0,z;if(V&&X&&W>0)z=await J.blake3(X);let K={eid:Z.eid,off:Z.off??0,ctr:Z.ctr??0,len:W,hsh:z},F={hash:$,head:K,apld:Y};if(V&&X!==void 0)F.body=X;if(Y===a0&&Z.err!==void 0)F.err=Z.err;return F}var AZ=1048576,_Z=1048576,nJ=64;function CV($){return $.sig.length+$.kdm.length+$.headCph.length+$.bodyCph.length}async function PV($,Z,J,Q,V){if(Q.length<1)return 0;let[Y,X]=await $.push(Q);if(X!==0)return X;if(!Y)return 27;for(let z of Y){if(z.status!==0){console.error("push err",z);continue}let K=V[z.idx];if(!K){console.error("no hash",z);continue}await Z.uploads.deq(J,[K])}let W=await Z.hosts.get(J);if(W){let z=W.lastSeq,K=z,F=[];for(let N of Y)if(N.status===0)F.push(N.seq);F.sort((N,U)=>N-U);for(let N of F)if(N===z+1)z=N;if(z>K)await Z.hosts.touch(J,z)}return 0}async function pJ($,Z){if(Z.length<1)return R([]);let J=new Map,Q=[];for(let W of Z)J.set(W.seq,W),Q.push(W.seq);let[V,Y]=await $.pull(Q);if(Y!==0)return G(Y);if(!V)return G(27);let X=[];for(let{seq:W,bodyCph:z}of V){let K=J.get(W);if(!K)continue;X.push({dl:K,bodyCph:z})}return R(X)}async function wV($,Z,J,Q){if(Q.length<1)return R({parts:[],hashes:[]});let V=[],Y=[],X=[],W=new Map;for(let{dl:K,bodyCph:F}of Q){let{head:N,kdm:U,seq:O,host:q}=K,[I,H]=await cJ(K,J);if(H!==0||!I){let k=W.get(q)??[];k.push(O),W.set(q,k);continue}let{headEnc:P,headEncHash:C}=I,T=Z.deriveCipher(U,"decrypt"),[M,A]=await YZ(P,F,T,J,C);if(A!==0||!M){let k=W.get(q)??[];k.push(O),W.set(q,k);continue}let x={head:N,body:M.bod},m=M.headHash;X.push({key:m,data:oJ(x)}),V.push(x),Y.push(m);let E=W.get(q)??[];E.push(O),W.set(q,E)}let z=await $.messages.add(X);for(let[K,F]of W)await $.downloads.deq(K,F);for(let K=0;K<z.length;K++){let F=z[K];if(F!==0&&F!==15)console.error("ERR storing",j[F],"for message",K)}return R({parts:V,hashes:Y})}async function cJ($,Z){let J=$.headEnc;if(!J){let V=new S,Y=V.writeStruct(X0,$.head);if(Y!==0)return G(Y);J=V.result()}if($.headEncHash)return R({headEnc:J,headEncHash:$.headEncHash});let Q=await Z.blake3(J);return R({headEnc:J,headEncHash:Q})}async function dJ($,Z,J){let Q=new Set;for(let X of Z)Q.add(f(X));if(Q.size<1)return;let V=Array.from(await $.downloads.list());if(V.length<1)return;let Y=new Map;for(let X of V){let W;if(X.headEncHash)W=f(X.headEncHash);else{let[K,F]=await cJ(X,J);if(F!==0||!K)continue;W=f(K.headEncHash)}if(!Q.has(W))continue;let z=Y.get(X.host)??[];z.push(X.seq),Y.set(X.host,z)}for(let[X,W]of Y)await $.downloads.deq(X,W)}async function LZ({conn:$,store:Z,enclave:J,host:Q,crypto:V,onProgress:Y,peekProgressEvery:X,peekConcurrency:W}){let z=await $.identity(),K=[],[F,N]=await $.peek(Q.lastSeq);if(N!==0)return N;let U=F.length,O=X??K$,q=W??nJ;if(Y&&U>0)Y({phase:"peek",host:Q.label,done:0,total:U});let I=0,H=await DZ(F,q,async(C)=>{let[T,M]=await g$(C,z.publicKey,J,V),A;if(M!==0||!T)A={ok:!1,seq:C.seq,stat:M};else{let x=await V.blake3(T.headEnc);A={ok:!0,seq:C.seq,kdm:T.kdm,headEnc:T.headEnc,headEncHash:x}}if(I+=1,Y&&TZ(I,U,O))Y({phase:"peek",host:Q.label,done:I,total:U});return A}),P=new Set;for(let C of H){if(!C.ok){console.error("peek: decrypting item head",C.stat);continue}let T=f(C.headEncHash);if(await Z.messages.has(C.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await Z.uploads.deq(Q.label,[C.headEncHash]),await Z.downloads.deq(Q.label,[C.seq]);continue}if(P.has(T)){await Z.downloads.deq(Q.label,[C.seq]);continue}let A=new g(C.headEnc),[x,m]=A.readStruct(X0);if(m!==0){console.error("peek: reading item head",m);continue}P.add(T),K.push({kdm:C.kdm,head:x,seq:C.seq,host:Q.label,headEnc:C.headEnc,headEncHash:C.headEncHash})}if(await Z.downloads.enq(K),F.length>0){let C=Math.max(...F.map((T)=>T.seq));await Z.hosts.recordStats(Q.label,{lastSeq:C})}if(Y)Y({phase:"peek",host:Q.label,done:U,total:U});return 0}async function rJ({conn:$,store:Z,host:J,maxPushBytes:Q,onProgress:V}){let Y=Q??AZ,X=await Z.uploads.list(J.label),W=X.length,z=0;if(V&&W>0)V({phase:"push",host:J.label,done:0,total:W});let K=[],F=[],N=0,U=async()=>{if(K.length<1)return 0;let O=K.length,q=await PV($,Z,J.label,K,F);if(K=[],F=[],N=0,q===0){if(z+=O,V)V({phase:"push",host:J.label,done:z,total:W})}return q};for(let O of X){let q=await Z.messages.get(O);if(!q){z+=1;continue}let I={...q.head,bod:q.body},[H,P]=await $.seal(I);if(P!==0)return P;if(!H)return 12;let C=CV(H);if(K.length>0&&N+C>Y){let T=await U();if(T!==0)return T}if(K.push(H),F.push(O),N+=C,N>=Y){let T=await U();if(T!==0)return T}}return U()}async function xZ({conn:$,store:Z,enclave:J,host:Q,crypto:V,maxPullBytes:Y,onProgress:X},W){let z=Y??_Z,K=await Z.downloads.list(),F=Array.from(K).filter((H)=>H.host===Q.label);if(F.length<1)return 15;let N=o0(F,(H)=>H.head),U=uJ(N,(H)=>H.head.len,z),O=N.length,q=0;if(X)X({phase:"pull",host:Q.label,done:0,total:O});let I=pJ($,U[0]);for(let H=0;H<U.length;H++){let[P,C]=await I;if(C!==0||!P)return C;if(q+=U[H].length,X)X({phase:"pull",host:Q.label,done:q,total:O});let T=U[H+1];if(T)I=pJ($,T);if(X)X({phase:"open",host:Q.label,done:q,total:O});let M=o0(P,(x)=>x.dl.head),[,A]=await wV(Z,J,V,M);if(A!==0)return A;if(W){if(X)X({phase:"exec",host:Q.label,done:q,total:O});await W()}}return 0}function oJ({head:$,body:Z}){let J={eid:$.eid,body:Z,apld:s0};if($.off!==0)J.off=$.off;if($.ctr!==0)J.ctr=$.ctr;return J}async function aJ($,{conn:Z,store:J,enclave:Q,host:V,crypto:Y,onProgress:X},W){let z=V.label,K=await Z.identity(),F=new g($),[N,U]=F.readStructs(j$);if(U!==0){console.error("Failed decoding notif",j[U]);return}let O=!1,I=(await J.hosts.get(z))?.lastSeq,H=[],P=!1;for(let M of N){let[A,x]=await g$({seq:M.seq,headCph:M.headCph},K.publicKey,Q,Y);if(x!==0){console.error("Failed decrypting notif",j[x]);continue}let m=await Y.blake3(A.headEnc);if(await J.messages.has(m))continue;let E=new g(A.headEnc),[k,b]=E.readStruct(X0);if(b!==0){console.error("Failed to parse head",j[b]);continue}if(!M.bodyCph&&k.len>0)P=!0,await J.downloads.enq([{seq:M.seq,host:z,kdm:A.kdm,head:k,headEnc:A.headEnc,headEncHash:m}]);else H.push({...A,head:k,bodyCph:M.bodyCph,headEncHash:m});if(I===void 0||M.seq!==I+1)console.log("out of seq",M.seq,I),O=!0;else I=M.seq}if(I!==void 0)await J.hosts.touch(V.label,I);let C=[];for(let M of H){let A=Q.deriveCipher(M.kdm,"decrypt"),[x,m]=await YZ(M.headEnc,M.bodyCph,A,Y);if(m!==0){console.error("Failed to open body",j[m]);continue}C.push({key:M.headEncHash,data:oJ({head:M.head,body:x.bod})})}let T=await J.messages.add(C);for(let M=0;M<T.length;M++){let A=T[M];if(A!==0&&A!==15)console.error("ERR storing",j[A],"for message",M)}if(X&&C.length>0)X({phase:"open",host:V.label,done:C.length,total:C.length});if(O||P||C.length>0)W()}async function fZ($,Z={}){let J=Z.pull!==!1,Q=Z.push===!0,{conn:V,store:Y,enclave:X,host:W,crypto:z,onProgress:K,peekProgressEvery:F,peekConcurrency:N}=$,U=await V.identity(),[O,q]=await V.peek(0);if(q!==0)return G(q);let I=O.length,H=F??K$,P=N??nJ;if(K&&I>0)K({phase:"peek",host:W.label,done:0,total:I});let C=0,T=await DZ(O,P,async(L)=>{let[v,B]=await g$(L,U.publicKey,X,z),y;if(B!==0||!v)y={ok:!1,seq:L.seq,stat:B};else{let _=await z.blake3(v.headEnc);y={ok:!0,seq:L.seq,kdm:v.kdm,headEnc:v.headEnc,headEncHash:_}}if(C+=1,K&&TZ(C,I,H))K({phase:"peek",host:W.label,done:C,total:I});return y}),M=new Map;for(let L of T){if(!L.ok)continue;let v=f(L.headEncHash),B=M.get(v);if(B)B.count+=1;else M.set(v,{hash:L.headEncHash,count:1,sample:L})}let A=0,x=[];for(let L of M.values()){if(L.count>1)A+=L.count-1;x.push(L.hash)}let m=O.length,E=M.size,k=await z$(x,z),b=[],w=0;for(let L of M.values()){if(await Y.messages.has(L.hash)){await Y.uploads.deq(W.label,[L.hash]);continue}if(w+=1,!J)continue;let B=L.sample,y=new g(B.headEnc),[_,c]=y.readStruct(X0);if(c!==0){console.error("reconcile: reading msg header",c);continue}b.push({kdm:B.kdm,head:_,seq:B.seq,host:W.label,headEnc:B.headEnc,headEncHash:B.headEncHash})}if(b.length>0)await Y.downloads.enq(b);let h=0;if(Q){let L=await Y.messages.listKeys(),v=new Set(M.keys()),B=[];for(let y of L)if(!v.has(f(y)))h+=1,B.push(y);if(B.length>0)await Y.uploads.enq(W.label,B)}else{let L=await Y.messages.listKeys(),v=new Set(M.keys());for(let B of L)if(!v.has(f(B)))h+=1}let l=O.length>0?Math.max(...O.map((L)=>L.seq)):0;if(await Y.hosts.recordStats(W.label,{setLastSeq:l}),K)K({phase:"peek",host:W.label,done:I,total:I});return R({msgcheck:k,numBags:m,uniqueMsgs:E,numDupes:A,missingLocal:w,missingHost:h})}class kZ{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new m$;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=K$;lastProgress=wZ;scheduledSync;constructor($,Z,J,Q,V,Y=!0,X=AZ,W=_Z,z){this.clock=$;this.state=Z;this.store=J;this.transport=Q;this.crypto=V;this.forceSkewHandlingByDefault=Y;this.onScheduleSync=z;this.maxPushBytes=X,this.maxPullBytes=W,this.clientState=new L0(()=>this.getClientState()),this.xferState=new L0(()=>this.getXferState()),this.scheduledSync=new PZ(yJ,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(K){console.error("Debounced sync failed:",K)}})}emitProgress=($)=>{this.lastProgress=$,this.xferState.emit()};async setSeed($,Z){await this.store.seed.save($,Z),this.clientState.emit()}async getClientState(){let{store:$,connections:Z}=this,J=await $.seed.load(),Q=await $.hosts.list(),V=!1;for(let Y of Z.values())if(Y.isConnected()){V=!0;break}return{hasSeed:J!==void 0,hasHost:Array.from(Q).length>0,connected:V}}async getXferState(){let{uploads:$,downloads:Z}=this.store,J=await $.count();return{numDownloads:await Z.count(),numUploads:J,progress:this.lastProgress}}apply=($,Z)=>{return this.enqueueApplyJob(()=>this.doApply($,Z))};async doApply($,Z={enqueueUpload:!0,triggerUpload:!0}){let J=[],Q=[];for(let{head:Y,body:X}of $){let W=new S;W.writeStruct(X0,Y);let z=W.result(),K=await this.crypto.blake3(z),F={eid:Y.eid,body:X,apld:s0};if(Y.off!==0)F.off=Y.off;if(Y.ctr!==0)F.ctr=Y.ctr;J.push(K),Q.push({key:K,data:F})}await this.store.messages.add(Q),await dJ(this.store,J,this.crypto);let V=await this.doApplyHashes(J);if(Z.enqueueUpload){let Y=[];for(let X=0;X<J.length;X++){let W=V[X];if(W===0||W===15)Y.push(J[X])}if(Y.length>0){let X=await this.store.hosts.list();for(let W of X)await this.store.uploads.enq(W.label,Y);this.xferState.emit()}}if(Z.triggerUpload)this.scheduleSync();return V}enqueueApplyJob($){let Z=this.applyChain.then($,$);return this.applyChain=Z.then(()=>{return},()=>{return}),Z}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let $=await this.store.messages.list({apld:s0});if($.length<1)return[];let Z=o0($,(J)=>J.head);return this.applyStored(Z)}applyHashes=($)=>{return this.enqueueApplyJob(()=>this.doApplyHashes($))};async doApplyHashes($){let Z=[];for(let V of $){let Y=await this.store.messages.get(V);if(Y)Z.push(Y)}let J=await this.applyStored(Z),Q=new Map;for(let V=0;V<Z.length;V++)Q.set(f(Z[V].hash),J[V]??12);return $.map((V)=>Q.get(f(V))??13)}async applyStored($){if($.length<1)return[];let Z=$.map((Y)=>({...Y.head,bod:Y.body})),J=await this.state.apply(Z),Q=[],V=[];for(let Y=0;Y<$.length;Y++){let X=J[Y];if(X===0||X===15)Q.push($[Y].hash);else if(X!==void 0&&lJ(X))V.push({key:$[Y].hash,err:X})}if(Q.length>0)await this.store.messages.markApplied(Q);if(V.length>0)await this.store.messages.markFailed(V);return J}async insertRaw($){let{clock:Z,crypto:J}=this,[Q,V]=await fJ({now:Z.now(),bod:$,crypto:J});if(V!==0)return G(V);let X=(await this.apply([{head:Q,body:$}]))[0];if(X!==0&&X!==15)return G(X??12);return R(Q)}async makeUpdate($,Z){let{clock:J,crypto:Q}=this,V=J.now();if($.updatedAt.getTime()>V.getTime())return G(4);let Y=$.ctr+1,[X,W]=await x$({now:V,eid:$.eid,ctr:Y,bod:Z,crypto:Q});if(W!==0)return G(W);return R({head:X,body:Z})}async updateWithSkew($,Z,J){if(J===!1)return G(4);let{clock:Q,crypto:V}=this,Y=Q.now(),X=new g($.eid),[W,z]=X.readStruct(Q0);if(z!==0)return G(z);let K=$.updatedAt.getTime()-W.ts.getTime(),F={eid:$.eid,off:K+1,ctr:$.ctr+1,len:0},U=(await this.apply([{head:F,body:void 0}]))[0];if(U!==0&&U!==15)return G(U??12);if(Z===void 0)return R(F);let[O,q]=T$({id:W.id,ts:Y});if(q!==0)return G(q);let[I,H]=await x$({now:Y,eid:O,ctr:0,bod:Z,crypto:V});if(H!==0)return G(H);let C=(await this.apply([{head:I,body:Z}]))[0];if(C!==0&&C!==15)return G(C??12);return R(I)}async updateRaw($,Z,J=this.forceSkewHandlingByDefault){if($.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew($,Z,J);return this.enqueueApplyJob(async()=>{let[Q,V]=await this.makeUpdate($,Z);if(V!==0)return G(V);let X=(await this.doApply([Q]))[0];if(X!==0&&X!==15)return G(X??12);return R(Q.head)})}async insert($){let{body:Z,type:J,gid:Q,pid:V,tags:Y}=$,W=_0({body:Z,type:J,gid:Q,pid:V,tags:Y});return this.insertRaw(W)}async update($){let{prior:Z,body:J,type:Q,gid:V,pid:Y,tags:X,force:W}=$,K=_0({body:J,type:Q,gid:V,pid:Y,tags:X});return this.updateRaw(Z,K,W??this.forceSkewHandlingByDefault)}async delete($){let Z=$.force??!0;if("prior"in $)return this.updateRaw($.prior,void 0,Z);let[J,Q]=await this.revFromArchive($.eid);if(Q!==0)return G(Q);return this.updateRaw(J,void 0,Z)}async revFromArchive($){let Z=await this.store.messages.last($);if(Z)return bJ(Z.head);let J=new g($),[Q,V]=J.readStruct(Q0);if(V!==0)return G(V);return R({eid:$,ctr:-1,updatedAt:Q.ts})}async genEID($){let{clock:Z,crypto:J}=this,Q=Z.now();if($!==void 0)return T$({id:$,ts:Q});let V=await J.genRandomBytes(8);return T$({id:V,ts:Q})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:$,crypto:Z,store:J}=this,Q=await J.seed.load();if(!Q)return 22;await this.drainApplyQueue();for(let[V,Y]of $){let X=await J.hosts.get(V);if(!X)continue;let W={conn:Y,store:J,enclave:Q,host:X,crypto:Z,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},z=await LZ(W);if(z!==0)return console.error(`Failed to peek: ${z}`),this.emitProgress({phase:"idle"}),z;this.xferState.emit();let K=await rJ(W);if(K!==0)return console.error(`Failed to push: ${K}`),this.emitProgress({phase:"idle"}),K;this.xferState.emit();let F=await xZ(W,async()=>{await this.drainApplyQueue()});if(F!==0&&F!==15)return console.error(`Failed to pull: ${F}`),this.emitProgress({phase:"idle"}),F;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild($){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),$?.checkHost??!0){let J=await this.repull();if(J!==0)return J}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let $=await this.store.messages.listKeys();return z$($,this.crypto)}listMsgs($){return this.store.messages.list($)}countMsgs($){return this.store.messages.count($)}async reconcile($,Z){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:J,crypto:Q,store:V}=this,Y=await V.seed.load();if(!Y)return G(22);let X=await V.hosts.get($);if(!X)return G(13);let W=J.get($);if(!W||!W.isConnected()){if(await this.connectToHost(X,!1,!1),X=await V.hosts.get($),!X)return G(13);W=J.get($)}if(!W)return G(12);let z={conn:W,store:V,enclave:Y,crypto:Q,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[K,F]=await fZ({...z,host:X},Z);if(this.xferState.emit(),F!==0)return this.emitProgress({phase:"idle"}),G(F);if(!K)return this.emitProgress({phase:"idle"}),G(12);if(Z?.sync===!1)return this.emitProgress({phase:"idle"}),R(K);let N=await this.sync();if(N!==0)return G(N);let U=await V.hosts.get($);if(!U)return G(13);let[O,q]=await fZ({...z,host:U},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),q!==0)return G(q);if(!O)return G(12);return R(O)}async repull(){let{connections:$,crypto:Z,store:J}=this,Q=await J.seed.load();if(!Q)return 22;let V=Array.from(await J.hosts.list());if(V.length<1)return 0;for(let Y of V){let X=$.get(Y.label);if(!X||!X.isConnected())await this.connectToHost(Y,!1,!1)}for(let[Y,X]of $){let W=await J.hosts.get(Y);if(!W)continue;let z={conn:X,store:J,enclave:Q,host:{...W,lastSeq:0},crypto:Z,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},K=await LZ(z);if(K!==0)return console.error(`rebuild: failed to peek: ${K}`),this.emitProgress({phase:"idle"}),K;this.xferState.emit();let F=await xZ(z);if(F!==0&&F!==15)return console.error(`rebuild: failed to pull: ${F}`),this.emitProgress({phase:"idle"}),F;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let $=await this.state.clear();if($!==0)return $;let Z=await this.store.messages.list(),J=o0(Z,(Y)=>Y.head),Q=J.length;if(Q<1)return this.emitProgress({phase:"idle"}),0;let V=0;while(V<J.length){let Y=0,X=0,W=V;for(let K=V;K<J.length&&X<100&&Y<102400;K++)Y+=J[K].head.len,X++,W=K+1;let z=J.slice(V,W);await this.applyStored(z),this.emitProgress({phase:"exec",done:W,total:Q}),V=W}return this.emitProgress({phase:"idle"}),0}async wipe($){let Z=$?.msgs!==!1,J=$?.ents!==!1,Q=$?.meta!==!1,V=$?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:Y}=this;if(Q)await Y.hosts.wipe(),await Y.uploads.wipe(),await Y.downloads.wipe();if(Z)await Y.messages.wipe();if(V)await Y.seed.wipe();if(J)await this.state.clear();this.lastProgress=wZ,this.clientState.emit(),this.xferState.emit()}import=async($,Z)=>{let{crypto:J,store:Q}=this,V=Z?.onProgress,Y=await Q.seed.load();if(!Y)return 22;console.time("import: decoding file...");let X=await $.bytes(),[W,z]=await xJ(X,J,Y);if(z!==0)return z;console.timeEnd("import: decoding file...");let K=0;while(K<W.length){let F=0,N=0,U=K;for(let I=K;I<W.length&&N<100&&F<102400;I++)F+=W[I].head.len,N++,U=I+1;let O=W.slice(K,U);console.time(`import: applying [${K}, ${U}]`);let q=await this.apply(O,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${K}, ${U}]`);for(let I=0;I<O.length;I++){let H=q[I];if(H!==0&&H!==15)console.warn(`failed to import msg ${K+I}: ${j[H]}`)}if(V)queueMicrotask(()=>V(U,W.length,0));this.emitProgress({phase:"import",done:U,total:W.length}),K=U}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:$,store:Z}=this,J=await Z.seed.load();if(!J)return G(22);let Q=await Z.messages.list();return LJ("export",0,Q,$,J)}async export($){let[Z,J]=await this.exportBytes();if(J!==0)return J;if(!Z)return 12;let Q=new Blob([Z.slice()]);return hJ(Q,$),0}async link($,Z=!0){if(await this.store.hosts.add($),this.clientState.emit(),Z){let J=await this.store.hosts.get($.label);if(J)await this.connectToHost(J)}}async unlink($){await this.store.hosts.del($),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async($,Z=!0,J=!0)=>{let{clock:Q,connections:V,crypto:Y,store:X,transport:W}=this,z=V.get($.label);if(z){if(z.isConnected())return;try{z.closeListener()}catch{}V.delete($.label)}let K=await X.seed.load();if(!K)return;console.info(`Connecting to ${$.handle} (${$.label})`);let F=new L$(K,Y,$,Q,W($),(N)=>X.hosts.set($.label,N));if(await F.register(),Z)await F.listen(async(N)=>{let U={conn:F,store:X,enclave:K,host:$,crypto:Y,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return aJ(N,U,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(V.set($.label,F),this.clientState.emit(),J)this.scheduleSync()};async connect($=!0,Z=!0){let{connectToHost:J,scheduleSync:Q,store:V}=this;if(!await V.seed.load())return;await this.drainApplyQueue();let X=await V.hosts.list();for(let W of X)await J(W,$,!1);if(Z)Q()}disconnect=async()=>{for(let $ of this.connections.values())try{$.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}var x0=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function b$($){if(!Number.isSafeInteger($)||$<0)throw Error("positive integer expected, got "+$)}function BZ($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function d($,...Z){if(!BZ($))throw Error("Uint8Array expected");if(Z.length>0&&!Z.includes($.length))throw Error("Uint8Array expected of length "+Z+", got length="+$.length)}function EZ($,Z=!0){if($.destroyed)throw Error("Hash instance has been destroyed");if(Z&&$.finished)throw Error("Hash#digest() has already been called")}function sJ($,Z){d($);let J=Z.outputLen;if($.length<J)throw Error("digestInto() expects output buffer of length at least "+J)}function mZ($){if(typeof $!=="boolean")throw Error(`boolean expected, not ${$}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var I0=($)=>new Uint32Array($.buffer,$.byteOffset,Math.floor($.byteLength/4));var TV=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!TV)throw Error("Non little-endian hardware is not supported");function DV($){if(typeof $!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode($))}function y$($){if(typeof $==="string")$=DV($);else if(BZ($))$=i$($);else throw Error("Uint8Array expected, got "+typeof $);return $}function tJ($,Z){if(Z==null||typeof Z!=="object")throw Error("options must be defined");return Object.assign($,Z)}function eJ($,Z){if($.length!==Z.length)return!1;let J=0;for(let Q=0;Q<$.length;Q++)J|=$[Q]^Z[Q];return J===0}var $Q=($,Z)=>{function J(Q,...V){if(d(Q),$.nonceLength!==void 0){let F=V[0];if(!F)throw Error("nonce / iv required");if($.varSizeNonce)d(F);else d(F,$.nonceLength)}let Y=$.tagLength;if(Y&&V[1]!==void 0)d(V[1]);let X=Z(Q,...V),W=(F,N)=>{if(N!==void 0){if(F!==2)throw Error("cipher output not supported");d(N)}},z=!1;return{encrypt(F,N){if(z)throw Error("cannot encrypt() twice with same key + nonce");return z=!0,d(F),W(X.encrypt.length,N),X.encrypt(F,N)},decrypt(F,N){if(d(F),Y&&F.length<Y)throw Error("invalid ciphertext length: smaller than tagLength="+Y);return W(X.decrypt.length,N),X.decrypt(F,N)}}}return Object.assign(J,$),J};function gZ($,Z,J=!0){if(Z===void 0)return new Uint8Array($);if(Z.length!==$)throw Error("invalid output length, expected "+$+", got: "+Z.length);if(J&&!jV(Z))throw Error("invalid output, must be aligned");return Z}function jV($){return $.byteOffset%4===0}function i$($){return Uint8Array.from($)}function U0(...$){for(let Z=0;Z<$.length;Z++)$[Z].fill(0)}function h$($=32){if(x0&&typeof x0.getRandomValues==="function")return x0.getRandomValues(new Uint8Array($));if(x0&&typeof x0.randomBytes==="function")return x0.randomBytes($);throw Error("crypto.getRandomValues must be defined")}var JQ=($)=>Uint8Array.from($.split("").map((Z)=>Z.charCodeAt(0))),AV=JQ("expand 16-byte k"),_V=JQ("expand 32-byte k"),LV=I0(AV),xV=I0(_V);function D($,Z){return $<<Z|$>>>32-Z}function SZ($){return $.byteOffset%4===0}var u$=64,fV=16,QQ=4294967295,ZQ=new Uint32Array;function kV($,Z,J,Q,V,Y,X,W){let z=V.length,K=new Uint8Array(u$),F=I0(K),N=SZ(V)&&SZ(Y),U=N?I0(V):ZQ,O=N?I0(Y):ZQ;for(let q=0;q<z;X++){if($(Z,J,Q,F,X,W),X>=QQ)throw Error("arx: counter overflow");let I=Math.min(u$,z-q);if(N&&I===u$){let H=q/4;if(q%4!==0)throw Error("arx: invalid block position");for(let P=0,C;P<fV;P++)C=H+P,O[C]=U[C]^F[P];q+=u$;continue}for(let H=0,P;H<I;H++)P=q+H,Y[P]=V[P]^K[H];q+=I}}function VQ($,Z){let{allowShortKeys:J,extendNonceFn:Q,counterLength:V,counterRight:Y,rounds:X}=tJ({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},Z);if(typeof $!=="function")throw Error("core must be a function");return b$(V),b$(X),mZ(Y),mZ(J),(W,z,K,F,N=0)=>{d(W),d(z),d(K);let U=K.length;if(F===void 0)F=new Uint8Array(U);if(d(F),b$(N),N<0||N>=QQ)throw Error("arx: counter overflow");if(F.length<U)throw Error(`arx: output (${F.length}) is shorter than data (${U})`);let O=[],q=W.length,I,H;if(q===32)O.push(I=i$(W)),H=xV;else if(q===16&&J)I=new Uint8Array(32),I.set(W),I.set(W,16),H=LV,O.push(I);else throw Error(`arx: invalid 32-byte key, got length=${q}`);if(!SZ(z))O.push(z=i$(z));let P=I0(I);if(Q){if(z.length!==24)throw Error("arx: extended nonce must be 24 bytes");Q(H,P,I0(z.subarray(0,16)),P),z=z.subarray(16)}let C=16-V;if(C!==z.length)throw Error(`arx: nonce must be ${C} or 16 bytes`);if(C!==12){let M=new Uint8Array(12);M.set(z,Y?0:12-z.length),z=M,O.push(z)}let T=I0(z);return kV($,H,P,T,K,F,N,X),U0(...O),F}}var o=($,Z)=>$[Z++]&255|($[Z++]&255)<<8;class YQ{constructor($){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,$=y$($),d($,32);let Z=o($,0),J=o($,2),Q=o($,4),V=o($,6),Y=o($,8),X=o($,10),W=o($,12),z=o($,14);this.r[0]=Z&8191,this.r[1]=(Z>>>13|J<<3)&8191,this.r[2]=(J>>>10|Q<<6)&7939,this.r[3]=(Q>>>7|V<<9)&8191,this.r[4]=(V>>>4|Y<<12)&255,this.r[5]=Y>>>1&8190,this.r[6]=(Y>>>14|X<<2)&8191,this.r[7]=(X>>>11|W<<5)&8065,this.r[8]=(W>>>8|z<<8)&8191,this.r[9]=z>>>5&127;for(let K=0;K<8;K++)this.pad[K]=o($,16+2*K)}process($,Z,J=!1){let Q=J?0:2048,{h:V,r:Y}=this,X=Y[0],W=Y[1],z=Y[2],K=Y[3],F=Y[4],N=Y[5],U=Y[6],O=Y[7],q=Y[8],I=Y[9],H=o($,Z+0),P=o($,Z+2),C=o($,Z+4),T=o($,Z+6),M=o($,Z+8),A=o($,Z+10),x=o($,Z+12),m=o($,Z+14),E=V[0]+(H&8191),k=V[1]+((H>>>13|P<<3)&8191),b=V[2]+((P>>>10|C<<6)&8191),w=V[3]+((C>>>7|T<<9)&8191),h=V[4]+((T>>>4|M<<12)&8191),l=V[5]+(M>>>1&8191),L=V[6]+((M>>>14|A<<2)&8191),v=V[7]+((A>>>11|x<<5)&8191),B=V[8]+((x>>>8|m<<8)&8191),y=V[9]+(m>>>5|Q),_=0,c=_+E*X+k*(5*I)+b*(5*q)+w*(5*O)+h*(5*U);_=c>>>13,c&=8191,c+=l*(5*N)+L*(5*F)+v*(5*K)+B*(5*z)+y*(5*W),_+=c>>>13,c&=8191;let a=_+E*W+k*X+b*(5*I)+w*(5*q)+h*(5*O);_=a>>>13,a&=8191,a+=l*(5*U)+L*(5*N)+v*(5*F)+B*(5*K)+y*(5*z),_+=a>>>13,a&=8191;let J0=_+E*z+k*W+b*X+w*(5*I)+h*(5*q);_=J0>>>13,J0&=8191,J0+=l*(5*O)+L*(5*U)+v*(5*N)+B*(5*F)+y*(5*K),_+=J0>>>13,J0&=8191;let p=_+E*K+k*z+b*W+w*X+h*(5*I);_=p>>>13,p&=8191,p+=l*(5*q)+L*(5*O)+v*(5*U)+B*(5*N)+y*(5*F),_+=p>>>13,p&=8191;let q0=_+E*F+k*K+b*z+w*W+h*X;_=q0>>>13,q0&=8191,q0+=l*(5*I)+L*(5*q)+v*(5*O)+B*(5*U)+y*(5*N),_+=q0>>>13,q0&=8191;let v0=_+E*N+k*F+b*K+w*z+h*W;_=v0>>>13,v0&=8191,v0+=l*X+L*(5*I)+v*(5*q)+B*(5*O)+y*(5*U),_+=v0>>>13,v0&=8191;let b0=_+E*U+k*N+b*F+w*K+h*z;_=b0>>>13,b0&=8191,b0+=l*W+L*X+v*(5*I)+B*(5*q)+y*(5*O),_+=b0>>>13,b0&=8191;let y0=_+E*O+k*U+b*N+w*F+h*K;_=y0>>>13,y0&=8191,y0+=l*z+L*W+v*X+B*(5*I)+y*(5*q),_+=y0>>>13,y0&=8191;let i0=_+E*q+k*O+b*U+w*N+h*F;_=i0>>>13,i0&=8191,i0+=l*K+L*z+v*W+B*X+y*(5*I),_+=i0>>>13,i0&=8191;let h0=_+E*I+k*q+b*O+w*U+h*N;_=h0>>>13,h0&=8191,h0+=l*F+L*K+v*z+B*W+y*X,_+=h0>>>13,h0&=8191,_=(_<<2)+_|0,_=_+c|0,c=_&8191,_=_>>>13,a+=_,V[0]=c,V[1]=a,V[2]=J0,V[3]=p,V[4]=q0,V[5]=v0,V[6]=b0,V[7]=y0,V[8]=i0,V[9]=h0}finalize(){let{h:$,pad:Z}=this,J=new Uint16Array(10),Q=$[1]>>>13;$[1]&=8191;for(let X=2;X<10;X++)$[X]+=Q,Q=$[X]>>>13,$[X]&=8191;$[0]+=Q*5,Q=$[0]>>>13,$[0]&=8191,$[1]+=Q,Q=$[1]>>>13,$[1]&=8191,$[2]+=Q,J[0]=$[0]+5,Q=J[0]>>>13,J[0]&=8191;for(let X=1;X<10;X++)J[X]=$[X]+Q,Q=J[X]>>>13,J[X]&=8191;J[9]-=8192;let V=(Q^1)-1;for(let X=0;X<10;X++)J[X]&=V;V=~V;for(let X=0;X<10;X++)$[X]=$[X]&V|J[X];$[0]=($[0]|$[1]<<13)&65535,$[1]=($[1]>>>3|$[2]<<10)&65535,$[2]=($[2]>>>6|$[3]<<7)&65535,$[3]=($[3]>>>9|$[4]<<4)&65535,$[4]=($[4]>>>12|$[5]<<1|$[6]<<14)&65535,$[5]=($[6]>>>2|$[7]<<11)&65535,$[6]=($[7]>>>5|$[8]<<8)&65535,$[7]=($[8]>>>8|$[9]<<5)&65535;let Y=$[0]+Z[0];$[0]=Y&65535;for(let X=1;X<8;X++)Y=($[X]+Z[X]|0)+(Y>>>16)|0,$[X]=Y&65535;U0(J)}update($){EZ(this);let{buffer:Z,blockLen:J}=this;$=y$($);let Q=$.length;for(let V=0;V<Q;){let Y=Math.min(J-this.pos,Q-V);if(Y===J){for(;J<=Q-V;V+=J)this.process($,V);continue}if(Z.set($.subarray(V,V+Y),this.pos),this.pos+=Y,V+=Y,this.pos===J)this.process(Z,0,!1),this.pos=0}return this}destroy(){U0(this.h,this.r,this.buffer,this.pad)}digestInto($){EZ(this),sJ($,this),this.finished=!0;let{buffer:Z,h:J}=this,{pos:Q}=this;if(Q){Z[Q++]=1;for(;Q<16;Q++)Z[Q]=0;this.process(Z,0,!0)}this.finalize();let V=0;for(let Y=0;Y<8;Y++)$[V++]=J[Y]>>>0,$[V++]=J[Y]>>>8;return $}digest(){let{buffer:$,outputLen:Z}=this;this.digestInto($);let J=$.slice(0,Z);return this.destroy(),J}}function BV($){let Z=(Q,V)=>$(V).update(y$(Q)).digest(),J=$(new Uint8Array(32));return Z.outputLen=J.outputLen,Z.blockLen=J.blockLen,Z.create=(Q)=>$(Q),Z}var vZ=BV(($)=>new YQ($));function EV($,Z,J,Q,V,Y=20){let X=$[0],W=Z[0],z=Z[1],K=Z[2],F=Z[3],N=$[1],U=J[0],O=J[1],q=V,I=0,H=$[2],P=Z[4],C=Z[5],T=Z[6],M=Z[7],A=$[3],x=X,m=W,E=z,k=K,b=F,w=N,h=U,l=O,L=q,v=I,B=H,y=P,_=C,c=T,a=M,J0=A;for(let q0=0;q0<Y;q0+=2)b^=D(x+_|0,7),L^=D(b+x|0,9),_^=D(L+b|0,13),x^=D(_+L|0,18),v^=D(w+m|0,7),c^=D(v+w|0,9),m^=D(c+v|0,13),w^=D(m+c|0,18),a^=D(B+h|0,7),E^=D(a+B|0,9),h^=D(E+a|0,13),B^=D(h+E|0,18),k^=D(J0+y|0,7),l^=D(k+J0|0,9),y^=D(l+k|0,13),J0^=D(y+l|0,18),m^=D(x+k|0,7),E^=D(m+x|0,9),k^=D(E+m|0,13),x^=D(k+E|0,18),h^=D(w+b|0,7),l^=D(h+w|0,9),b^=D(l+h|0,13),w^=D(b+l|0,18),y^=D(B+v|0,7),L^=D(y+B|0,9),v^=D(L+y|0,13),B^=D(v+L|0,18),_^=D(J0+a|0,7),c^=D(_+J0|0,9),a^=D(c+_|0,13),J0^=D(a+c|0,18);let p=0;Q[p++]=X+x|0,Q[p++]=W+m|0,Q[p++]=z+E|0,Q[p++]=K+k|0,Q[p++]=F+b|0,Q[p++]=N+w|0,Q[p++]=U+h|0,Q[p++]=O+l|0,Q[p++]=q+L|0,Q[p++]=I+v|0,Q[p++]=H+B|0,Q[p++]=P+y|0,Q[p++]=C+_|0,Q[p++]=T+c|0,Q[p++]=M+a|0,Q[p++]=A+J0|0}function mV($,Z,J,Q){let V=$[0],Y=Z[0],X=Z[1],W=Z[2],z=Z[3],K=$[1],F=J[0],N=J[1],U=J[2],O=J[3],q=$[2],I=Z[4],H=Z[5],P=Z[6],C=Z[7],T=$[3];for(let A=0;A<20;A+=2)z^=D(V+H|0,7),U^=D(z+V|0,9),H^=D(U+z|0,13),V^=D(H+U|0,18),O^=D(K+Y|0,7),P^=D(O+K|0,9),Y^=D(P+O|0,13),K^=D(Y+P|0,18),C^=D(q+F|0,7),X^=D(C+q|0,9),F^=D(X+C|0,13),q^=D(F+X|0,18),W^=D(T+I|0,7),N^=D(W+T|0,9),I^=D(N+W|0,13),T^=D(I+N|0,18),Y^=D(V+W|0,7),X^=D(Y+V|0,9),W^=D(X+Y|0,13),V^=D(W+X|0,18),F^=D(K+z|0,7),N^=D(F+K|0,9),z^=D(N+F|0,13),K^=D(z+N|0,18),I^=D(q+O|0,7),U^=D(I+q|0,9),O^=D(U+I|0,13),q^=D(O+U|0,18),H^=D(T+C|0,7),P^=D(H+T|0,9),C^=D(P+H|0,13),T^=D(C+P|0,18);let M=0;Q[M++]=V,Q[M++]=K,Q[M++]=q,Q[M++]=T,Q[M++]=F,Q[M++]=N,Q[M++]=U,Q[M++]=O}var bZ=VQ(EV,{counterRight:!0,extendNonceFn:mV}),yZ=$Q({blockSize:64,nonceLength:24,tagLength:16},($,Z)=>{return{encrypt(J,Q){Q=gZ(J.length+32,Q,!1);let V=Q.subarray(0,32),Y=Q.subarray(32);Q.set(J,32),U0(V),bZ($,Z,Q,Q);let X=vZ(Y,V);return Q.set(X,16),U0(Q.subarray(0,16),X),Q.subarray(16)},decrypt(J,Q){d(J),Q=gZ(J.length+32,Q,!1);let V=Q.subarray(0,32),Y=Q.subarray(32,48),X=Q.subarray(48);Q.set(J,32),U0(V);let W=bZ($,Z,V,V),z=vZ(X,W);if(!eJ(Y,z))throw Error("invalid tag");return bZ($,Z,Q.subarray(16),Q.subarray(16)),U0(V,Y,z),X}}});/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function gV($){return $ instanceof Uint8Array||ArrayBuffer.isView($)&&$.constructor.name==="Uint8Array"}function F$($){if(!Number.isSafeInteger($)||$<0)throw Error("positive integer expected, got "+$)}function f0($,...Z){if(!gV($))throw Error("Uint8Array expected");if(Z.length>0&&!Z.includes($.length))throw Error("Uint8Array expected of length "+Z+", got length="+$.length)}function N$($,Z=!0){if($.destroyed)throw Error("Hash instance has been destroyed");if(Z&&$.finished)throw Error("Hash#digest() has already been called")}function l$($,Z){f0($);let J=Z.outputLen;if($.length<J)throw Error("digestInto() expects output buffer of length at least "+J)}function XQ($){return new Uint8Array($.buffer,$.byteOffset,$.byteLength)}function t0($){return new Uint32Array($.buffer,$.byteOffset,Math.floor($.byteLength/4))}function e0(...$){for(let Z=0;Z<$.length;Z++)$[Z].fill(0)}function R$($,Z){return $<<32-Z|$>>>Z}var WQ=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function GQ($){return $<<24&4278190080|$<<8&16711680|$>>>8&65280|$>>>24&255}var zQ=WQ?($)=>$:($)=>GQ($);function SV($){for(let Z=0;Z<$.length;Z++)$[Z]=GQ($[Z]);return $}var e=WQ?($)=>$:SV;function vV($){if(typeof $!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode($))}function $$($){if(typeof $==="string")$=vV($);return f0($),$}class iZ{}function KQ($){let Z=(Q,V)=>$(V).update($$(Q)).digest(),J=$({});return Z.outputLen=J.outputLen,Z.blockLen=J.blockLen,Z.create=(Q)=>$(Q),Z}var FQ=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var p$=BigInt(4294967295),NQ=BigInt(32);function hZ($,Z=!1){if(Z)return{h:Number($&p$),l:Number($>>NQ&p$)};return{h:Number($>>NQ&p$)|0,l:Number($&p$)|0}}function H0($,Z,J,Q,V){return $=$+Z+V|0,Q=R$(Q^$,16),J=J+Q|0,Z=R$(Z^J,12),{a:$,b:Z,c:J,d:Q}}function M0($,Z,J,Q,V){return $=$+Z+V|0,Q=R$(Q^$,8),J=J+Q|0,Z=R$(Z^J,7),{a:$,b:Z,c:J,d:Q}}class uZ extends iZ{constructor($,Z){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,F$($),F$(Z),this.blockLen=$,this.outputLen=Z,this.buffer=new Uint8Array($),this.buffer32=t0(this.buffer)}update($){N$(this),$=$$($),f0($);let{blockLen:Z,buffer:J,buffer32:Q}=this,V=$.length,Y=$.byteOffset,X=$.buffer;for(let W=0;W<V;){if(this.pos===Z)e(Q),this.compress(Q,0,!1),e(Q),this.pos=0;let z=Math.min(Z-this.pos,V-W),K=Y+W;if(z===Z&&!(K%4)&&W+z<V){let F=new Uint32Array(X,K,Math.floor((V-W)/4));e(F);for(let N=0;W+Z<V;N+=Q.length,W+=Z)this.length+=Z,this.compress(F,N,!1);e(F);continue}J.set($.subarray(W,W+z),this.pos),this.pos+=z,this.length+=z,W+=z}return this}digestInto($){N$(this),l$($,this);let{pos:Z,buffer32:J}=this;this.finished=!0,e0(this.buffer.subarray(Z)),e(J),this.compress(J,0,!0),e(J);let Q=t0($);this.get().forEach((V,Y)=>Q[Y]=zQ(V))}digest(){let{buffer:$,outputLen:Z}=this;this.digestInto($);let J=$.slice(0,Z);return this.destroy(),J}_cloneInto($){let{buffer:Z,length:J,finished:Q,destroyed:V,outputLen:Y,pos:X}=this;return $||($=new this.constructor({dkLen:Y})),$.set(...this.get()),$.buffer.set(Z),$.destroyed=V,$.finished=Q,$.length=J,$.pos=X,$.outputLen=Y,$}clone(){return this._cloneInto()}}function lZ($,Z,J,Q,V,Y,X,W,z,K,F,N,U,O,q,I,H,P,C,T){let M=0;for(let A=0;A<Q;A++)({a:V,b:z,c:U,d:H}=H0(V,z,U,H,J[Z+$[M++]])),{a:V,b:z,c:U,d:H}=M0(V,z,U,H,J[Z+$[M++]]),{a:Y,b:K,c:O,d:P}=H0(Y,K,O,P,J[Z+$[M++]]),{a:Y,b:K,c:O,d:P}=M0(Y,K,O,P,J[Z+$[M++]]),{a:X,b:F,c:q,d:C}=H0(X,F,q,C,J[Z+$[M++]]),{a:X,b:F,c:q,d:C}=M0(X,F,q,C,J[Z+$[M++]]),{a:W,b:N,c:I,d:T}=H0(W,N,I,T,J[Z+$[M++]]),{a:W,b:N,c:I,d:T}=M0(W,N,I,T,J[Z+$[M++]]),{a:V,b:K,c:q,d:T}=H0(V,K,q,T,J[Z+$[M++]]),{a:V,b:K,c:q,d:T}=M0(V,K,q,T,J[Z+$[M++]]),{a:Y,b:F,c:I,d:H}=H0(Y,F,I,H,J[Z+$[M++]]),{a:Y,b:F,c:I,d:H}=M0(Y,F,I,H,J[Z+$[M++]]),{a:X,b:N,c:U,d:P}=H0(X,N,U,P,J[Z+$[M++]]),{a:X,b:N,c:U,d:P}=M0(X,N,U,P,J[Z+$[M++]]),{a:W,b:z,c:O,d:C}=H0(W,z,O,C,J[Z+$[M++]]),{a:W,b:z,c:O,d:C}=M0(W,z,O,C,J[Z+$[M++]]);return{v0:V,v1:Y,v2:X,v3:W,v4:z,v5:K,v6:F,v7:N,v8:U,v9:O,v10:q,v11:I,v12:H,v13:P,v14:C,v15:T}}var O0={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},C0=FQ.slice(),RQ=(()=>{let $=Array.from({length:16},(Q,V)=>V),Z=(Q)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((V)=>Q[V]),J=[];for(let Q=0,V=$;Q<7;Q++,V=Z(V))J.push(...V);return Uint8Array.from(J)})();class pZ extends uZ{constructor($={},Z=0){super(64,$.dkLen===void 0?32:$.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:J,context:Q}=$,V=Q!==void 0;if(J!==void 0){if(V)throw Error(\'Only "key" or "context" can be specified at same time\');let Y=$$(J).slice();f0(Y,32),this.IV=t0(Y),e(this.IV),this.flags=Z|O0.KEYED_HASH}else if(V){let Y=$$(Q),X=new pZ({dkLen:32},O0.DERIVE_KEY_CONTEXT).update(Y).digest();this.IV=t0(X),e(this.IV),this.flags=Z|O0.DERIVE_KEY_MATERIAL}else this.IV=C0.slice(),this.flags=Z;this.state=this.IV.slice(),this.bufferOut=XQ(this.bufferOut32)}get(){return[]}set(){}b2Compress($,Z,J,Q=0){let{state:V,pos:Y}=this,{h:X,l:W}=hZ(BigInt($),!0),{v0:z,v1:K,v2:F,v3:N,v4:U,v5:O,v6:q,v7:I,v8:H,v9:P,v10:C,v11:T,v12:M,v13:A,v14:x,v15:m}=lZ(RQ,Q,J,7,V[0],V[1],V[2],V[3],V[4],V[5],V[6],V[7],C0[0],C0[1],C0[2],C0[3],X,W,Y,Z);V[0]=z^H,V[1]=K^P,V[2]=F^C,V[3]=N^T,V[4]=U^M,V[5]=O^A,V[6]=q^x,V[7]=I^m}compress($,Z=0,J=!1){let Q=this.flags;if(!this.chunkPos)Q|=O0.CHUNK_START;if(this.chunkPos===15||J)Q|=O0.CHUNK_END;if(!J)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,Q,$,Z),this.chunkPos+=1,this.chunkPos===16||J){let V=this.state;this.state=this.IV.slice();for(let Y,X=this.chunksDone+1;J||!(X&1);X>>=1){if(!(Y=this.stack.pop()))break;this.buffer32.set(Y,0),this.buffer32.set(V,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|O0.PARENT,this.buffer32,0),V=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(V)}this.pos=0}_cloneInto($){$=super._cloneInto($);let{IV:Z,flags:J,state:Q,chunkPos:V,posOut:Y,chunkOut:X,stack:W,chunksDone:z}=this;return $.state.set(Q.slice()),$.stack=W.map((K)=>Uint32Array.from(K)),$.IV.set(Z),$.flags=J,$.chunkPos=V,$.chunksDone=z,$.posOut=Y,$.chunkOut=X,$.enableXOF=this.enableXOF,$.bufferOut32.set(this.bufferOut32),$}destroy(){this.destroyed=!0,e0(this.state,this.buffer32,this.IV,this.bufferOut32),e0(...this.stack)}b2CompressOut(){let{state:$,pos:Z,flags:J,buffer32:Q,bufferOut32:V}=this,{h:Y,l:X}=hZ(BigInt(this.chunkOut++));e(Q);let{v0:W,v1:z,v2:K,v3:F,v4:N,v5:U,v6:O,v7:q,v8:I,v9:H,v10:P,v11:C,v12:T,v13:M,v14:A,v15:x}=lZ(RQ,0,Q,7,$[0],$[1],$[2],$[3],$[4],$[5],$[6],$[7],C0[0],C0[1],C0[2],C0[3],X,Y,Z,J);V[0]=W^I,V[1]=z^H,V[2]=K^P,V[3]=F^C,V[4]=N^T,V[5]=U^M,V[6]=O^A,V[7]=q^x,V[8]=$[0]^I,V[9]=$[1]^H,V[10]=$[2]^P,V[11]=$[3]^C,V[12]=$[4]^T,V[13]=$[5]^M,V[14]=$[6]^A,V[15]=$[7]^x,e(Q),e(V),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,e0(this.buffer.subarray(this.pos));let $=this.flags|O0.ROOT;if(this.stack.length)$|=O0.PARENT,e(this.buffer32),this.compress(this.buffer32,0,!0),e(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else $|=(!this.chunkPos?O0.CHUNK_START:0)|O0.CHUNK_END;this.flags=$,this.b2CompressOut()}writeInto($){N$(this,!1),f0($),this.finish();let{blockLen:Z,bufferOut:J}=this;for(let Q=0,V=$.length;Q<V;){if(this.posOut>=Z)this.b2CompressOut();let Y=Math.min(Z-this.posOut,V-Q);$.set(J.subarray(this.posOut,this.posOut+Y),Q),this.posOut+=Y,Q+=Y}return $}xofInto($){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto($)}xof($){return F$($),this.xofInto(new Uint8Array($))}digestInto($){if(l$($,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto($),this.destroy(),$}digest(){return this.digestInto(new Uint8Array(this.outputLen))}}var UQ=KQ(($)=>new pZ($));var nZ=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function OQ($){let Z=new Uint8Array(nZ.length+32);return Z.set(nZ),Z.set($.subarray(0,32),nZ.length),Z}function qQ($){return typeof $==="string"?new TextEncoder().encode($):$}function Z$($){let Z=new ArrayBuffer($.byteLength);return new Uint8Array(Z).set($),Z}class cZ{verifyKeys=new Map;signKeys=new Map;async genRandomBytes($){return h$($)}async gen256BitSecureRandomSeed(){return h$(32)}async encryptXSalsa20Poly1305Combined($,Z){let J=h$(24),V=yZ(Z,J).encrypt($);return new Uint8Array([...J,...V])}async decryptXSalsa20Poly1305Combined($,Z){let J=$.slice(0,24),Q=$.slice(24);return yZ(Z,J).decrypt(Q)}async deriveEd25519KeyPair($){let Z=$,J=OQ(Z),Q=await globalThis.crypto.subtle.importKey("pkcs8",Z$(J),{name:"Ed25519"},!0,["sign"]),V=await globalThis.crypto.subtle.exportKey("jwk",Q);if(typeof V.x!=="string")throw Error("Ed25519 JWK missing x");let Y=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:V.x},{name:"Ed25519"},!0,["verify"]),X=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",Y)),W=new Uint8Array(64);return W.set(Z,0),W.set(X,32),this.signKeys.set(N0(Z),Q),this.verifyKeys.set(N0(X),Y),{keyType:"ed25519",privateKey:W,publicKey:X}}async importSignKey($){let Z=$.subarray(0,32),J=N0(Z),Q=this.signKeys.get(J);if(Q)return Q;let V=OQ(Z),Y=await globalThis.crypto.subtle.importKey("pkcs8",Z$(V),{name:"Ed25519"},!1,["sign"]);return this.signKeys.set(J,Y),Y}async importVerifyKey($){let Z=N0($),J=this.verifyKeys.get(Z);if(J)return J;let Q=await globalThis.crypto.subtle.importKey("raw",Z$($),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(Z,Q),Q}async signEd25519($,Z){let J=qQ($),Q=await this.importSignKey(Z),V=await globalThis.crypto.subtle.sign({name:"Ed25519"},Q,Z$(J));return new Uint8Array(V)}async checkSigEd25519($,Z,J){let Q=qQ(Z);try{let V=await this.importVerifyKey(J);return await globalThis.crypto.subtle.verify({name:"Ed25519"},V,Z$($),Z$(Q))}catch{return!1}}async blake3($){return UQ($)}}var bV=new cZ,U$=bV;var k0={encode($,Z){let J=$.writeVarString(Z.handle);if(J!==0)return J;let Q=$.writeVarString(Z.label);if(Q!==0)return Q;return $.writeVarInt(Z.idx??0)},decode($){let[Z,J]=$.readVarString();if(J!==0)return G(J);let[Q,V]=$.readVarString();if(V!==0)return G(V);let[Y,X]=$.readVarInt();if(X!==0)return G(X);return R({handle:Z,label:Q,idx:Y})}};var n$=1,dZ={encode($,Z){if(Z.v!==n$)return 10;let[,J]=t(Z.masterSeed);if(J!==0)return J;let Q=$.writeVarInt(Z.v);if(Q!==0)return Q;$.writeBytes(Z.masterSeed);let V=$.writeVarInt(Z.hosts.length);if(V!==0)return V;for(let Y of Z.hosts){let X=$.writeStruct(k0,Y);if(X!==0)return X}return 0},decode($){let[Z,J]=$.readVarInt();if(J!==0)return G(J);if(Z!==n$)return G(14);let[Q,V]=$.readBytes(R0);if(V!==0)return G(V);if(Q===void 0)return G(14);let[Y,X]=t(Q);if(X!==0)return G(X);if(Y===void 0)return G(14);let[W,z]=$.readVarInt();if(z!==0)return G(z);if(W===void 0||W<0)return G(10);let K=[];for(let F=0;F<W;F++){let[N,U]=$.readStruct(k0);if(U!==0)return G(U);if(N===void 0)return G(14);K.push(N)}return R({v:n$,masterSeed:Y,hosts:K})}};function IQ($,Z){let[J,Q]=t($);if(Q!==0)return G(Q);if(J===void 0)return G(10);let[V,Y]=t(J.slice());if(Y!==0)return G(Y);if(V===void 0)return G(10);return R({v:n$,masterSeed:V,hosts:Z.map((X)=>({handle:X.handle,label:X.label,idx:X.idx??0}))})}var rZ={encode($,Z){let[,J]=t(Z.masterSeed);if(J!==0)return J;$.writeBytes(Z.masterSeed);let Q=$.writeVarInt(Z.hosts.length);if(Q!==0)return Q;for(let V of Z.hosts){let Y=$.writeStruct(k0,V);if(Y!==0)return Y}return 0},decode($){let[Z,J]=$.readBytes(R0);if(J!==0)return G(J);if(Z===void 0)return G(14);let[Q,V]=t(Z);if(V!==0)return G(V);if(Q===void 0)return G(14);let[Y,X]=$.readVarInt();if(X!==0)return G(X);if(Y===void 0||Y<0)return G(10);let W=[];for(let z=0;z<Y;z++){let[K,F]=$.readStruct(k0);if(F!==0)return G(F);if(K===void 0)return G(14);W.push(K)}return R({masterSeed:Q,hosts:W})}};function P0($){let Z=new Uint8Array($);if($>0)crypto.getRandomValues(Z);return Z}var B0=32,yV=-7,iV=-8,hV=-257,c$=[{type:"public-key",alg:yV},{type:"public-key",alg:iV},{type:"public-key",alg:hV}];function uV($){return $.trim().toLowerCase().replace(/\\.$/,"")||"localhost"}function E0($){let Z=new Uint8Array($.byteLength);return Z.set($),Z}function m0($){if($?.rpId!==void 0)return R($.rpId);if(typeof location>"u")return G(9);return R(uV(location.hostname))}function g0(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function S0($){if($===null||$.type!=="public-key"||!("rawId"in $)||typeof $.getClientExtensionResults!=="function")return G(27);return R($)}async function HQ($){let Z=g0();if(Z!==0)return G(Z);let[J,Q]=m0($);if(Q!==0)return G(Q);if(J===void 0)return G(9);let V=$?.userName??"diplomatic-seed",Y={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if($?.authenticatorAttachment!==void 0)Y.authenticatorAttachment=$.authenticatorAttachment;let X={largeBlob:{support:"required"}},W;try{W=await navigator.credentials.create({publicKey:{challenge:P0(B0),rp:{id:J,name:$?.rpName??"DIPLOMATIC"},user:{id:P0(16),name:V,displayName:V},pubKeyCredParams:c$,authenticatorSelection:Y,extensions:X}})}catch{return G(24)}let[z,K]=S0(W);if(K!==0)return G(K);if(z===void 0)return G(27);if(z.getClientExtensionResults().largeBlob?.supported!==!0)return G(24);return R(new Uint8Array(z.rawId))}async function oZ($,Z,J){let Q=g0();if(Q!==0)return Q;let[V,Y]=m0(J);if(Y!==0)return Y;if(V===void 0)return 9;let X={largeBlob:{write:E0(Z)}},W;try{W=await navigator.credentials.get({publicKey:{challenge:P0(B0),rpId:V,allowCredentials:[{type:"public-key",id:E0($)}],userVerification:"required",extensions:X}})}catch{return 24}let[z,K]=S0(W);if(K!==0)return K;if(z===void 0)return 27;if(z.getClientExtensionResults().largeBlob?.written!==!0)return 24;return 0}async function MQ($,Z){let J=g0();if(J!==0)return G(J);let[Q,V]=m0(Z);if(V!==0)return G(V);if(Q===void 0)return G(9);let Y={largeBlob:{read:!0}},X;try{let N={challenge:P0(B0),rpId:Q,userVerification:"required",extensions:Y};if($!==void 0)N.allowCredentials=[{type:"public-key",id:E0($)}];X=await navigator.credentials.get({publicKey:N})}catch{return G(24)}let[W,z]=S0(X);if(z!==0)return G(z);if(W===void 0)return G(27);let F=W.getClientExtensionResults().largeBlob?.blob;if(F===void 0)return G(7);return R({blob:new Uint8Array(F),credId:new Uint8Array(W.rawId)})}var d$=new TextEncoder().encode("diplomatic.prf.v1"),aZ=32;async function CQ($){let Z=g0();if(Z!==0)return G(Z);let[J,Q]=m0($);if(Q!==0)return G(Q);if(J===void 0)return G(9);let V=$?.userName??"diplomatic-prf",Y={residentKey:"required",requireResidentKey:!0,userVerification:"required",authenticatorAttachment:$?.authenticatorAttachment??"platform"},X;try{X=await navigator.credentials.create({publicKey:{challenge:P0(B0),rp:{id:J,name:$?.rpName??"DIPLOMATIC"},user:{id:P0(16),name:V,displayName:V},pubKeyCredParams:c$,authenticatorSelection:Y,extensions:{prf:{}}}})}catch{return G(24)}let[W,z]=S0(X);if(z!==0)return G(z);if(W===void 0)return G(27);let K=W.getClientExtensionResults();return R({credId:new Uint8Array(W.rawId),prfEnabled:K.prf?.enabled===!0})}async function O$($){let Z=g0();if(Z!==0)return G(Z);let[J,Q]=m0($);if(Q!==0)return G(Q);if(J===void 0)return G(9);let V=$?.salt??d$,Y=E0(V),X={challenge:P0(B0),rpId:J,userVerification:"required",extensions:{prf:{eval:{first:Y}}}};if($?.credId!==void 0)X.allowCredentials=[{type:"public-key",id:E0($.credId)}];let W;try{W=await navigator.credentials.get({publicKey:X})}catch{return G(24)}let[z,K]=S0(W);if(K!==0)return G(K);if(z===void 0)return G(27);let F=z.getClientExtensionResults().prf?.results;if(F?.first===void 0)return G(7);let N=F.first,U=N instanceof ArrayBuffer?new Uint8Array(N):new Uint8Array(N.buffer,N.byteOffset,N.byteLength),O=U.byteLength>=aZ?U.slice(0,aZ):U;if(O.byteLength!==aZ)return G(27);return R({prf:O,credId:new Uint8Array(z.rawId)})}var r$="";var o$;function pV(){if(o$!==void 0)return o$;if(typeof r$!=="string"||r$.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");let $=new Blob([r$],{type:"text/javascript"});return o$=URL.createObjectURL($),o$}function PQ(){if(typeof Worker>"u")throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Worker(pV(),{type:"module"})}var nV=new TextEncoder().encode("diplomatic.wrap.v1"),cV=32,dV=16;class $0{#J;#$;constructor($,Z){this.#J=$,this.#$=Z}static async fromRandom($){let Z=await $.gen256BitSecureRandomSeed(),[J,Q]=t(Z);if(Q!==0||J===void 0)throw Error(`enclave: invalid random seed (${Q})`);return new $0(J,$)}static fromBytes($,Z){let[J,Q]=t(Z);if(Q!==0)return G(Q);if(J===void 0)return G(10);let[V,Y]=t(J.slice());if(Y!==0)return G(Y);if(V===void 0)return G(10);return R(new $0(V,$))}async sealWithPasskey($){let Z=$?.salt??d$,J=$?.credId;if(J===void 0&&$?.createCredIfNeeded===!0){let[Y,X]=await CQ({rpId:$?.rpId,rpName:$?.rpName,userName:$?.userName??"diplomatic-prf"});if(X!==0)return G(X);if(Y===void 0)return G(24);if(!Y.prfEnabled)return G(24);J=Y.credId}let[Q,V]=await O$({rpId:$?.rpId,rpName:$?.rpName,credId:J,salt:Z});if(V!==0)return G(V);if(Q===void 0)return G(7);try{let[Y,X]=await this.#Z(Q.prf);if(X!==0)return G(X);if(Y===void 0)return G(12);return R({sealedMaster:Y,salt:Z.slice(),credId:Q.credId.slice()})}finally{Q.prf.fill(0)}}static async unsealWithPasskey($,Z,J){let[Q,V]=await O$({rpId:J.rpId,rpName:J.rpName,credId:J.credId,salt:J.salt});if(V!==0)return G(V);if(Q===void 0)return G(7);try{return await $0.#V($,Z,Q.prf)}finally{Q.prf.fill(0)}}async persistToLargeBlob($=[],Z){let J=Z?.credId;if(J===void 0){let[Y,X]=await HQ(Z);if(X!==0)return G(X);if(Y===void 0)return G(24);J=Y}let[Q,V]=this.#Q($);if(V!==0)return G(V);if(Q===void 0)return G(12);try{let Y=await oZ(J,Q,Z);if(Y!==0)return G(Y);return R(J)}finally{Q.fill(0)}}static async fromLargeBlob($,Z){let[J,Q]=await MQ(Z?.credId,Z);if(Q!==0)return G(Q);if(J===void 0)return G(7);try{return $0.#W($,J.blob,J.credId)}finally{J.blob.fill(0)}}static async clearLargeBlob($,Z){return oZ($,new Uint8Array(R0),Z)}async sealPairPackageBody($,Z){let J=Z?.salt??d$,[Q,V]=await O$({rpId:Z?.rpId,rpName:Z?.rpName,credId:Z?.credId,salt:J});if(V!==0)return G(V);if(Q===void 0)return G(7);try{let[Y,X]=await a$(this.#$,Q.prf);if(X!==0)return G(X);if(Y===void 0)return G(12);let[W,z]=t(this.#J.slice());if(z!==0)return G(z);if(W===void 0)return G(10);let K={masterSeed:W,hosts:$.map((q)=>({handle:q.handle,label:q.label,idx:q.idx??0}))},F=new S,N=F.writeStruct(rZ,K);if(N!==0)return W.fill(0),G(N);let U=F.result();W.fill(0);let O;try{O=await this.#$.encryptXSalsa20Poly1305Combined(U,Y)}catch{return U.fill(0),G(12)}return U.fill(0),R({body:O,salt:J.slice(),credId:Q.credId.slice()})}finally{Q.prf.fill(0)}}static async openPairPackageBody($,Z,J){let[Q,V]=await O$({rpId:J.rpId,rpName:J.rpName,credId:J.credId,salt:J.salt});if(V!==0)return G(V);if(Q===void 0)return G(7);try{let[Y,X]=await a$($,Q.prf);if(X!==0)return G(X);if(Y===void 0)return G(12);let W;try{W=await $.decryptXSalsa20Poly1305Combined(Z,Y)}catch{return G(20)}let z=new g(W),[K,F]=z.readStruct(rZ);if(W.fill(0),F!==0)return G(F);if(K===void 0)return G(14);let[N,U]=$0.fromBytes($,K.masterSeed);if(K.masterSeed.fill(0),U!==0)return G(U);if(N===void 0)return G(12);let[O,q]=await N.#Z(Q.prf);if(q!==0)return G(q);if(O===void 0)return G(12);return R({enclave:N,hosts:K.hosts.map((I)=>({...I})),sealedMaster:O,credId:Q.credId.slice()})}finally{Q.prf.fill(0)}}spawnSyncWorker($){let Z=PQ(),J=this.#J.slice();return Z.postMessage({id:$.id,op:"setSeed",seed:J,persist:$.persist},[J.buffer]),Z}deriveCipher($,Z){let J=$.slice(),Q=(X)=>this.#G(J,X),V=(X)=>this.#z(J,X);return{encrypt:Object.freeze({encrypt:Q}),decrypt:Object.freeze({decrypt:V}),both:Object.freeze({encrypt:Q,decrypt:V})}[Z]}async deriveIdentity($,Z=0){let J=$,Q=Z,V=await this.#X(J,Q);return Object.freeze({publicKey:V.publicKey,sign:(Y)=>this.#F(J,Q,Y),kdmFor:(Y)=>this.#N(J,Q,Y)})}async#Z($){let[Z,J]=await a$(this.#$,$);if(J!==0)return G(J);if(Z===void 0)return G(12);try{let Q=await this.#$.encryptXSalsa20Poly1305Combined(this.#J,Z);return j0(Q)}catch{return G(12)}}static async#V($,Z,J){let[,Q]=j0(Z);if(Q!==0)return G(Q);let[V,Y]=await a$($,J);if(Y!==0)return G(Y);if(V===void 0)return G(12);try{let X=await $.decryptXSalsa20Poly1305Combined(Z,V);return $0.fromBytes($,X)}catch{return G(20)}}#Q($){let[Z,J]=t(this.#J.slice());if(J!==0)return G(J);if(Z===void 0)return G(10);let[Q,V]=IQ(Z,$);if(V!==0)return Z.fill(0),G(V);if(Q===void 0)return Z.fill(0),G(12);Z.fill(0);let Y=new S,X=Y.writeStruct(dZ,Q);if(Q.masterSeed.fill(0),X!==0)return G(X);return R(Y.result())}static#W($,Z,J){if(Z.byteLength===0||Z.every((z)=>z===0))return G(22);if(Z.byteLength===R0){let[z,K]=$0.fromBytes($,Z);if(K!==0)return G(K);if(z===void 0)return G(12);return R({enclave:z,hosts:[],credId:J})}let Q=new g(Z),[V,Y]=Q.readStruct(dZ);if(Y!==0)return G(Y);if(V===void 0)return G(14);let[X,W]=$0.fromBytes($,V.masterSeed);if(V.masterSeed.fill(0),W!==0)return G(W);if(X===void 0)return G(12);return R({enclave:X,hosts:V.hosts.map((z)=>({...z})),credId:J})}async#G($,Z){let J=await this.#Y($);return this.#$.encryptXSalsa20Poly1305Combined(Z,J)}async#z($,Z){let J=await this.#Y($);return this.#$.decryptXSalsa20Poly1305Combined(Z,J)}async#Y($){return this.#$.blake3(W$(this.#J,$))}async#K($,Z){let J=new TextEncoder().encode($),Q=new Uint8Array(8);return new DataView(Q.buffer).setBigUint64(0,BigInt(Z),!1),await this.#Y(W$(J,Q))}async#X($,Z){let J=await this.#K($,Z);return this.#$.deriveEd25519KeyPair(J)}async#F($,Z,J){let Q=await this.#X($,Z);return this.#$.signEd25519(J,Q.privateKey)}async#N($,Z,J){let Q=await this.#X($,Z),V=W$(Q.privateKey,J);return(await this.#$.blake3(V)).slice(0,T0)}}async function a$($,Z){if(Z.byteLength<dV)return G(10);let J=await $.blake3(W$(Z,nV));return R(J.slice(0,cV))}class sZ{db;constructor($){this.db=$}async enq($){let Z=[...$];if(Z.length===0)return;let J=this.db.transaction(W0,"readwrite"),Q=J.objectStore(W0);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error);for(let X of Z){let W=`${X.host}:${X.seq}`;Q.put(X,W)}})}async deq($,Z){let J=[...Z];if(J.length===0)return;let Q=this.db.transaction(W0,"readwrite"),V=Q.objectStore(W0);return new Promise((Y,X)=>{Q.oncomplete=()=>Y(),Q.onerror=()=>X(Q.error);for(let W of J){let z=`${$}:${W}`;V.delete(z)}})}async list(){let Z=this.db.transaction(W0,"readonly").objectStore(W0);return new Promise((J,Q)=>{let V=Z.getAll();V.onsuccess=()=>J(V.result),V.onerror=()=>Q(V.error)})}async count(){let Z=this.db.transaction(W0,"readonly").objectStore(W0);return new Promise((J,Q)=>{let V=Z.count();V.onsuccess=()=>J(V.result),V.onerror=()=>Q(V.error)})}async wipe(){let $=this.db.transaction(W0,"readwrite"),Z=$.objectStore(W0);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.clear()})}}function wQ($){return{label:$.label,handle:new URL($.handle),idx:$.idx,lastSeq:$.lastSeq||0,clockOffset:$.clockOffset,subscription:$.subscription}}function rV($,Z){let J={...$};if(Z.setLastSeq!==void 0)J.lastSeq=Z.setLastSeq;else if(Z.lastSeq!==void 0){let Q=J.lastSeq||0;if(Z.lastSeq>Q)J.lastSeq=Z.lastSeq}return delete J.numBags,delete J.numDupes,J}class tZ{db;constructor($){this.db=$}async add($){return this.put({...$,lastSeq:0})}async put($){let Z={...$,handle:$.handle.toString(),lastSeq:$.lastSeq??0},J=this.db.transaction(Z0,"readwrite"),Q=J.objectStore(Z0);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error),Q.put(Z)})}async touch($,Z){return this.recordStats($,{lastSeq:Z})}async recordStats($,Z){let J=this.db.transaction(Z0,"readwrite"),Q=J.objectStore(Z0);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error);let X=Q.get($);X.onsuccess=()=>{let W=X.result;if(!W)return;Q.put(rV(W,Z))}})}async get($){let J=this.db.transaction(Z0,"readonly").objectStore(Z0);return new Promise((Q,V)=>{let Y=J.get($);Y.onsuccess=()=>{let X=Y.result;if(!X)Q(void 0);else Q(wQ(X))},Y.onerror=()=>V(Y.error)})}async set($,Z){let J=await this.get($);if(!J)return 13;try{return await this.put({...J,...Z}),0}catch{return 18}}async del($){let Z=this.db.transaction(Z0,"readwrite"),J=Z.objectStore(Z0);return new Promise((Q,V)=>{Z.oncomplete=()=>Q(),Z.onerror=()=>V(Z.error),J.delete($)})}async list(){let Z=this.db.transaction(Z0,"readonly").objectStore(Z0);return new Promise((J,Q)=>{let V=Z.getAll();V.onsuccess=()=>{let Y=V.result;J(Y.map(wQ))},V.onerror=()=>Q(V.error)})}async wipe(){let $=this.db.transaction(Z0,"readwrite"),Z=$.objectStore(Z0);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.clear()})}}class eZ{crypto;db;constructor($,Z){this.crypto=Z;this.db=$}async add($){let Z=this.db.transaction(u,"readwrite"),J=Z.objectStore(u);return new Promise((Q)=>{if($.length===0){Q([]);return}let V=Array($.length).fill(0);Z.oncomplete=()=>Q(V),Z.onerror=()=>{for(let Y=0;Y<V.length;Y++)V[Y]=18;Q(V)};for(let Y=0;Y<$.length;Y++){let{key:X,data:W}=$[Y],z=f(X),K=J.put(W,z);K.onerror=(F)=>{F.preventDefault(),V[Y]=18}}})}async del($){let Z=[...$];if(Z.length===0)return;let J=this.db.transaction(u,"readwrite"),Q=J.objectStore(u);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error);for(let X of Z){let W=f(X);Q.delete(W)}})}async get($){let J=this.db.transaction(u,"readonly").objectStore(u);return new Promise((Q,V)=>{let Y=f($),X=J.get(Y);X.onsuccess=async()=>{let W=X.result;if(W)Q(await v$($,W,this.crypto));else Q(void 0)},X.onerror=()=>V(X.error)})}async has($){return await this.get($)!==void 0}async list($){let Z=$?.apld,J=$?.body!==!1,V=this.db.transaction(u,"readonly").objectStore(u);return new Promise((Y,X)=>{let W=[],z=Z===void 0?V.openCursor():V.index(q$).openCursor(IDBKeyRange.only(Z));z.onsuccess=(K)=>{let F=K.target.result;if(F){let N=Z===void 0?F.key:F.primaryKey,U=F.value;W.push({hash:F0(N),data:U}),F.continue()}else Promise.all(W.map(({hash:N,data:U})=>v$(N,U,this.crypto,{body:J}))).then(Y).catch(X)},z.onerror=()=>X(z.error)})}async count($){let J=this.db.transaction(u,"readonly").objectStore(u);return new Promise((Q,V)=>{let Y=$===void 0?J.count():J.index(q$).count(IDBKeyRange.only($));Y.onsuccess=()=>Q(Y.result),Y.onerror=()=>V(Y.error)})}async listKeys(){let Z=this.db.transaction(u,"readonly").objectStore(u);return new Promise((J,Q)=>{let V=[],Y=Z.openKeyCursor();Y.onsuccess=(X)=>{let W=X.target.result;if(W)V.push(F0(W.key)),W.continue();else J(V)},Y.onerror=()=>Q(Y.error)})}async last($){let J=this.db.transaction(u,"readonly").objectStore(u);return new Promise((Q,V)=>{let Y,X=J.openCursor();X.onsuccess=async(W)=>{let z=W.target.result;if(z){let{key:K,value:F}=z;if(V0($,F.eid)){if(!Y||(F.ctr??0)>(Y.data.ctr??0)||(F.ctr??0)===(Y.data.ctr??0)&&(F.off??0)>(Y.data.off??0))Y={key:K,data:F}}z.continue()}else if(Y){let K=F0(Y.key);Q(await v$(K,Y.data,this.crypto))}else Q(void 0)},X.onerror=()=>V(X.error)})}async markApplied($){let Z=[...$];if(Z.length===0)return;let J=this.db.transaction(u,"readwrite"),Q=J.objectStore(u);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error);for(let X of Z){let W=f(X),z=Q.get(W);z.onsuccess=()=>{let K=z.result;if(!K)return;jZ(K,S$),Q.put(K,W)},z.onerror=(K)=>{K.preventDefault()}}})}async markFailed($){let Z=[...$];if(Z.length===0)return;let J=this.db.transaction(u,"readwrite"),Q=J.objectStore(u);return new Promise((V,Y)=>{J.oncomplete=()=>V(),J.onerror=()=>Y(J.error);for(let{key:X,err:W}of Z){let z=f(X),K=Q.get(z);K.onsuccess=()=>{let F=K.result;if(!F)return;jZ(F,a0,W),Q.put(F,z)},K.onerror=(F)=>{F.preventDefault()}}})}async wipe(){let $=this.db.transaction(u,"readwrite"),Z=$.objectStore(u);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.clear()})}}class $J{#J;#$;#Z;#V;#Q;constructor($){if(this.#J=$.crypto,this.#Q=$.persistMeta,this.#V={rpId:$.rpId,rpName:$.rpName},$.meta!==void 0)this.#Z=J$($.meta)}get meta(){return this.#Z===void 0?void 0:J$(this.#Z)}setMeta($){this.#Z=$===void 0?void 0:J$($)}async save($,Z){if(Z?.persist===!0)return Promise.reject(Error("prf-store: use wrapAndSave(enclave) to persist sealed master"));return this.#$=$,this.#$}async wrapAndSave($,Z){let[J,Q]=await $.sealWithPasskey({...this.#V,salt:Z?.salt,credId:Z?.credId??this.#Z?.credId,createCredIfNeeded:Z?.createCredIfNeeded??Z?.credId===void 0,userName:"diplomatic-prf"});if(Q!==0)return G(Q);if(J===void 0)return G(12);let V={sealedMaster:J.sealedMaster,salt:J.salt,credId:J.credId};return this.#Z=V,this.#$=$,await this.#Q(J$(V)),R(this.#$)}async load(){return this.#$}async unlock(){let $=this.#Z;if($===void 0)return G(22);let[Z,J]=await $0.unsealWithPasskey(this.#J,$.sealedMaster,{...this.#V,salt:$.salt,credId:$.credId});if(J!==0)return G(J);if(Z===void 0)return G(12);return this.#$=Z,R(Z)}async adoptSealed($,Z){return this.#Z=J$(Z),this.#$=$,await this.#Q(J$(Z)),R(this.#$)}async wipe(){this.#$=void 0,this.#Z=void 0,await this.#Q(void 0)}}function J$($){let[Z,J]=j0($.sealedMaster.slice());return{sealedMaster:J===0&&Z!==void 0?Z:$.sealedMaster,salt:$.salt.slice(),credId:$.credId===void 0?void 0:$.credId.slice()}}var ZJ="seed",s$="prfMeta";class JJ{enclave;db;#J;constructor($,Z){this.db=$,this.#J=Z}async save($,Z){return this.enclave=$,this.enclave}async load(){if(this.enclave)return this.enclave;let $=await this.#$();if($===void 0||$==="")return;let Z=D$($),[J,Q]=$0.fromBytes(this.#J,Z);if(Z.fill(0),await this.#Z(),Q!==0||J===void 0)return;return this.enclave=J,this.enclave}async clearSession(){this.enclave=void 0,await this.#Z()}async wipe(){this.enclave=void 0;let $=this.db.transaction(G0,"readwrite"),Z=$.objectStore(G0);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.delete(ZJ),Z.delete(s$)})}async loadPrfMeta(){let Z=this.db.transaction(G0,"readonly").objectStore(G0);return new Promise((J,Q)=>{let V=Z.get(s$);V.onsuccess=()=>{J(oV(V.result))},V.onerror=()=>Q(V.error)})}async persistPrfMeta($){let Z=this.db.transaction(G0,"readwrite"),J=Z.objectStore(G0);return new Promise((Q,V)=>{if(Z.oncomplete=()=>Q(),Z.onerror=()=>V(Z.error),$===void 0){J.delete(s$);return}let Y={sealedMaster:$.sealedMaster.slice(),salt:$.salt.slice(),credId:$.credId===void 0?void 0:$.credId.slice()};J.put(Y,s$)})}async hasPrfMeta(){return await this.loadPrfMeta()!==void 0}async openPrfStore($){let Z=await this.loadPrfMeta();return new $J({crypto:$.crypto??this.#J,rpId:$.rpId,rpName:$.rpName,meta:Z,persistMeta:(J)=>this.persistPrfMeta(J)})}#$(){let Z=this.db.transaction(G0,"readonly").objectStore(G0);return new Promise((J,Q)=>{let V=Z.get(ZJ);V.onsuccess=()=>{let Y=V.result;J(typeof Y==="string"&&Y.length>0?Y:void 0)},V.onerror=()=>Q(V.error)})}#Z(){let $=this.db.transaction(G0,"readwrite"),Z=$.objectStore(G0);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.delete(ZJ)})}}function oV($){if($===void 0||$===null||typeof $!=="object")return;let Z=$;if(!(Z.sealedMaster instanceof Uint8Array)||!(Z.salt instanceof Uint8Array))return;let[J,Q]=j0(Z.sealedMaster);if(Q!==0||J===void 0)return;return{sealedMaster:J,salt:Z.salt.slice(),credId:Z.credId instanceof Uint8Array?Z.credId.slice():void 0}}class QJ{db;constructor($){this.db=$}async enq($,Z){let J=[...Z];if(J.length===0)return;let Q=this.db.transaction(z0,"readwrite"),V=Q.objectStore(z0);return new Promise((Y,X)=>{Q.oncomplete=()=>Y(),Q.onerror=()=>X(Q.error);for(let W of J){let z=N0(W);V.put({host:$,hash:z})}})}async deq($,Z){let J=[...Z];if(J.length===0)return;let Q=this.db.transaction(z0,"readwrite"),V=Q.objectStore(z0);return new Promise((Y,X)=>{Q.oncomplete=()=>Y(),Q.onerror=()=>X(Q.error);for(let W of J){let z=N0(W);V.delete([$,z])}})}async list($){let J=this.db.transaction(z0,"readonly").objectStore(z0);return new Promise((Q,V)=>{let Y=J.getAll();Y.onsuccess=()=>{let W=Y.result.filter((z)=>z.host===$).map((z)=>z.hash);Q(W.map((z)=>D$(z)))},Y.onerror=()=>V(Y.error)})}async count(){let Z=this.db.transaction(z0,"readonly").objectStore(z0);return new Promise((J,Q)=>{let V=Z.count();V.onsuccess=()=>J(V.result),V.onerror=()=>Q(V.error)})}async wipe(){let $=this.db.transaction(z0,"readwrite"),Z=$.objectStore(z0);return new Promise((J,Q)=>{$.oncomplete=()=>J(),$.onerror=()=>Q($.error),Z.clear()})}}var G0="seedMeta",Z0="hosts",z0="uploadQueue",W0="downloadQueue",u="messages",q$="apld",TQ=3,DQ="diplomatic-store-db";class jQ{seed;hosts;uploads;downloads;messages;db;constructor($,Z){this.db=$,this.seed=new JJ($,Z),this.hosts=new tZ($),this.uploads=new QJ($),this.downloads=new sZ($),this.messages=new eZ($,Z)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function aV(){return new Promise(($,Z)=>{let J=indexedDB.open(DQ,TQ);J.onupgradeneeded=()=>{let{result:Q,transaction:V}=J;if(!Q.objectStoreNames.contains(G0))Q.createObjectStore(G0);if(!Q.objectStoreNames.contains(Z0))Q.createObjectStore(Z0,{keyPath:"label"});if(!Q.objectStoreNames.contains(z0))Q.createObjectStore(z0,{keyPath:["host","hash"]});if(!Q.objectStoreNames.contains(W0))Q.createObjectStore(W0);let Y;if(!Q.objectStoreNames.contains(u))Y=Q.createObjectStore(u);else{if(!V)throw Error("missing upgrade transaction for messages store");Y=V.objectStore(u)}if(!Y.indexNames.contains(q$))Y.createIndex(q$,"apld",{unique:!1})},J.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${DQ} → v${TQ}); waiting for other connections to close`)},J.onsuccess=()=>{let Q=J.result;Q.onversionchange=()=>{Q.close()},$(Q)},J.onerror=()=>Z(J.error??Error("protocol store IndexedDB open failed"))})}async function AQ($){let Z=await aV();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((J)=>{setTimeout(()=>J(!1),2000)})])}catch{}return new jQ(Z,$)}class VJ{client;entDB;post;whenReady;resolveReady;rejectReady;constructor($){this.post=$,this.whenReady=new Promise((Z,J)=>{this.resolveReady=Z,this.rejectReady=J})}async init(){try{let $=await AQ(U$),Z=await vJ({cache:!1}),J=new k$(Z.apply,()=>Z.clear(),(Y)=>{if(Y.length<1)return;this.post({kind:"dirty",eids:Y.map((X)=>X.slice())})}),Q=J.clear;J.clear=async()=>{let Y=await Q();if(Y===0)this.post({kind:"wiped"});return Y};let V=new kZ(new XZ,J,$,_J,U$);this.client=V,this.entDB=Z,V.clientState.listen(()=>{this.emitClientState()}),V.xferState.listen(()=>{this.emitXferState()}),await this.emitClientState(),await this.emitXferState(),this.post({kind:"ready"}),this.markReady()}catch($){let Z=$ instanceof Error?$:Error(String($));throw this.post({kind:"initError",message:Z.message}),this.failReady(Z),Z}}markReady(){let $=this.resolveReady;if(this.resolveReady=void 0,this.rejectReady=void 0,$)$()}failReady($){let Z=this.rejectReady;if(this.resolveReady=void 0,this.rejectReady=void 0,Z)Z($)}requireClient(){if(!this.client)throw Error("WorkerRuntime not initialized");return this.client}async emitClientState(){let $=this.client;if(!$)return;let Z=await $.clientState.get();this.post({kind:"clientState",state:Z})}async emitXferState(){let $=this.client;if(!$)return;let Z=await $.xferState.get();this.post({kind:"xferState",state:Z})}hostFromSerialized($){return{handle:new URL($.handle),label:$.label,idx:$.idx}}async handle($){await this.whenReady;let Z=this.requireClient();switch($.op){case"ping":return"pong";case"setSeed":{let[J,Q]=$0.fromBytes(U$,$.seed);if(Q!==0||J===void 0)throw new K0(Q);await Z.setSeed(J,{persist:$.persist});return}case"link":{await Z.link(this.hostFromSerialized($.host),$.connect??!0);return}case"unlink":{await Z.unlink($.label);return}case"connect":{await Z.connect($.listen??!0,$.sync??!0);return}case"disconnect":{await Z.disconnect();return}case"sync":return await Z.sync();case"rebuild":return await Z.rebuild({checkHost:$.checkHost??!0});case"reconcile":{let[J,Q]=await Z.reconcile($.hostLabel,{pull:$.pull,push:$.push,sync:$.sync});if(Q!==0)throw new K0(Q);if(!J)throw new K0(12);return J}case"msgcheck":return await Z.msgcheck();case"entcheck":{let J=this.entDB;if(!J)throw new K0(12);let[Q,V]=await J.checksum(U$);if(V!==0)throw new K0(V);if(!Q)throw new K0(12);return Q}case"wipe":{await Z.wipe({msgs:$.msgs,ents:$.ents,meta:$.meta,seed:$.seed});return}case"import":{let J=$.bytes.slice(),Q=new Blob([J]),V=new File([Q],"import.dip");return await Z.import(V)}case"export":{let[J,Q]=await Z.exportBytes();if(Q!==0)throw new K0(Q);if(!J)throw new K0(12);return J}case"getClientState":return await Z.clientState.get();case"getXferState":return await Z.xferState.get();default:{let J=$;throw Error("unknown worker command")}}}}class K0 extends Error{status;constructor($){super(`WorkerStatusError: ${j[$]}`);this.status=$;this.name="WorkerStatusError"}}function t$($,Z){return{kind:"reply",id:$,ok:!0,result:Z}}function YJ($,Z){return{kind:"reply",id:$,ok:!1,status:Z}}var A0=globalThis,_Q=new VJ(($,Z)=>{if(Z&&Z.length>0)A0.postMessage($,Z);else A0.postMessage($)});A0.onmessage=($)=>{let Z=$.data;if(!zJ(Z))return;sV(Z)};async function sV($){try{let Z=await _Q.handle($);if(($.op==="export"||$.op==="msgcheck"||$.op==="entcheck")&&Z instanceof Uint8Array){let J=Z.slice();A0.postMessage(t$($.id,J),[J.buffer]);return}if($.op==="reconcile"&&Z&&typeof Z==="object"&&"msgcheck"in Z&&Z.msgcheck instanceof Uint8Array){let J=Z.msgcheck.slice(),Q={...Z,msgcheck:J};A0.postMessage(t$($.id,Q),[J.buffer]);return}A0.postMessage(t$($.id,Z))}catch(Z){if(Z instanceof K0){A0.postMessage(YJ($.id,Z.status));return}console.error("worker command failed",Z),A0.postMessage(YJ($.id,12))}}_Q.init().catch(($)=>{console.error("worker init failed",$)});\n';var zn;function K0(){if(zn!==void 0)return zn;if(typeof gn!=="string"||gn.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");let i=new Blob([gn],{type:"text/javascript"});return zn=URL.createObjectURL(i),zn}function Bt(){if(typeof Worker>"u")throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Worker(K0(),{type:"module"})}var G0=new TextEncoder().encode("diplomatic.wrap.v1"),o0=32,m0=16;class s{#n;#i;constructor(i,r){this.#n=i,this.#i=r}static async fromRandom(i){let r=await i.gen256BitSecureRandomSeed(),[n,e]=ii(r);if(e!==0||n===void 0)throw Error(`enclave: invalid random seed (${e})`);return new s(n,i)}static fromBytes(i,r){let[n,e]=ii(r);if(e!==0)return l(e);if(n===void 0)return l(10);let[t,$]=ii(n.slice());if($!==0)return l($);if(t===void 0)return l(10);return u(new s(t,i))}async sealWithPasskey(i){let r=i?.salt??Mr,n=i?.credId;if(n===void 0&&i?.createCredIfNeeded===!0){let[$,f]=await Fe({rpId:i?.rpId,rpName:i?.rpName,userName:i?.userName??"diplomatic-prf"});if(f!==0)return l(f);if($===void 0)return l(24);if(!$.prfEnabled)return l(24);n=$.credId}let[e,t]=await Vr({rpId:i?.rpId,rpName:i?.rpName,credId:n,salt:r});if(t!==0)return l(t);if(e===void 0)return l(7);try{let[$,f]=await this.#r(e.prf);if(f!==0)return l(f);if($===void 0)return l(12);return u({sealedMaster:$,salt:r.slice(),credId:e.credId.slice()})}finally{e.prf.fill(0)}}static async unsealWithPasskey(i,r,n){let[e,t]=await Vr({rpId:n.rpId,rpName:n.rpName,credId:n.credId,salt:n.salt});if(t!==0)return l(t);if(e===void 0)return l(7);try{return await s.#e(i,r,e.prf)}finally{e.prf.fill(0)}}async persistToLargeBlob(i=[],r){let n=r?.credId;if(n===void 0){let[$,f]=await Wn(r);if(f!==0)return l(f);if($===void 0)return l(24);n=$}let[e,t]=this.#t(i);if(t!==0)return l(t);if(e===void 0)return l(12);try{let $=await Cr(n,e,r);if($!==0)return l($);return u(n)}finally{e.fill(0)}}static async fromLargeBlob(i,r){let[n,e]=await In(r?.credId,r);if(e!==0)return l(e);if(n===void 0)return l(7);try{return s.#Z(i,n.blob,n.credId)}finally{n.blob.fill(0)}}static async clearLargeBlob(i,r){return Cr(i,new Uint8Array(ui),r)}async sealPairPackageBody(i,r){let n=r?.salt??Mr,[e,t]=await Vr({rpId:r?.rpId,rpName:r?.rpName,credId:r?.credId,salt:n});if(t!==0)return l(t);if(e===void 0)return l(7);try{let[$,f]=await Hr(this.#i,e.prf);if(f!==0)return l(f);if($===void 0)return l(12);let[Z,J]=ii(this.#n.slice());if(J!==0)return l(J);if(Z===void 0)return l(10);let h={masterSeed:Z,hosts:i.map((X)=>({handle:X.handle,label:X.label,idx:X.idx??0}))},Q=new O,w=Q.writeStruct(yr,h);if(w!==0)return Z.fill(0),l(w);let V=Q.result();Z.fill(0);let Y;try{Y=await this.#i.encryptXSalsa20Poly1305Combined(V,$)}catch{return V.fill(0),l(12)}return V.fill(0),u({body:Y,salt:n.slice(),credId:e.credId.slice()})}finally{e.prf.fill(0)}}static async openPairPackageBody(i,r,n){let[e,t]=await Vr({rpId:n.rpId,rpName:n.rpName,credId:n.credId,salt:n.salt});if(t!==0)return l(t);if(e===void 0)return l(7);try{let[$,f]=await Hr(i,e.prf);if(f!==0)return l(f);if($===void 0)return l(12);let Z;try{Z=await i.decryptXSalsa20Poly1305Combined(r,$)}catch{return l(20)}let J=new N(Z),[h,Q]=J.readStruct(yr);if(Z.fill(0),Q!==0)return l(Q);if(h===void 0)return l(14);let[w,V]=s.fromBytes(i,h.masterSeed);if(h.masterSeed.fill(0),V!==0)return l(V);if(w===void 0)return l(12);let[Y,X]=await w.#r(e.prf);if(X!==0)return l(X);if(Y===void 0)return l(12);return u({enclave:w,hosts:h.hosts.map((c)=>({...c})),sealedMaster:Y,credId:e.credId.slice()})}finally{e.prf.fill(0)}}spawnSyncWorker(i){let r=Bt(),n=this.#n.slice();return r.postMessage({id:i.id,op:"setSeed",seed:n,persist:i.persist},[n.buffer]),r}deriveCipher(i,r){let n=i.slice(),e=(f)=>this.#l(n,f),t=(f)=>this.#J(n,f);return{encrypt:Object.freeze({encrypt:e}),decrypt:Object.freeze({decrypt:t}),both:Object.freeze({encrypt:e,decrypt:t})}[r]}async deriveIdentity(i,r=0){let n=i,e=r,t=await this.#f(n,e);return Object.freeze({publicKey:t.publicKey,sign:($)=>this.#Q(n,e,$),kdmFor:($)=>this.#w(n,e,$)})}async#r(i){let[r,n]=await Hr(this.#i,i);if(n!==0)return l(n);if(r===void 0)return l(12);try{let e=await this.#i.encryptXSalsa20Poly1305Combined(this.#n,r);return gi(e)}catch{return l(12)}}static async#e(i,r,n){let[,e]=gi(r);if(e!==0)return l(e);let[t,$]=await Hr(i,n);if($!==0)return l($);if(t===void 0)return l(12);try{let f=await i.decryptXSalsa20Poly1305Combined(r,t);return s.fromBytes(i,f)}catch{return l(20)}}#t(i){let[r,n]=ii(this.#n.slice());if(n!==0)return l(n);if(r===void 0)return l(10);let[e,t]=ae(r,i);if(t!==0)return r.fill(0),l(t);if(e===void 0)return r.fill(0),l(12);r.fill(0);let $=new O,f=$.writeStruct(Xn,e);if(e.masterSeed.fill(0),f!==0)return l(f);return u($.result())}static#Z(i,r,n){if(r.byteLength===0||r.every((J)=>J===0))return l(22);if(r.byteLength===ui){let[J,h]=s.fromBytes(i,r);if(h!==0)return l(h);if(J===void 0)return l(12);return u({enclave:J,hosts:[],credId:n})}let e=new N(r),[t,$]=e.readStruct(Xn);if($!==0)return l($);if(t===void 0)return l(14);let[f,Z]=s.fromBytes(i,t.masterSeed);if(t.masterSeed.fill(0),Z!==0)return l(Z);if(f===void 0)return l(12);return u({enclave:f,hosts:t.hosts.map((J)=>({...J})),credId:n})}async#l(i,r){let n=await this.#$(i);return this.#i.encryptXSalsa20Poly1305Combined(r,n)}async#J(i,r){let n=await this.#$(i);return this.#i.decryptXSalsa20Poly1305Combined(r,n)}async#$(i){return this.#i.blake3(zr(this.#n,i))}async#h(i,r){let n=new TextEncoder().encode(i),e=new Uint8Array(8);return new DataView(e.buffer).setBigUint64(0,BigInt(r),!1),await this.#$(zr(n,e))}async#f(i,r){let n=await this.#h(i,r);return this.#i.deriveEd25519KeyPair(n)}async#Q(i,r,n){let e=await this.#f(i,r);return this.#i.signEd25519(n,e.privateKey)}async#w(i,r,n){let e=await this.#f(i,r),t=zr(e.privateKey,n);return(await this.#i.blake3(t)).slice(0,Ri)}}async function Hr(i,r){if(r.byteLength<m0)return l(10);let n=await i.blake3(zr(r,G0));return u(n.slice(0,o0))}class Un{#n;#i;#r;#e;#t;constructor(i){if(this.#n=i.crypto,this.#t=i.persistMeta,this.#e={rpId:i.rpId,rpName:i.rpName},i.meta!==void 0)this.#r=Yr(i.meta)}get meta(){return this.#r===void 0?void 0:Yr(this.#r)}setMeta(i){this.#r=i===void 0?void 0:Yr(i)}async save(i,r){if(r?.persist===!0)return Promise.reject(Error("prf-store: use wrapAndSave(enclave) to persist sealed master"));return this.#i=i,this.#i}async wrapAndSave(i,r){let[n,e]=await i.sealWithPasskey({...this.#e,salt:r?.salt,credId:r?.credId??this.#r?.credId,createCredIfNeeded:r?.createCredIfNeeded??r?.credId===void 0,userName:"diplomatic-prf"});if(e!==0)return l(e);if(n===void 0)return l(12);let t={sealedMaster:n.sealedMaster,salt:n.salt,credId:n.credId};return this.#r=t,this.#i=i,await this.#t(Yr(t)),u(this.#i)}async load(){return this.#i}async unlock(){let i=this.#r;if(i===void 0)return l(22);let[r,n]=await s.unsealWithPasskey(this.#n,i.sealedMaster,{...this.#e,salt:i.salt,credId:i.credId});if(n!==0)return l(n);if(r===void 0)return l(12);return this.#i=r,u(r)}async adoptSealed(i,r){return this.#r=Yr(r),this.#i=i,await this.#t(Yr(r)),u(this.#i)}async wipe(){this.#i=void 0,this.#r=void 0,await this.#t(void 0)}}function Yr(i){let[r,n]=gi(i.sealedMaster.slice());return{sealedMaster:n===0&&r!==void 0?r:i.sealedMaster,salt:i.salt.slice(),credId:i.credId===void 0?void 0:i.credId.slice()}}var Re="seed",Kn="prfMeta";class Gn{enclave;db;#n;constructor(i,r){this.db=i,this.#n=r}async save(i,r){return this.enclave=i,this.enclave}async load(){if(this.enclave)return this.enclave;let i=await this.#i();if(i===void 0||i==="")return;let r=Oi(i),[n,e]=s.fromBytes(this.#n,r);if(r.fill(0),await this.#r(),e!==0||n===void 0)return;return this.enclave=n,this.enclave}async clearSession(){this.enclave=void 0,await this.#r()}async wipe(){this.enclave=void 0;let i=this.db.transaction(hi,"readwrite"),r=i.objectStore(hi);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.delete(Re),r.delete(Kn)})}async loadPrfMeta(){let r=this.db.transaction(hi,"readonly").objectStore(hi);return new Promise((n,e)=>{let t=r.get(Kn);t.onsuccess=()=>{n(a0(t.result))},t.onerror=()=>e(t.error)})}async persistPrfMeta(i){let r=this.db.transaction(hi,"readwrite"),n=r.objectStore(hi);return new Promise((e,t)=>{if(r.oncomplete=()=>e(),r.onerror=()=>t(r.error),i===void 0){n.delete(Kn);return}let $={sealedMaster:i.sealedMaster.slice(),salt:i.salt.slice(),credId:i.credId===void 0?void 0:i.credId.slice()};n.put($,Kn)})}async hasPrfMeta(){return await this.loadPrfMeta()!==void 0}async openPrfStore(i){let r=await this.loadPrfMeta();return new Un({crypto:i.crypto??this.#n,rpId:i.rpId,rpName:i.rpName,meta:r,persistMeta:(n)=>this.persistPrfMeta(n)})}#i(){let r=this.db.transaction(hi,"readonly").objectStore(hi);return new Promise((n,e)=>{let t=r.get(Re);t.onsuccess=()=>{let $=t.result;n(typeof $==="string"&&$.length>0?$:void 0)},t.onerror=()=>e(t.error)})}#r(){let i=this.db.transaction(hi,"readwrite"),r=i.objectStore(hi);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.delete(Re)})}}function a0(i){if(i===void 0||i===null||typeof i!=="object")return;let r=i;if(!(r.sealedMaster instanceof Uint8Array)||!(r.salt instanceof Uint8Array))return;let[n,e]=gi(r.sealedMaster);if(e!==0||n===void 0)return;return{sealedMaster:n,salt:r.salt.slice(),credId:r.credId instanceof Uint8Array?r.credId.slice():void 0}}class Ne{db;constructor(i){this.db=i}async enq(i,r){let n=[...r];if(n.length===0)return;let e=this.db.transaction(Qi,"readwrite"),t=e.objectStore(Qi);return new Promise(($,f)=>{e.oncomplete=()=>$(),e.onerror=()=>f(e.error);for(let Z of n){let J=fi(Z);t.put({host:i,hash:J})}})}async deq(i,r){let n=[...r];if(n.length===0)return;let e=this.db.transaction(Qi,"readwrite"),t=e.objectStore(Qi);return new Promise(($,f)=>{e.oncomplete=()=>$(),e.onerror=()=>f(e.error);for(let Z of n){let J=fi(Z);t.delete([i,J])}})}async list(i){let n=this.db.transaction(Qi,"readonly").objectStore(Qi);return new Promise((e,t)=>{let $=n.getAll();$.onsuccess=()=>{let Z=$.result.filter((J)=>J.host===i).map((J)=>J.hash);e(Z.map((J)=>Oi(J)))},$.onerror=()=>t($.error)})}async count(){let r=this.db.transaction(Qi,"readonly").objectStore(Qi);return new Promise((n,e)=>{let t=r.count();t.onsuccess=()=>n(t.result),t.onerror=()=>e(t.error)})}async wipe(){let i=this.db.transaction(Qi,"readwrite"),r=i.objectStore(Qi);return new Promise((n,e)=>{i.oncomplete=()=>n(),i.onerror=()=>e(i.error),r.clear()})}}var hi="seedMeta",ti="hosts",Qi="uploadQueue",Ji="downloadQueue",p="messages",Nr="apld",_t=3,St="diplomatic-store-db";class Oe{seed;hosts;uploads;downloads;messages;db;constructor(i,r){this.db=i,this.seed=new Gn(i,r),this.hosts=new oe(i),this.uploads=new Ne(i),this.downloads=new Ge(i),this.messages=new me(i,r)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function d0(){return new Promise((i,r)=>{let n=indexedDB.open(St,_t);n.onupgradeneeded=()=>{let{result:e,transaction:t}=n;if(!e.objectStoreNames.contains(hi))e.createObjectStore(hi);if(!e.objectStoreNames.contains(ti))e.createObjectStore(ti,{keyPath:"label"});if(!e.objectStoreNames.contains(Qi))e.createObjectStore(Qi,{keyPath:["host","hash"]});if(!e.objectStoreNames.contains(Ji))e.createObjectStore(Ji);let $;if(!e.objectStoreNames.contains(p))$=e.createObjectStore(p);else{if(!t)throw Error("missing upgrade transaction for messages store");$=t.objectStore(p)}if(!$.indexNames.contains(Nr))$.createIndex(Nr,"apld",{unique:!1})},n.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${St} → v${_t}); waiting for other connections to close`)},n.onsuccess=()=>{let e=n.result;e.onversionchange=()=>{e.close()},i(e)},n.onerror=()=>r(n.error??Error("protocol store IndexedDB open failed"))})}async function on(i){let r=await d0();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((n)=>{setTimeout(()=>n(!1),2000)})])}catch{}return new Oe(r,i)}function Et(i){if(!i||typeof i!=="object")return!1;if(!("kind"in i))return!1;return typeof i.kind==="string"}function vt(i){if(typeof i!=="number")return;return i}function bt(i){if(!i||typeof i!=="object")return;if(!("hasSeed"in i)||!("hasHost"in i)||!("connected"in i))return;if(typeof i.hasSeed!=="boolean"||typeof i.hasHost!=="boolean"||typeof i.connected!=="boolean")return;return{hasSeed:i.hasSeed,hasHost:i.hasHost,connected:i.connected}}function F0(i){if(!i||typeof i!=="object")return;if(!("phase"in i))return;let r=R0(i.phase);if(r===void 0)return;let n={phase:r};if("host"in i&&typeof i.host==="string")n.host=i.host;if("done"in i&&typeof i.done==="number")n.done=i.done;if("total"in i&&typeof i.total==="number")n.total=i.total;if("bytesDone"in i&&typeof i.bytesDone==="number")n.bytesDone=i.bytesDone;if("bytesTotal"in i&&typeof i.bytesTotal==="number")n.bytesTotal=i.bytesTotal;return n}function R0(i){if(i==="peek"||i==="pull"||i==="open"||i==="exec"||i==="push"||i==="import"||i==="idle"||i==="apply")return i==="apply"?"exec":i;return}function i$(i){if(!i||typeof i!=="object")return;if(!("numUploads"in i)||!("numDownloads"in i))return;if(typeof i.numUploads!=="number"||typeof i.numDownloads!=="number")return;let r={phase:"idle"};if("progress"in i){let n=F0(i.progress);if(n===void 0)return;r=n}return{numUploads:i.numUploads,numDownloads:i.numDownloads,progress:r}}var wi="[DIPLOMATIC]";class Tr{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:pi};clientState;xferState;constructor(i,r,n,e,t){this.state=i,this.store=r,this.readyTimeoutMs=t,this.clientState=new Vi(async()=>this.cachedClientState),this.xferState=new Vi(async()=>this.cachedXferState),this.scheduledSync=new ar(e,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch($){console.error(`${wi} worker sync after local write failed`,$)}}),this.local=new ji(n,i,r,()=>{throw Error(`${wi} local writer has no transport (use worker for network)`)},mi,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.local.xferState.listen(($)=>{this.cachedXferState={numUploads:$.numUploads,numDownloads:$.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(i){let r=this.worker;if(r){r.onmessage=null,r.onerror=null,r.onmessageerror=null;try{r.terminate()}catch{}}this.worker=i,i.onmessage=(n)=>{this.onMessage(n.data)},i.onerror=(n)=>{console.error(`${wi} worker error`,n),this.failPending(Error(`${wi} worker failed to load`))},i.onmessageerror=()=>{this.failPending(Error(`${wi} worker message error`))}}failPending(i){for(let[,r]of this.pending)r.reject(i);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(i,r,n={}){let e=n.clock??new Ii,t=n.syncDebounceMs??$n,$=n.readyTimeoutMs??15000,f=new Tr(i,r,e,t,$);return await f.hydrateStateFromStore(r),f}async hydrateStateFromStore(i){let r=await i.seed.load(),n=await i.hosts.list();this.cachedClientState={hasSeed:r!==void 0,hasHost:Array.from(n).length>0,connected:!1};let e=await i.uploads.count(),t=await i.downloads.count();this.cachedXferState={numUploads:e,numDownloads:t,progress:pi}}async pullRemoteState(){let i=await this.request({id:this.allocId(),op:"getClientState"}),r=bt(i);if(r!==void 0)this.cachedClientState=r;let n=await this.request({id:this.allocId(),op:"getXferState"}),e=i$(n);if(e!==void 0)this.cachedXferState=e}requireWorker(){if(!this.worker)throw Error(`${wi} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${wi} worker ping failed`)}terminate(){this.scheduledSync.cancel();let i=this.worker;if(this.worker=void 0,i)try{i.terminate()}catch{}this.failPending(Error(`${wi} worker terminated`))}onMessage(i){if(!Et(i))return;let r=i;switch(r.kind){case"ready":return;case"initError":{this.failPending(Error(`${wi} worker init failed: ${r.message}`));return}case"clientState":{this.cachedClientState=r.state,this.clientState.emit();return}case"xferState":{this.cachedXferState=r.state,this.xferState.emit();return}case"dirty":{this.state.refresh(r.eids.map(O0));return}case"wiped":{this.state.clear();return}case"reply":{let n=this.pending.get(r.id);if(!n)return;if(this.pending.delete(r.id),r.ok)n.resolve(r.result);else n.reject(new Ar(r.status));return}default:return}}allocId(){let i=this.nextId;return this.nextId+=1,i}request(i,r){let n=this.requireWorker();return new Promise((e,t)=>{if(this.pending.set(i.id,{resolve:e,reject:t}),r&&r.length>0)n.postMessage(i,r);else n.postMessage(i)})}async requestStatus(i,r){try{let n=await this.request(i,r),e=vt(n);if(e!==void 0)return e;return 0}catch(n){if(n instanceof Ar)return n.status;return 12}}serializeHost(i){return{handle:i.handle.href,label:i.label,idx:i.idx??0}}async setSeed(i,r){await this.local.setSeed(i,r),this.cachedClientState={...this.cachedClientState,hasSeed:!0},this.clientState.emit();let n=this.allocId(),e=this.readyTimeoutMs;await new Promise((t,$)=>{let f,Z=(J)=>{if(f!==void 0)clearTimeout(f);J()};this.pending.set(n,{resolve:(J)=>Z(()=>t(J)),reject:(J)=>Z(()=>$(J))}),f=setTimeout(()=>{this.pending.delete(n),$(Error(`${wi} setSeed worker timeout after ${e}ms`))},e);try{let J=i.spawnSyncWorker({id:n,persist:r?.persist});this.bindWorker(J)}catch(J){if(this.pending.delete(n),f!==void 0)clearTimeout(f);$(J instanceof Error?J:Error(String(J)))}});try{await this.pullRemoteState()}catch{}}async link(i,r=!0){await this.local.link(i,!1),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(i),connect:r})}async unlink(i){if(await this.local.unlink(i),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:i})}async hosts(){return this.local.hosts()}async connect(i=!0,r=!0){await this.request({id:this.allocId(),op:"connect",listen:i,sync:r})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(i){return this.local.insertRaw(i)}async updateRaw(i,r,n){return this.local.updateRaw(i,r,n)}async insert(i){return this.local.insert(i)}async update(i){return this.local.update(i)}async delete(i){return this.local.delete(i)}async genEID(i){return this.local.genEID(i)}async sync(){return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(i){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:i?.checkHost})}async listMsgs(i){return this.local.listMsgs(i)}async countMsgs(i){return this.local.countMsgs(i)}async reconcile(i,r){try{let n=await this.request({id:this.allocId(),op:"reconcile",hostLabel:i,pull:r?.pull,push:r?.push,sync:r?.sync});if(!N0(n))return l(12);return u(n)}catch(n){if(n instanceof Ar&&n.status!==0)return l(n.status);return l(12)}}async msgcheck(){let i=await this.request({id:this.allocId(),op:"msgcheck"});if(!(i instanceof Uint8Array))throw Error(`${wi} msgcheck: expected Uint8Array`);return i}async entcheck(){let i=await this.request({id:this.allocId(),op:"entcheck"});if(!(i instanceof Uint8Array))throw Error(`${wi} entcheck: expected Uint8Array`);return i}async wipe(i){if(await this.local.wipe(i),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:i?.msgs,ents:i?.ents,meta:i?.meta,seed:i?.seed});await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(i){let r=new Uint8Array(await i.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:r},[r.buffer])}async export(i,r){try{let n=await this.request({id:this.allocId(),op:"export"});if(!(n instanceof Uint8Array))return 12;let e=new Blob([n.slice()]);return Zn(e,i),0}catch(n){if(n instanceof Ar)return n.status;return 12}}}class Ar extends Error{status;constructor(i){super(`WorkerReplyError: ${G[i]}`);this.status=i;this.name="WorkerReplyError"}}function N0(i){if(!i||typeof i!=="object")return!1;let r=i;return r.msgcheck instanceof Uint8Array&&r.msgcheck.length===32&&typeof r.numBags==="number"&&typeof r.numDupes==="number"}function O0(i){return i}var Xr="[DIPLOMATIC]";async function mn(i){let r=i.clock??new Ii;if(i.worker===!0&&y0(i)!==void 0)throw Error(`${Xr} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(i.worker!==!0){console.info(`${Xr} sync on main thread `+"(no worker — app did not request a worker)");let t=await r$(i.store);return P0(r,i.state,t)}if(typeof Worker>"u")throw Error(`${Xr} worker: true but Worker API is unavailable`);let n=await r$(void 0),e=await Tr.open(i.state,n,{readyTimeoutMs:i.readyTimeoutMs,clock:r,syncDebounceMs:i.syncDebounceMs});return console.info(`${Xr} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:e,mode:"worker",dispose:()=>{console.info(`${Xr} terminating sync worker`),e.terminate()}}}function y0(i){if("store"in i)return i.store;return}async function P0(i,r,n){let e=new ji(i,r,n,Er,mi);return{client:e,mode:"main",dispose:()=>{e.disconnect()}}}async function r$(i){if(i!==void 0)return i;if(typeof indexedDB>"u")throw Error(`${Xr} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return on(mi)}function q0(i){let[r,n]=ye();return an(()=>{async function e(){let $=await i.clientState.get();n($)}let t=i.clientState.listen(e);return e(),()=>{t()}},[i]),r}function C0(i){let[r,n]=ye();return an(()=>{async function e(){let $=await i.xferState.get();n($)}let t=i.xferState.listen(e);return e(),()=>{t()}},[i]),r}function M0(i){an(()=>{async function r(){try{await i.connect(),await i.sync()}catch($){console.error("reconnectAndSync failed",$)}}function n(){r()}function e(){if(typeof document<"u"&&document.visibilityState==="visible")r()}function t(){r()}if(globalThis.addEventListener("online",n),typeof document<"u")document.addEventListener("visibilitychange",e);return globalThis.addEventListener("focus",t),globalThis.addEventListener("pageshow",t),()=>{if(globalThis.removeEventListener("online",n),typeof document<"u")document.removeEventListener("visibilitychange",e);globalThis.removeEventListener("focus",t),globalThis.removeEventListener("pageshow",t)}},[i])}function H0(i={}){let r=i.clock??new Ii,{seed:n,host:e,readyTimeoutMs:t}=i,$=i.worker===!0,f="store"in i?i.store:void 0,[Z,J]=ye({stateMgr:Bn});return an(()=>{let h=!1,Q;return(async()=>{let w=await ie();if(h)return;let V=en(w),Y=$?await mn({state:V,clock:r,worker:!0,readyTimeoutMs:t}):await mn({state:V,clock:r,store:f,readyTimeoutMs:t});if(h){Y.dispose();return}Q=Y.dispose;let{client:X,mode:c}=Y;if(n)await X.setSeed(n);if(e)await X.link(e);if(h){Q();return}J({client:X,entDB:w,stateMgr:V,mode:c,error:void 0})})().catch((w)=>{let V=w instanceof Error?w:Error(String(w));if(console.error("[DIPLOMATIC] useClient init failed",V),!h)J((Y)=>({...Y,client:void 0,error:V}))}),()=>{h=!0,Q?.()}},[r,n,e,$,f,t]),Z}import{use as A0,useEffect as n$,useRef as T0,useState as D0}from"react";function e$(i,r,n){let[e,t]=D0();return n$(()=>{async function $(){let f=await n();t(f)}return $(),i.on(r,$),()=>{i.off(r,$)}},[i,r,n]),e}function p0(i,r,n){let e=T0(n());return n$(()=>{async function t(){e.current=n()}return i.on(r,t),()=>{i.off(r,t)}},[i,r,n]),A0(e.current)}function t$(i,r){return`${i}:${r}`}class Pe{queue=new Map;async enq(i){for(let r of i){let n=t$(r.host,r.seq);this.queue.set(n,r)}}async deq(i,r){for(let n of r){let e=t$(i,n);this.queue.delete(e)}}async list(){let i=[];for(let r of this.queue.values())i.push(r);return i}async count(){return this.queue.size}async wipe(){this.queue.clear()}}function x0(i,r){if(r.setLastSeq!==void 0)i.lastSeq=r.setLastSeq;else if(r.lastSeq!==void 0&&r.lastSeq>i.lastSeq)i.lastSeq=r.lastSeq}class qe{hosts=new Map;async add(i){let r={...i,lastSeq:0};this.hosts.set(i.label,r)}async touch(i,r){await this.recordStats(i,{lastSeq:r})}async recordStats(i,r){let n=this.hosts.get(i);if(!n)return;x0(n,r),this.hosts.set(i,{...n})}async get(i){return this.hosts.get(i)}async set(i,r){let n=this.hosts.get(i);if(!n)return 13;return this.hosts.set(i,{...n,...r}),0}async del(i){this.hosts.delete(i)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class Ce{crypto;messages=new Map;constructor(i){this.crypto=i}async add(i){let r=[];for(let{key:n,data:e}of i)this.messages.set(d(n),e),r.push(0);return r}async del(i){for(let r of i)this.messages.delete(d(r))}async get(i){let r=this.messages.get(d(i));if(r)return await Pi(i,r,this.crypto);return}async has(i){return this.messages.has(d(i))}async list(i){let r=i?.apld,n=i?.body!==!1,e=[];for(let[t,$]of this.messages){if(r!==void 0&&Jr($.apld)!==r)continue;let f=v(t);e.push(await Pi(f,$,this.crypto,{body:n}))}return e}async count(i){if(i===void 0)return this.messages.size;let r=0;for(let n of this.messages.values())if(Jr(n.apld)===i)r++;return r}async listKeys(){let i=[];for(let r of this.messages.keys())i.push(v(r));return i}async last(i){let r;for(let[n,e]of this.messages){if(b(i,e.eid)===!1)continue;let t=v(n);if(r===void 0)r={hash:t,data:e};else if((e.ctr??0)>(r.data.ctr??0)||(e.ctr??0)===(r.data.ctr??0)&&(e.off??0)>(r.data.off??0))r={hash:t,data:e}}if(r)return await Pi(r.hash,r.data,this.crypto);return}async markApplied(i){for(let r of i){let n=this.messages.get(d(r));if(!n)continue;xi(n,yi)}}async markFailed(i){for(let{key:r,err:n}of i){let e=this.messages.get(d(r));if(!e)continue;xi(e,Yi,n)}}async wipe(){this.messages.clear()}}class Me{enclave;async save(i,r){return this.enclave=i,this.enclave}async load(){return this.enclave}async wipe(){this.enclave=void 0}}class He{queue=new Map;async enq(i,r){let n=this.queue.get(i)||new Set;this.queue.set(i,n);for(let e of r)n.add(fi(e))}async deq(i,r){let n=this.queue.get(i);if(n)for(let e of r)n.delete(fi(e))}async list(i){let r=this.queue.get(i);if(!r)return[];let n=[];for(let e of r)n.push(Oi(e));return n}async count(){let i=0;for(let r of this.queue.values())i+=r.size;return i}async wipe(){this.queue.clear()}}class $${seed=new Me;hosts=new qe;uploads=new He;downloads=new Pe;messages;constructor(i){this.messages=new Ce(i)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class f${singletonType;latest;latestOff=-1;emitter=new di;constructor(i){this.singletonType=i}async apply(i){for(let r of i){let n=new N(r.eid),[e,t]=n.readStruct(_);if(t!==0)continue;let $=new O;$.writeVarString(this.singletonType);let f=$.result();if(e.id.length===f.length&&e.id.every((Z,J)=>Z===f[J])){if(this.latest===void 0||r.off>this.latestOff)this.latestOff=r.off,this.latest=r.bod,this.emitter.emit(this.singletonType,null)}}return i.map(()=>0)}clear=async()=>{return this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0};notify=(i)=>{for(let r of i)if(r===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(i)=>{this.notify([this.singletonType])};on=(i,r)=>{this.emitter.addEventListener(i,r)};off=(i,r)=>{this.emitter.removeEventListener(i,r)}}var Z$={capable(){return kt()},async createCred(i){return Wn(i)},async write(i,r,n){return Cr(i,r,n)},async read(i,r){let[n,e]=await In(i,r);if(e!==0||n===void 0)return l(e);return u(n.blob)}};class l${#n;#i;#r;#e;#t;constructor(i){if(this.#n=i.crypto,this.#e=i.rpId,this.#t=i.rpName,i.credId!==void 0)this.#r=i.credId.slice()}get credId(){if(this.#r===void 0)return;return this.#r.slice()}setCredId(i){this.#r=i===void 0?void 0:i.slice()}async save(i,r){if(r?.persist!==!0)return this.#i=i,this.#i;let[n,e]=await i.persistToLargeBlob([],{rpId:this.#e,rpName:this.#t,credId:this.#r});if(e!==0||n===void 0)return Promise.reject(Error(`persistToLargeBlob status ${e}`));return this.#r=n,this.#i=i,this.#i}async load(){return this.#i}async unlock(){let i=this.#r;if(i===void 0)return l(22);let[r,n]=await s.fromLargeBlob(this.#n,{rpId:this.#e,rpName:this.#t,credId:i});if(n!==0||r===void 0)return l(n);return this.#i=r.enclave,u(r.enclave)}async wipe(){let i=this.#r;if(i!==void 0){let r=await s.clearLargeBlob(i,{rpId:this.#e});if(r!==0)return Promise.reject(Error(`clearLargeBlob status ${r}`))}this.#i=void 0,this.#r=void 0}}var cr=1,Dr={encode(i,r){let n=i.writeVarInt(r.v);if(n!==0)return n;let e=i.writeVarBytes(r.salt);if(e!==0)return e;let t=i.writeVarBytes(r.credId);if(t!==0)return t;return i.writeVarBytes(r.body)},decode(i){let[r,n]=i.readVarInt();if(n!==0)return l(n);if(r===void 0)return l(14);let[e,t]=i.readVarBytes();if(t!==0)return l(t);if(e===void 0)return l(14);let[$,f]=i.readVarBytes();if(f!==0)return l(f);if($===void 0)return l(14);let[Z,J]=i.readVarBytes();if(J!==0)return l(J);if(Z===void 0)return l(14);return u({v:r,salt:e,credId:$,body:Z})}};var dn={PREFIX:"dip1:",VERSION:cr,async seal(i,r,n,e){let[t,$]=await r.sealPairPackageBody(n,e);if($!==0)return l($);if(t===void 0)return l(12);let f=new O,Z=f.writeStruct(Dr,{v:cr,salt:t.salt,credId:t.credId,body:t.body});if(Z!==0)return l(Z);return u(dn.PREFIX+qn(f.result()))},async open(i,r,n){let e=r.trim();if(!e.startsWith(dn.PREFIX))return l(10);let t;try{t=Cn(e.slice(dn.PREFIX.length))}catch{return l(10)}let $=new N(t),[f,Z]=$.readStruct(Dr);if(Z!==0)return l(Z);if(f===void 0)return l(14);if(f.v!==cr)return l(14);let[J,h]=await s.openPairPackageBody(i,f.body,{...n,salt:f.salt,credId:f.credId.byteLength>0?f.credId:void 0});if(h!==0)return l(h);if(J===void 0)return l(12);return u({enclave:J.enclave,hosts:J.hosts,salt:f.salt.slice(),credId:J.credId,sealedMaster:J.sealedMaster})}};async function cX(i,r){let n=await on(mi),e=new ji(new Ii,i,n,Er,mi);return{client:e,setSeed:async($)=>{let[f,Z]=s.fromBytes(mi,Oi($));if(Z!==0||f===void 0)throw Error(`invalid seed (${Z})`);await n.seed.save(f),await n.hosts.add({handle:r,label:"host",idx:0}),await e.connect()}}}export{M0 as useSyncOnResume,p0 as useStateWatcherSuspense,e$ as useStateWatcher,C0 as useClientXferState,q0 as useClientState,H0 as useClient,fn as shouldEmitItemProgress,xi as setApld,Hr as sealKeyFromPrf,re as revFromHead,or as revFromEntity,U0 as prfCapable,yr as pairPackagePlainCodec,Dr as pairPackageEnvelopeCodec,on as openIDBStore,ie as openEntDB,mn as openDiplomaticClient,Bn as nullStateManager,v$ as nullEntDB,ut as normalizeTags,E$ as isTombstone,ee as isTerminalApplyFailure,r0 as isPendingApply,T as isLiveEnt,i0 as isApldState,pi as idleProgress,Xn as identityBundleCodec,Oi as htob,Er as hostHTTPTransport,cX as genWebClient,q$ as genSingletonEID,Vr as evalPrf,en as entStateManager,lt as encodeEntRev,_ as eidCodec,cn as defaultWebAuthnRpId,lr as defaultPeekProgressEvery,mi as crypto,Fe as createPrfCred,ae as createIdentityBundle,Zt as cmpBytes,nr as checksumSet,Kr as checksumEntRevs,qi as bundleHostCodec,fi as btoh,qn as btob64url,d as btob64,Cn as b64urltob,v as b64tob,gi as asSealedMasterKey,ii as asMasterSeed,Jr as apldFromStored,Tr as WorkerClient,di as TypedEventEmitter,ji as SyncClient,G as Status,Gr as StateManager,f$ as SingletonStateManager,kn as SEALED_MASTER_KEY_LEN,Un as PrfSeedStore,l$ as PasskeySeedStore,dn as PairPackage,cr as PAIR_PACKAGE_VERSION,$$ as MemoryStore,ui as MASTER_SEED_LEN,Z$ as LargeBlob,Or as IDENTITY_BUNDLE_VERSION,Oe as IDBStore,Gn as IDBSeedStore,xn as HTTPTransport,bn as EntIDB,nn as EntDBMemory,O as Encoder,s as Enclave,N as Decoder,Mr as DEFAULT_PRF_SALT,Ii as Clock,mr as CachedEntDB,zi as APLD_PENDING,Yi as APLD_ERROR,yi as APLD_APPLIED};
|
|
1
|
+
function EV(Z){let X=Z.length,W=0,V=0;while(V<X){let l=Z.charCodeAt(V++);if((l&4294967168)===0){W++;continue}else if((l&4294965248)===0)W+=2;else{if(l>=55296&&l<=56319){if(V<X){let K=Z.charCodeAt(V);if((K&64512)===56320)++V,l=((l&1023)<<10)+(K&1023)+65536}}if((l&4294901760)===0)W+=3;else W+=4}}return W}function Y0(Z,X,W){let V=Z.length,l=W,K=0;while(K<V){let G=Z.charCodeAt(K++);if((G&4294967168)===0){X[l++]=G;continue}else if((G&4294965248)===0)X[l++]=G>>6&31|192;else{if(G>=55296&&G<=56319){if(K<V){let m=Z.charCodeAt(K);if((m&64512)===56320)++K,G=((G&1023)<<10)+(m&1023)+65536}}if((G&4294901760)===0)X[l++]=G>>12&15|224,X[l++]=G>>6&63|128;else X[l++]=G>>18&7|240,X[l++]=G>>12&63|128,X[l++]=G>>6&63|128}X[l++]=G&63|128}}var R0=new TextEncoder,J0=50;function C0(Z,X,W){R0.encodeInto(Z,X.subarray(W))}function wV(Z,X,W){if(Z.length>J0)C0(Z,X,W);else Y0(Z,X,W)}var F0=4096;function gW(Z,X,W){let V=X,l=V+W,K=[],G="";while(V<l){let m=Z[V++];if((m&128)===0)K.push(m);else if((m&224)===192){let R=Z[V++]&63;K.push((m&31)<<6|R)}else if((m&240)===224){let R=Z[V++]&63,J=Z[V++]&63;K.push((m&31)<<12|R<<6|J)}else if((m&248)===240){let R=Z[V++]&63,J=Z[V++]&63,C=Z[V++]&63,F=(m&7)<<18|R<<12|J<<6|C;if(F>65535)F-=65536,K.push(F>>>10&1023|55296),F=56320|F&1023;K.push(F)}else K.push(m);if(K.length>=F0)G+=String.fromCharCode(...K),K.length=0}if(K.length>0)G+=String.fromCharCode(...K);return G}var d0=new TextDecoder,b0=200;function c0(Z,X,W){let V=Z.subarray(X,X+W);return d0.decode(V)}function DV(Z,X,W){if(W>b0)return c0(Z,X,W);else return gW(Z,X,W)}class tZ{type;data;constructor(Z,X){this.type=Z,this.data=X}}class WZ extends Error{constructor(Z){super(Z);let X=Object.create(WZ.prototype);Object.setPrototypeOf(this,X),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:WZ.name})}}var eZ=4294967295;function AV(Z,X,W){let V=W/4294967296,l=W;Z.setUint32(X,V),Z.setUint32(X+4,l)}function oX(Z,X,W){let V=Math.floor(W/4294967296),l=W;Z.setUint32(X,V),Z.setUint32(X+4,l)}function nX(Z,X){let W=Z.getInt32(X),V=Z.getUint32(X+4);return W*4294967296+V}function oV(Z,X){let W=Z.getUint32(X),V=Z.getUint32(X+4);return W*4294967296+V}var k0=-1,T0=4294967295,I0=17179869183;function p0({sec:Z,nsec:X}){if(Z>=0&&X>=0&&Z<=I0)if(X===0&&Z<=T0){let W=new Uint8Array(4);return new DataView(W.buffer).setUint32(0,Z),W}else{let W=Z/4294967296,V=Z&4294967295,l=new Uint8Array(8),K=new DataView(l.buffer);return K.setUint32(0,X<<2|W&3),K.setUint32(4,V),l}else{let W=new Uint8Array(12),V=new DataView(W.buffer);return V.setUint32(0,X),oX(V,4,Z),W}}function L0(Z){let X=Z.getTime(),W=Math.floor(X/1000),V=(X-W*1000)*1e6,l=Math.floor(V/1e9);return{sec:W+l,nsec:V-l*1e9}}function y0(Z){if(Z instanceof Date){let X=L0(Z);return p0(X)}else return null}function Q0(Z){let X=new DataView(Z.buffer,Z.byteOffset,Z.byteLength);switch(Z.byteLength){case 4:{let W=X.getUint32(0),V=0;return{sec:W,nsec:0}}case 8:{let W=X.getUint32(0),V=X.getUint32(4),l=(W&3)*4294967296+V,K=W>>>2;return{sec:l,nsec:K}}case 12:{let W=nX(X,4),V=X.getUint32(0);return{sec:W,nsec:V}}default:throw new WZ(`Unrecognized data size for timestamp (expected 4, 8, or 12): ${Z.length}`)}}function M0(Z){let X=Q0(Z);return new Date(X.sec*1000+X.nsec/1e6)}var nV={type:k0,encode:y0,decode:M0};class ZX{static defaultCodec=new ZX;__brand;builtInEncoders=[];builtInDecoders=[];encoders=[];decoders=[];constructor(){this.register(nV)}register({type:Z,encode:X,decode:W}){if(Z>=0)this.encoders[Z]=X,this.decoders[Z]=W;else{let V=-1-Z;this.builtInEncoders[V]=X,this.builtInDecoders[V]=W}}tryToEncode(Z,X){for(let W=0;W<this.builtInEncoders.length;W++){let V=this.builtInEncoders[W];if(V!=null){let l=V(Z,X);if(l!=null){let K=-1-W;return new tZ(K,l)}}}for(let W=0;W<this.encoders.length;W++){let V=this.encoders[W];if(V!=null){let l=V(Z,X);if(l!=null)return new tZ(W,l)}}if(Z instanceof tZ)return Z;return null}decode(Z,X,W){let V=X<0?this.builtInDecoders[-1-X]:this.decoders[X];if(V)return V(Z,X,W);else return new tZ(X,Z)}}function z0(Z){return Z instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&Z instanceof SharedArrayBuffer}function IX(Z){if(Z instanceof Uint8Array)return Z;else if(ArrayBuffer.isView(Z))return new Uint8Array(Z.buffer,Z.byteOffset,Z.byteLength);else if(z0(Z))return new Uint8Array(Z);else return Uint8Array.from(Z)}var h0=100,S0=2048;class vX{extensionCodec;context;useBigInt64;maxDepth;initialBufferSize;sortKeys;forceFloat32;ignoreUndefined;forceIntegerToFloat;pos;view;bytes;entered=!1;constructor(Z){this.extensionCodec=Z?.extensionCodec??ZX.defaultCodec,this.context=Z?.context,this.useBigInt64=Z?.useBigInt64??!1,this.maxDepth=Z?.maxDepth??h0,this.initialBufferSize=Z?.initialBufferSize??S0,this.sortKeys=Z?.sortKeys??!1,this.forceFloat32=Z?.forceFloat32??!1,this.ignoreUndefined=Z?.ignoreUndefined??!1,this.forceIntegerToFloat=Z?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new vX({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(Z){if(this.entered)return this.clone().encodeSharedRef(Z);try{return this.entered=!0,this.reinitializeState(),this.doEncode(Z,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(Z){if(this.entered)return this.clone().encode(Z);try{return this.entered=!0,this.reinitializeState(),this.doEncode(Z,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(Z,X){if(X>this.maxDepth)throw Error(`Too deep objects in depth ${X}`);if(Z==null)this.encodeNil();else if(typeof Z==="boolean")this.encodeBoolean(Z);else if(typeof Z==="number")if(!this.forceIntegerToFloat)this.encodeNumber(Z);else this.encodeNumberAsFloat(Z);else if(typeof Z==="string")this.encodeString(Z);else if(this.useBigInt64&&typeof Z==="bigint")this.encodeBigInt64(Z);else this.encodeObject(Z,X)}ensureBufferSizeToWrite(Z){let X=this.pos+Z;if(this.view.byteLength<X)this.resizeBuffer(X*2)}resizeBuffer(Z){let X=new ArrayBuffer(Z),W=new Uint8Array(X),V=new DataView(X);W.set(this.bytes),this.view=V,this.bytes=W}encodeNil(){this.writeU8(192)}encodeBoolean(Z){if(Z===!1)this.writeU8(194);else this.writeU8(195)}encodeNumber(Z){if(!this.forceIntegerToFloat&&Number.isSafeInteger(Z))if(Z>=0)if(Z<128)this.writeU8(Z);else if(Z<256)this.writeU8(204),this.writeU8(Z);else if(Z<65536)this.writeU8(205),this.writeU16(Z);else if(Z<4294967296)this.writeU8(206),this.writeU32(Z);else if(!this.useBigInt64)this.writeU8(207),this.writeU64(Z);else this.encodeNumberAsFloat(Z);else if(Z>=-32)this.writeU8(224|Z+32);else if(Z>=-128)this.writeU8(208),this.writeI8(Z);else if(Z>=-32768)this.writeU8(209),this.writeI16(Z);else if(Z>=-2147483648)this.writeU8(210),this.writeI32(Z);else if(!this.useBigInt64)this.writeU8(211),this.writeI64(Z);else this.encodeNumberAsFloat(Z);else this.encodeNumberAsFloat(Z)}encodeNumberAsFloat(Z){if(this.forceFloat32)this.writeU8(202),this.writeF32(Z);else this.writeU8(203),this.writeF64(Z)}encodeBigInt64(Z){if(Z>=BigInt(0))this.writeU8(207),this.writeBigUint64(Z);else this.writeU8(211),this.writeBigInt64(Z)}writeStringHeader(Z){if(Z<32)this.writeU8(160+Z);else if(Z<256)this.writeU8(217),this.writeU8(Z);else if(Z<65536)this.writeU8(218),this.writeU16(Z);else if(Z<4294967296)this.writeU8(219),this.writeU32(Z);else throw Error(`Too long string: ${Z} bytes in UTF-8`)}encodeString(Z){let W=EV(Z);this.ensureBufferSizeToWrite(5+W),this.writeStringHeader(W),wV(Z,this.bytes,this.pos),this.pos+=W}encodeObject(Z,X){let W=this.extensionCodec.tryToEncode(Z,this.context);if(W!=null)this.encodeExtension(W);else if(Array.isArray(Z))this.encodeArray(Z,X);else if(ArrayBuffer.isView(Z))this.encodeBinary(Z);else if(typeof Z==="object")this.encodeMap(Z,X);else throw Error(`Unrecognized object: ${Object.prototype.toString.apply(Z)}`)}encodeBinary(Z){let X=Z.byteLength;if(X<256)this.writeU8(196),this.writeU8(X);else if(X<65536)this.writeU8(197),this.writeU16(X);else if(X<4294967296)this.writeU8(198),this.writeU32(X);else throw Error(`Too large binary: ${X}`);let W=IX(Z);this.writeU8a(W)}encodeArray(Z,X){let W=Z.length;if(W<16)this.writeU8(144+W);else if(W<65536)this.writeU8(220),this.writeU16(W);else if(W<4294967296)this.writeU8(221),this.writeU32(W);else throw Error(`Too large array: ${W}`);for(let V of Z)this.doEncode(V,X+1)}countWithoutUndefined(Z,X){let W=0;for(let V of X)if(Z[V]!==void 0)W++;return W}encodeMap(Z,X){let W=Object.keys(Z);if(this.sortKeys)W.sort();let V=this.ignoreUndefined?this.countWithoutUndefined(Z,W):W.length;if(V<16)this.writeU8(128+V);else if(V<65536)this.writeU8(222),this.writeU16(V);else if(V<4294967296)this.writeU8(223),this.writeU32(V);else throw Error(`Too large map object: ${V}`);for(let l of W){let K=Z[l];if(!(this.ignoreUndefined&&K===void 0))this.encodeString(l),this.doEncode(K,X+1)}}encodeExtension(Z){if(typeof Z.data==="function"){let W=Z.data(this.pos+6),V=W.length;if(V>=4294967296)throw Error(`Too large extension object: ${V}`);this.writeU8(201),this.writeU32(V),this.writeI8(Z.type),this.writeU8a(W);return}let X=Z.data.length;if(X===1)this.writeU8(212);else if(X===2)this.writeU8(213);else if(X===4)this.writeU8(214);else if(X===8)this.writeU8(215);else if(X===16)this.writeU8(216);else if(X<256)this.writeU8(199),this.writeU8(X);else if(X<65536)this.writeU8(200),this.writeU16(X);else if(X<4294967296)this.writeU8(201),this.writeU32(X);else throw Error(`Too large extension object: ${X}`);this.writeI8(Z.type),this.writeU8a(Z.data)}writeU8(Z){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,Z),this.pos++}writeU8a(Z){let X=Z.length;this.ensureBufferSizeToWrite(X),this.bytes.set(Z,this.pos),this.pos+=X}writeI8(Z){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,Z),this.pos++}writeU16(Z){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,Z),this.pos+=2}writeI16(Z){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,Z),this.pos+=2}writeU32(Z){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,Z),this.pos+=4}writeI32(Z){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,Z),this.pos+=4}writeF32(Z){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,Z),this.pos+=4}writeF64(Z){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,Z),this.pos+=8}writeU64(Z){this.ensureBufferSizeToWrite(8),AV(this.view,this.pos,Z),this.pos+=8}writeI64(Z){this.ensureBufferSizeToWrite(8),oX(this.view,this.pos,Z),this.pos+=8}writeBigUint64(Z){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,Z),this.pos+=8}writeBigInt64(Z){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,Z),this.pos+=8}}function AZ(Z,X){return new vX(X).encodeSharedRef(Z)}function fX(Z){return`${Z<0?"-":""}0x${Math.abs(Z).toString(16).padStart(2,"0")}`}var N0=16,g0=16;class xW{hit=0;miss=0;caches;maxKeyLength;maxLengthPerKey;constructor(Z=N0,X=g0){this.maxKeyLength=Z,this.maxLengthPerKey=X,this.caches=[];for(let W=0;W<this.maxKeyLength;W++)this.caches.push([])}canBeCached(Z){return Z>0&&Z<=this.maxKeyLength}find(Z,X,W){let V=this.caches[W-1];Z:for(let l of V){let K=l.bytes;for(let G=0;G<W;G++)if(K[G]!==Z[X+G])continue Z;return l.str}return null}store(Z,X){let W=this.caches[Z.length-1],V={bytes:Z,str:X};if(W.length>=this.maxLengthPerKey)W[Math.random()*W.length|0]=V;else W.push(V)}decode(Z,X,W){let V=this.find(Z,X,W);if(V!=null)return this.hit++,V;this.miss++;let l=gW(Z,X,W),K=Uint8Array.prototype.slice.call(Z,X,X+W);return this.store(K,l),l}}var HW="array",LX="map_key",fV="map_value",x0=(Z)=>{if(typeof Z==="string"||typeof Z==="number")return Z;throw new WZ("The type of key must be string or number but "+typeof Z)};class $V{stack=[];stackHeadPosition=-1;get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(Z){let X=this.getUninitializedStateFromPool();X.type=HW,X.position=0,X.size=Z,X.array=Array(Z)}pushMapState(Z){let X=this.getUninitializedStateFromPool();X.type=LX,X.readCount=0,X.size=Z,X.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let Z={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(Z)}return this.stack[this.stackHeadPosition]}release(Z){if(this.stack[this.stackHeadPosition]!==Z)throw Error("Invalid stack state. Released state is not on top of the stack.");if(Z.type===HW){let W=Z;W.size=0,W.array=void 0,W.position=0,W.type=void 0}if(Z.type===LX||Z.type===fV){let W=Z;W.size=0,W.map=void 0,W.readCount=0,W.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}}var pX=-1,PW=new DataView(new ArrayBuffer(0)),H0=new Uint8Array(PW.buffer);try{PW.getInt8(0)}catch(Z){if(!(Z 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 vV=RangeError("Insufficient data"),P0=new xW;class $X{extensionCodec;context;useBigInt64;rawStrings;maxStrLength;maxBinLength;maxArrayLength;maxMapLength;maxExtLength;keyDecoder;mapKeyConverter;totalPos=0;pos=0;view=PW;bytes=H0;headByte=pX;stack=new $V;entered=!1;constructor(Z){this.extensionCodec=Z?.extensionCodec??ZX.defaultCodec,this.context=Z?.context,this.useBigInt64=Z?.useBigInt64??!1,this.rawStrings=Z?.rawStrings??!1,this.maxStrLength=Z?.maxStrLength??eZ,this.maxBinLength=Z?.maxBinLength??eZ,this.maxArrayLength=Z?.maxArrayLength??eZ,this.maxMapLength=Z?.maxMapLength??eZ,this.maxExtLength=Z?.maxExtLength??eZ,this.keyDecoder=Z?.keyDecoder!==void 0?Z.keyDecoder:P0,this.mapKeyConverter=Z?.mapKeyConverter??x0}clone(){return new $X({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=pX,this.stack.reset()}setBuffer(Z){let X=IX(Z);this.bytes=X,this.view=new DataView(X.buffer,X.byteOffset,X.byteLength),this.pos=0}appendBuffer(Z){if(this.headByte===pX&&!this.hasRemaining(1))this.setBuffer(Z);else{let X=this.bytes.subarray(this.pos),W=IX(Z),V=new Uint8Array(X.length+W.length);V.set(X),V.set(W,X.length),this.setBuffer(V)}}hasRemaining(Z){return this.view.byteLength-this.pos>=Z}createExtraByteError(Z){let{view:X,pos:W}=this;return RangeError(`Extra ${X.byteLength-W} of ${X.byteLength} byte(s) found at buffer[${Z}]`)}decode(Z){if(this.entered)return this.clone().decode(Z);try{this.entered=!0,this.reinitializeState(),this.setBuffer(Z);let X=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return X}finally{this.entered=!1}}*decodeMulti(Z){if(this.entered){yield*this.clone().decodeMulti(Z);return}try{this.entered=!0,this.reinitializeState(),this.setBuffer(Z);while(this.hasRemaining(1))yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(Z){if(this.entered)return this.clone().decodeAsync(Z);try{this.entered=!0;let X=!1,W;for await(let G of Z){if(X)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(G);try{W=this.doDecodeSync(),X=!0}catch(m){if(!(m instanceof RangeError))throw m}this.totalPos+=this.pos}if(X){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return W}let{headByte:V,pos:l,totalPos:K}=this;throw RangeError(`Insufficient data in parsing ${fX(V)} at ${K} (${l} in the current buffer)`)}finally{this.entered=!1}}decodeArrayStream(Z){return this.decodeMultiAsync(Z,!0)}decodeStream(Z){return this.decodeMultiAsync(Z,!1)}async*decodeMultiAsync(Z,X){if(this.entered){yield*this.clone().decodeMultiAsync(Z,X);return}try{this.entered=!0;let W=X,V=-1;for await(let l of Z){if(X&&V===0)throw this.createExtraByteError(this.totalPos);if(this.appendBuffer(l),W)V=this.readArraySize(),W=!1,this.complete();try{while(!0)if(yield this.doDecodeSync(),--V===0)break}catch(K){if(!(K instanceof RangeError))throw K}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){Z:while(!0){let Z=this.readHeadByte(),X;if(Z>=224)X=Z-256;else if(Z<192)if(Z<128)X=Z;else if(Z<144){let V=Z-128;if(V!==0){this.pushMapState(V),this.complete();continue Z}else X={}}else if(Z<160){let V=Z-144;if(V!==0){this.pushArrayState(V),this.complete();continue Z}else X=[]}else{let V=Z-160;X=this.decodeString(V,0)}else if(Z===192)X=null;else if(Z===194)X=!1;else if(Z===195)X=!0;else if(Z===202)X=this.readF32();else if(Z===203)X=this.readF64();else if(Z===204)X=this.readU8();else if(Z===205)X=this.readU16();else if(Z===206)X=this.readU32();else if(Z===207)if(this.useBigInt64)X=this.readU64AsBigInt();else X=this.readU64();else if(Z===208)X=this.readI8();else if(Z===209)X=this.readI16();else if(Z===210)X=this.readI32();else if(Z===211)if(this.useBigInt64)X=this.readI64AsBigInt();else X=this.readI64();else if(Z===217){let V=this.lookU8();X=this.decodeString(V,1)}else if(Z===218){let V=this.lookU16();X=this.decodeString(V,2)}else if(Z===219){let V=this.lookU32();X=this.decodeString(V,4)}else if(Z===220){let V=this.readU16();if(V!==0){this.pushArrayState(V),this.complete();continue Z}else X=[]}else if(Z===221){let V=this.readU32();if(V!==0){this.pushArrayState(V),this.complete();continue Z}else X=[]}else if(Z===222){let V=this.readU16();if(V!==0){this.pushMapState(V),this.complete();continue Z}else X={}}else if(Z===223){let V=this.readU32();if(V!==0){this.pushMapState(V),this.complete();continue Z}else X={}}else if(Z===196){let V=this.lookU8();X=this.decodeBinary(V,1)}else if(Z===197){let V=this.lookU16();X=this.decodeBinary(V,2)}else if(Z===198){let V=this.lookU32();X=this.decodeBinary(V,4)}else if(Z===212)X=this.decodeExtension(1,0);else if(Z===213)X=this.decodeExtension(2,0);else if(Z===214)X=this.decodeExtension(4,0);else if(Z===215)X=this.decodeExtension(8,0);else if(Z===216)X=this.decodeExtension(16,0);else if(Z===199){let V=this.lookU8();X=this.decodeExtension(V,1)}else if(Z===200){let V=this.lookU16();X=this.decodeExtension(V,2)}else if(Z===201){let V=this.lookU32();X=this.decodeExtension(V,4)}else throw new WZ(`Unrecognized type byte: ${fX(Z)}`);this.complete();let W=this.stack;while(W.length>0){let V=W.top();if(V.type===HW)if(V.array[V.position]=X,V.position++,V.position===V.size)X=V.array,W.release(V);else continue Z;else if(V.type===LX){if(X==="__proto__")throw new WZ("The key __proto__ is not allowed");V.key=this.mapKeyConverter(X),V.type=fV;continue Z}else if(V.map[V.key]=X,V.readCount++,V.readCount===V.size)X=V.map,W.release(V);else{V.key=null,V.type=LX;continue Z}}return X}}readHeadByte(){if(this.headByte===pX)this.headByte=this.readU8();return this.headByte}complete(){this.headByte=pX}readArraySize(){let Z=this.readHeadByte();switch(Z){case 220:return this.readU16();case 221:return this.readU32();default:if(Z<160)return Z-144;else throw new WZ(`Unrecognized array type byte: ${fX(Z)}`)}}pushMapState(Z){if(Z>this.maxMapLength)throw new WZ(`Max length exceeded: map length (${Z}) > maxMapLengthLength (${this.maxMapLength})`);this.stack.pushMapState(Z)}pushArrayState(Z){if(Z>this.maxArrayLength)throw new WZ(`Max length exceeded: array length (${Z}) > maxArrayLength (${this.maxArrayLength})`);this.stack.pushArrayState(Z)}decodeString(Z,X){if(!this.rawStrings||this.stateIsMapKey())return this.decodeUtf8String(Z,X);return this.decodeBinary(Z,X)}decodeUtf8String(Z,X){if(Z>this.maxStrLength)throw new WZ(`Max length exceeded: UTF-8 byte length (${Z}) > maxStrLength (${this.maxStrLength})`);if(this.bytes.byteLength<this.pos+X+Z)throw vV;let W=this.pos+X,V;if(this.stateIsMapKey()&&this.keyDecoder?.canBeCached(Z))V=this.keyDecoder.decode(this.bytes,W,Z);else V=DV(this.bytes,W,Z);return this.pos+=X+Z,V}stateIsMapKey(){if(this.stack.length>0)return this.stack.top().type===LX;return!1}decodeBinary(Z,X){if(Z>this.maxBinLength)throw new WZ(`Max length exceeded: bin length (${Z}) > maxBinLength (${this.maxBinLength})`);if(!this.hasRemaining(Z+X))throw vV;let W=this.pos+X,V=this.bytes.subarray(W,W+Z);return this.pos+=X+Z,V}decodeExtension(Z,X){if(Z>this.maxExtLength)throw new WZ(`Max length exceeded: ext length (${Z}) > maxExtLength (${this.maxExtLength})`);let W=this.view.getInt8(this.pos+X),V=this.decodeBinary(Z,X+1);return this.extensionCodec.decode(V,W,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 Z=this.view.getUint8(this.pos);return this.pos++,Z}readI8(){let Z=this.view.getInt8(this.pos);return this.pos++,Z}readU16(){let Z=this.view.getUint16(this.pos);return this.pos+=2,Z}readI16(){let Z=this.view.getInt16(this.pos);return this.pos+=2,Z}readU32(){let Z=this.view.getUint32(this.pos);return this.pos+=4,Z}readI32(){let Z=this.view.getInt32(this.pos);return this.pos+=4,Z}readU64(){let Z=oV(this.view,this.pos);return this.pos+=8,Z}readI64(){let Z=nX(this.view,this.pos);return this.pos+=8,Z}readU64AsBigInt(){let Z=this.view.getBigUint64(this.pos);return this.pos+=8,Z}readI64AsBigInt(){let Z=this.view.getBigInt64(this.pos);return this.pos+=8,Z}readF32(){let Z=this.view.getFloat32(this.pos);return this.pos+=4,Z}readF64(){let Z=this.view.getFloat64(this.pos);return this.pos+=8,Z}}function iW(Z,X){return new $X(X).decode(Z)}class gZ{listeners=new Map;addEventListener(Z,X){let W=this.listeners.get(Z);if(!W)W=new Set,this.listeners.set(Z,W);return W.add(X),()=>{this.removeEventListener(Z,X)}}removeEventListener(Z,X){let W=this.listeners.get(Z);if(W){if(W.delete(X),W.size===0)this.listeners.delete(Z)}}emit(Z,X){let W=this.listeners.get(Z);if(W){let V=Array.from(W);for(let l of V)l(X)}}emitAll(Z){let X=Array.from(this.listeners.keys());for(let W of X)this.emit(W,Z)}}class bZ{getter;static eventName="update";emitter;constructor(Z){this.getter=Z;this.emitter=new gZ}get=()=>this.getter();async emit(){let Z=await this.getter();queueMicrotask(()=>this.emitter.emit(bZ.eventName,Z))}listen(Z){return this.emitter.addEventListener(bZ.eventName,Z),()=>{this.emitter.removeEventListener(bZ.eventName,Z)}}}var xZ=64;var qV=32,HZ=8;var qX=32;var aV=30000,_V=512,z;((Q)=>{Q[Q.Success=0]="Success";Q[Q.InvalidSignature=3]="InvalidSignature";Q[Q.ClockOutOfSync=4]="ClockOutOfSync";Q[Q.UserNotRegistered=5]="UserNotRegistered";Q[Q.ServerMisconfigured=6]="ServerMisconfigured";Q[Q.MissingBody=7]="MissingBody";Q[Q.ExtraBodyContent=8]="ExtraBodyContent";Q[Q.MissingParam=9]="MissingParam";Q[Q.InvalidParam=10]="InvalidParam";Q[Q.InvalidRequest=11]="InvalidRequest";Q[Q.InternalError=12]="InternalError";Q[Q.NotFound=13]="NotFound";Q[Q.InvalidMessage=14]="InvalidMessage";Q[Q.NoChange=15]="NoChange";Q[Q.DatabaseClosed=16]="DatabaseClosed";Q[Q.StorageError=17]="StorageError";Q[Q.DatabaseError=18]="DatabaseError";Q[Q.HashMismatch=19]="HashMismatch";Q[Q.DecryptionError=20]="DecryptionError";Q[Q.NotImplemented=21]="NotImplemented";Q[Q.MissingSeed=22]="MissingSeed";Q[Q.OutOfBounds=23]="OutOfBounds";Q[Q.HostError=24]="HostError";Q[Q.CommunicationError=25]="CommunicationError";Q[Q.VarLimitExceeded=26]="VarLimitExceeded";Q[Q.InvalidResponse=27]="InvalidResponse";Q[Q.ConnectionClosed=28]="ConnectionClosed"})(z||={});function d(Z){return[Z,0]}function Y(Z){return[void 0,Z]}function i0(Z){if(Z<0)console.info("N",Z),console.trace();if(typeof Z!=="bigint")Z=BigInt(Z);if(Z<0n)return Y(10);let X=[];while(Z>0n){let W=Number(Z&0x7fn);if(Z>>=7n,Z>0n)X.push(W|128);else X.push(W)}if(X.length===0)return d(new Uint8Array([0]));if(X.length>8)return Y(26);return d(new Uint8Array(X))}function U0(Z,X=0){let W=0n,V=0,l=X;while(!0){if(l>=Z.length)return Y(14);let K=Z[l++];if(K===void 0)return Y(14);if(W|=BigInt(K&127)<<BigInt(V),(K&128)===0){if(l-X>8)return Y(26);return d({value:W>0x1fffffffffffffn?W:Number(W),bytesRead:l-X})}if(V+=7,V>=56)return Y(26)}}class P{data;pos=0;constructor(Z){this.data=Z}static async fromResponse(Z){let X=await Z.arrayBuffer(),W=new Uint8Array(X);return new P(W)}readBigInt(){if(this.pos+8>this.data.length)return Y(7);let Z=new DataView(this.data.buffer,this.data.byteOffset+this.pos).getBigUint64(0,!1);return this.pos+=8,d(Z)}readDate(){let[Z,X]=this.readVarInt();if(X!==0)return Y(X);return d(new Date(Z))}readVarInt(){let[Z,X]=U0(this.data,this.pos);if(X!==0)return Y(X);this.pos+=Z.bytesRead;let W=Z.value;return d(typeof W==="bigint"?Number(W):W)}readVarString(){let[Z,X]=this.readVarInt();if(X!==0)return Y(X);let[W,V]=this.readBytes(Z);if(V!==0)return Y(V);let l=new TextDecoder().decode(W);return d(l)}readBytes(Z){if(Z<0)return Y(10);if(this.pos+Z>this.data.length)return Y(23);let X=this.data.slice(this.pos,this.pos+Z);return this.pos+=Z,d(X)}readVarBytes(){let[Z,X]=this.readVarInt();if(X!==0)return Y(X);return this.readBytes(Z)}readStruct(Z){return Z.decode(this)}readStructs(Z){let X=[];while(!this.done()){let[W,V]=this.readStruct(Z);if(V!==0)return Y(V);X.push(W)}return d(X)}readBytesSeq(Z){let X=[];while(!this.done()){let[W,V]=this.readBytes(Z);if(V!==0)return Y(V);X.push(W)}return d(X)}done(){return this.pos>=this.data.length}consumed(){return this.pos}}class i{parts=[];writeBigInt(Z){let X=new Uint8Array(8);new DataView(X.buffer).setBigUint64(0,Z,!1),this.parts.push(X)}writeDate(Z){let X=Z.getTime();return this.writeVarInt(X)}writeVarInt(Z){let[X,W]=i0(Z);if(W!==0)return W;return this.parts.push(X),0}writeVarString(Z){let X=new TextEncoder().encode(Z),W=this.writeVarInt(X.length);if(W!==0)return W;return this.writeBytes(X),0}prependBytes(Z){this.parts.unshift(Z)}writeBytes(Z){this.parts.push(Z)}writeVarBytes(Z){let X=this.writeVarInt(Z.length);if(X!==0)return X;return this.writeBytes(Z),0}writeStruct(Z,X){return Z.encode(this,X)}writeStructs(Z,X){for(let W of X){let V=this.writeStruct(Z,W);if(V!==0)return V}return 0}writeBytesSeq(Z){for(let X of Z)this.writeBytes(X)}result(){let Z=this.parts.reduce((V,l)=>V+l.length,0),X=new Uint8Array(Z),W=0;for(let V of this.parts)X.set(V,W),W+=V.length;return X}*scan(){for(let Z of this.parts)yield Z}}async function UW(Z,X){let W=new i,V=W.writeDate(X);if(V!==0)return Y(V);let l=W.result(),K=await Z.sign(l);return d({pubKey:Z.publicKey,sig:K,timestamp:X})}async function PZ(Z,X,W){let V=W.now().getTime(),l=Z.timestamp.getTime();if(Math.abs(V-l)>aV)return 4;let G=new i;G.writeDate(Z.timestamp);let m=G.result();if(!await X.checkSigEd25519(Z.sig,m,Z.pubKey))return 3;return 0}var _={encode(Z,X){let W=Z.writeVarBytes(X.id);if(W!==0)return W;let V=Z.writeDate(X.ts);if(V!==0)return V;return 0},decode(Z){let[X,W]=Z.readVarBytes();if(W!==0)return Y(W);let[V,l]=Z.readDate();if(l!==0)return Y(l);return d({id:X,ts:V})}};function XX(Z){let X=new i,W=X.writeStruct(_,Z);if(W!==0)return Y(W);let V=X.result();return d(V)}async function u0(Z){return XX({id:Z,ts:new Date(0)})}var YZ={encode(Z,X){let W=Z.writeVarBytes(X.eid);if(W!==0)return W;let V=Z.writeVarInt(X.off);if(V!==0)return V;let l=Z.writeVarInt(X.ctr);if(l!==0)return l;let K=Z.writeVarInt(X.len);if(K!==0)return K;if(X.hsh)Z.writeBytes(X.hsh);return 0},decode(Z){let[X,W]=Z.readVarBytes();if(W!==0)return Y(W);let V=new P(X),[,l]=_.decode(V);if(l!==0)return Y(l);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);let[m,R]=Z.readVarInt();if(R!==0)return Y(R);let[J,C]=Z.readVarInt();if(C!==0)return Y(C);let F;if(J>0){let[b,c]=Z.readBytes(qX);if(c!==0)return Y(c);F=b}return d({eid:X,off:K,ctr:m,len:J,hsh:F})}};function GZ(Z){return Array.from(Z).map((W)=>W.toString(16).padStart(2,"0")).join("")}function iZ(Z){if(Z.length%2!==0)throw Error("Invalid hex string");let X=new Uint8Array(Z.length/2);for(let W=0;W<Z.length;W+=2)X[W/2]=Number.parseInt(Z.substr(W,2),16);return X}function e(Z,X){if(Z===X)return!0;if(Z.byteLength!==X.byteLength)return!1;return Z.every((W,V)=>W===X[V])}var g;if(typeof Uint8Array.prototype.toBase64==="function")g=(Z)=>Z.toBase64();else g=(Z)=>btoa(String.fromCharCode(...Z));var t;if(typeof Uint8Array.fromBase64==="function")t=(Z)=>Uint8Array.fromBase64(Z);else t=(Z)=>Uint8Array.from(atob(Z),(X)=>X.charCodeAt(0));function uW(Z){return g(Z).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function OW(Z){let X=Z.length%4===0?"":"=".repeat(4-Z.length%4),W=Z.replace(/-/g,"+").replace(/_/g,"/")+X;return t(W)}function yX(Z,X){let W=new Uint8Array(Z.length+X.length);return W.set(Z,0),W.set(X,Z.length),W}function sV(Z,X,W){return W.checkSigEd25519(Z.sig,Z.headCph,X)}async function rV(Z,X,W,V){let l;if(Z.bod&&Z.len>0)l=await W.blake3(Z.bod);let K=new i,G=YZ.encode(K,{...Z,hsh:l});if(G!==0)return Y(G);let m=K.result(),R=await X.kdmFor(m),J=V.deriveCipher(R,"encrypt"),C=await J.encrypt(m),F=Z.bod?await J.encrypt(Z.bod):new Uint8Array(0),b=await X.sign(C);return d({sig:b,kdm:R,headCph:C,bodyCph:F})}async function BW(Z,X,W,V,l){let K=new P(Z),[G,m]=YZ.decode(K);if(m!==0)return Y(14);let R;try{R=X&&X.length>0?await W.decrypt(X):void 0}catch{return Y(20)}let J=G.hsh&&R===void 0,C=G.hsh===void 0&&R!==void 0;if(J||C)return Y(19);if(G.hsh&&R){let b=await V.blake3(R);if(!e(b,G.hsh))return Y(19)}let F=l??await V.blake3(Z);return d({msgHead:G,bod:R,headHash:F})}class pZ{now(){return new Date}}function tV(Z,X,W,V){let l=X.getTime()-Z.getTime(),K=W.getTime()-V.getTime();return(l+K)/2}var QX={encode(Z,X){if(Z.writeVarInt(X.quota),X.quota>0){if(X.usage===void 0)return 9;Z.writeVarInt(X.usage)}return 0},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);let V;if(X>0){let[l,K]=Z.readVarInt();if(K!==0)return Y(K);V=l}return d({quota:X,usage:V})}};var jW={encode(Z,X){Z.writeBytes(new Uint8Array([X.status]));let W=Z.writeDate(X.timeRcvd);if(W!==0)return W;let V=Z.writeDate(X.timeSent);if(V!==0)return V;let l=Z.writeVarInt(X.subscription.term);if(l!==0)return l;let K=Z.writeVarInt(X.subscription.elapsed);if(K!==0)return K;let G=Z.writeStruct(QX,X.subscription.stat);if(G!==0)return G;let m=Z.writeStruct(QX,X.subscription.dyn);if(m!==0)return m;return 0},decode(Z){let[X,W]=Z.readBytes(1);if(W!==0)return Y(W);let V=X[0],[l,K]=Z.readDate();if(K!==0)return Y(K);let[G,m]=Z.readDate();if(m!==0)return Y(m);let[R,J]=Z.readVarInt();if(J!==0)return Y(J);let[C,F]=Z.readVarInt();if(F!==0)return Y(F);let[b,c]=Z.readStruct(QX);if(c!==0)return Y(c);let[k,T]=Z.readStruct(QX);if(T!==0)return Y(T);return d({status:V,timeRcvd:l,timeSent:G,subscription:{term:R,elapsed:C,stat:b,dyn:k}})}};var EW={encode(Z,X){let W=Z.writeVarBytes(X.headCph);if(W!==0)return W;let V=Z.writeVarInt(X.seq);if(V!==0)return V;return 0},decode(Z){let[X,W]=Z.readVarBytes();if(W!==0)return Y(W);let[V,l]=Z.readVarInt();if(l!==0)return Y(l);return d({headCph:X,seq:V})}};var mZ={encode(Z,X){Z.writeBytes(X.pubKey),Z.writeBytes(X.sig);let W=Z.writeDate(X.timestamp);if(W!==0)return W;return 0},decode(Z){let[X,W]=Z.readBytes(qV);if(W!==0)return Y(W);let[V,l]=Z.readBytes(xZ);if(l!==0)return Y(l);let[K,G]=Z.readDate();if(G!==0)return Y(G);return d({pubKey:X,sig:V,timestamp:K})}};var eV={async encodeReq(Z,X,W,V,l){let K=l.writeStruct(mZ,W);if(K!==0)return K;for(let G of V)l.writeVarInt(G);return 0},async handleReq(Z,X,W){let{clock:V,crypto:l,storage:K}=Z,[G,m]=X.readStruct(mZ);if(m!==0)return m;let R=await PZ(G,l,V);if(R!==0)return R;let{pubKey:J}=G,[C,F]=await K.hasUser(J);if(F!==0)return F;if(!C)return 5;let[b,c]=X.readVarInt();if(c!==0)return c;if(!X.done())return 8;let[k,T]=await K.listHeads(J,b);if(T!==0)return T;return W.writeStructs(EW,k)},decodeResp(Z){return Z.readStructs(EW)}};var wW={encode(Z,X){Z.writeVarInt(X.seq);let W=Z.writeVarBytes(X.bodyCph);if(W!==0)return W;return 0},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);let[V,l]=Z.readVarBytes();if(l!==0)return Y(l);return d({seq:X,bodyCph:V})}};var Zl={async encodeReq(Z,X,W,V,l){let K=l.writeStruct(mZ,W);if(K!==0)return K;for(let G of V){let m=l.writeVarInt(G);if(m!==0)return m}return 0},async handleReq(Z,X,W){let{clock:V,crypto:l,storage:K}=Z,[G,m]=X.readStruct(mZ);if(m!==0)return m;let R=await PZ(G,l,V);if(R!==0)return R;let{pubKey:J}=G,[C,F]=await K.hasUser(J);if(F!==0)return F;if(!C)return 5;let b=[];while(!X.done()){let[T,I]=X.readVarInt();if(I!==0)return I;b.push(T)}console.info(`PULL: ${b.length} bags`);let[c,k]=await K.getBodies(J,b);if(k!==0)return k;if(!c)return 17;for(let{seq:T,bodyCph:I}of c){let y={seq:T,bodyCph:I},L=W.writeStruct(wW,y);if(L!==0)return L}return 0},decodeResp(Z){return Z.readStructs(wW)}};var DW={encode(Z,X){Z.writeBytes(X.sig),Z.writeBytes(X.kdm);let W=Z.writeVarBytes(X.headCph);if(W!==0)return W;let V=Z.writeVarBytes(X.bodyCph);if(V!==0)return V;return 0},decode(Z){let[X,W]=Z.readBytes(xZ);if(W!==0)return Y(W);let[V,l]=Z.readBytes(HZ);if(l!==0)return Y(l);let[K,G]=Z.readVarBytes();if(G!==0)return Y(G);let[m,R]=Z.readVarBytes();if(R!==0)return Y(R);return d({sig:X,kdm:V,headCph:K,bodyCph:m})}};var aX={encode(Z,X){let W=Z.writeVarInt(X.seq);if(W!==0)return W;let V=Z.writeVarBytes(X.headCph);if(V!==0)return V;let l=X.bodyCph?X.bodyCph.length:0,K=Z.writeVarInt(l);if(K!==0)return K;if(l>0){if(!X.bodyCph)return 10;Z.writeBytes(X.bodyCph)}return 0},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);let[V,l]=Z.readVarBytes();if(l!==0)return Y(l);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);let m;if(K>0){let[R,J]=Z.readBytes(K);if(J!==0)return Y(J);m=R}return d({seq:X,headCph:V,bodyCph:m})}};var _X={encode(Z,X){Z.writeBytes(X.sig),Z.writeBytes(X.kdm);let W=Z.writeVarBytes(X.headCph);if(W!==0)return W;return 0},decode(Z){let[X,W]=Z.readBytes(xZ);if(W!==0)return Y(W);let[V,l]=Z.readBytes(HZ);if(l!==0)return Y(l);let[K,G]=Z.readVarBytes();if(G!==0)return Y(G);return d({sig:X,kdm:V,headCph:K})}};var sX={encode(Z,X){if(Z.writeVarInt(X.idx),Z.writeBytes(new Uint8Array([X.status])),X.status===0)Z.writeVarInt(X.seq);return 0},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);let[V,l]=Z.readBytes(1);if(l!==0)return Y(l);let K=V[0];if(K!==0)return d({idx:X,status:K});let[G,m]=Z.readVarInt();if(m!==0)return Y(m);return d({idx:X,status:K,seq:G})}};var Xl={async encodeReq(Z,X,W,V,l){let K=l.writeStruct(mZ,W);if(K!==0)return K;let G=l.writeStructs(DW,V);if(G!==0)return G;return 0},async handleReq(Z,X,W){let{clock:V,crypto:l,storage:K,notifier:G}=Z,[m,R]=X.readStruct(mZ);if(R!==0)return R;let J=await PZ(m,l,V);if(J!==0)return J;let{pubKey:C}=m,[F,b]=await K.hasUser(C);if(b!==0)return b;if(!F)return 5;let[c,k]=X.readStructs(DW);if(k!==0)return k;console.info(`PUSH: ${c.length} bags`);let T=[],I=[];for(let p=0;p<c.length;p++){let S=c[p];if(!await sV(S,C,l)){let B={idx:p,status:3},O=W.writeStruct(sX,B);if(O!==0)return O;continue}T.push(p),I.push(S)}let[y,L]=await K.setBags(C,I);if(L!==0)return L;if(!y||y.length!==I.length)return 17;let M=[];for(let p=0;p<I.length;p++){let S=I[p],H=T[p],B=y[p],O=new i,U=O.writeStruct(_X,S);if(U!==0)return U;let E=O.result(),Q={seq:B,headCph:E};if(c.length===1&&S.bodyCph.length<=_V)Q.bodyCph=S.bodyCph;M.push(Q);let A={idx:H,status:0,seq:B},n=W.writeStruct(sX,A);if(n!==0)return n}if(M.length>0){let p=new i,S=p.writeStructs(aX,M);if(S!==0)return S;let H=p.result();await Promise.resolve(G.push(C,H))}return 0},decodeResp(Z){return Z.readStructs(sX)}};var Wl={async encodeReq(Z,X,W,V,l){return l.writeStruct(mZ,W)},async handleReq(Z,X,W){let{clock:V,crypto:l,storage:K}=Z,[G,m]=X.readStruct(mZ);if(m!==0)return m;let R=await PZ(G,l,V);if(R!==0)return R;let{pubKey:J}=G;if(!X.done())return 8;let[C,F]=await K.addUser(J);if(F!==0)return F;return 0},decodeResp(Z){return d(void 0)}};class AW{url;websocket;constructor(Z){this.url=Z}connected(){return this.websocket!==void 0&&this.websocket.readyState===WebSocket.OPEN}async connect(Z,X,W=()=>{},V=()=>{}){let{url:l}=this;if(this.websocket)this.websocket.close(),this.websocket=void 0;let K=new i;K.writeStruct(mZ,Z);let G=K.result(),m=GZ(G);return l.searchParams.set("t",m),this.websocket=new WebSocket(l),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{console.log("CONNECTED"),V()},this.websocket.onclose=()=>{console.log("DISCONNECTED"),this.websocket=void 0,W()},this.websocket.onmessage=(R)=>{let J=new Uint8Array(R.data);X(J)},this.websocket.onerror=(R)=>{console.log(`ERROR: ${JSON.stringify(R)}`),this.websocket=void 0,W()},Promise.resolve(0)}disconnect(){this.websocket?.close(),this.websocket=void 0}}var s={user:{path:"/user",endpoint:Wl,name:0},push:{path:"/push",endpoint:Xl,name:2},peek:{path:"/peek",endpoint:eV,name:1},pull:{path:"/pull",endpoint:Zl,name:3}},O0={0:s.user,2:s.push,1:s.peek,3:s.pull},aY={[s.user.path]:s.user,[s.push.path]:s.push,[s.peek.path]:s.peek,[s.pull.path]:s.pull};class oW{url;listener;constructor(Z){this.url=Z;this.listener=new AW(Z)}async call(Z,X){let{path:W}=O0[Z],V=new URL(W,this.url);try{return await B0(V,X)}catch{return Y(25)}}}var rX=(Z)=>{return new oW(Z.handle)};async function B0(Z,X){let W=await fetch(Z,{method:"POST",body:X.result().slice()});if(!W.ok)return Y(24);let V=await P.fromResponse(W);return d(V)}class tX{enclave;crypto;host;clock;transport;updateHostMeta;constructor(Z,X,W,V,l,K){this.enclave=Z;this.crypto=X;this.host=W;this.clock=V;this.transport=l;this.updateHostMeta=K}async call(Z,X){let{clock:W,transport:V}=this,{endpoint:l,name:K}=Z,G=await this.identity(),m=W.now(),[R,J]=await UW(G,m);if(J!==0)return Y(J);let C=new i,F=await l.encodeReq(this,G,R,X,C);if(F!==0)return Y(F);let b=W.now(),[c,k]=await V.call(K,C),T=W.now();if(k!==0)return Y(k);let[I,y]=c.readStruct(jW);if(y!==0)return Y(y);if(I.status!==0)return Y(I.status);let M={clockOffset:tV(b,I.timeRcvd,I.timeSent,T),subscription:I.subscription},p=await this.updateHostMeta(M);if(p!==0)return Y(p);return l.decodeResp(c)}identity=()=>{let{host:Z,enclave:X}=this;return X.deriveIdentity(Z.label,Z.idx??0)};seal=async(Z)=>{let{crypto:X,enclave:W}=this,V=await this.identity();return rV(Z,V,X,W)};register=()=>this.call(s.user,[]);peek=(Z)=>this.call(s.peek,[Z]);push=(Z)=>this.call(s.push,Z);pull=(Z)=>this.call(s.pull,Z);listen=async(Z,X,W)=>{let{clock:V,transport:l}=this,{listener:K}=l,G=await this.identity(),m=V.now(),[R,J]=await UW(G,m);if(J!==0)return J;return await K.connect(R,Z,X,W)};isConnected(){let Z=this.transport?.listener;if(Z&&typeof Z.connected==="function")return Z.connected();return!0}closeListener(){this.transport?.listener?.disconnect()}}var nW={encode(Z,X){let W=Z.writeVarString(X.lbl);if(W!==0)return W;let V=Z.writeVarInt(X.idx);if(V!==0)return V;let l=Z.writeVarInt(X.num);if(l!==0)return l;return Z.writeBytes(X.hsh),Z.writeBytes(X.sig),0},decode(Z){let[X,W]=Z.readVarString();if(W!==0)return Y(W);let[V,l]=Z.readVarInt();if(l!==0)return Y(l);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);let[m,R]=Z.readBytes(qX);if(R!==0)return Y(R);let[J,C]=Z.readBytes(xZ);if(C!==0)return Y(C);return d({lbl:X,idx:V,num:K,hsh:m,sig:J})}};var vW={encode(Z,X){let W=Z.writeStruct(nW,X.head);if(W!==0)return W;let V=Z.writeVarBytes(X.indexEnc);if(V!==0)return V;let l=Z.writeVarBytes(X.bodyEnc);if(l!==0)return l;return 0},decode(Z){let[X,W]=Z.readStruct(nW);if(W!==0)return Y(W);let[V,l]=Z.readVarBytes();if(l!==0)return Y(l);let[K,G]=Z.readVarBytes();if(G!==0)return Y(G);return d({head:X,indexEnc:V,bodyEnc:K})}};var fW={encode(Z,X){Z.writeBytes(X.kdm);let W=Z.writeVarBytes(X.headCph);if(W!==0)return W;let V=Z.writeVarInt(X.lenBody);if(V!==0)return V;if(X.lenBody>0&&X.offBody!==void 0){let l=Z.writeVarInt(X.offBody);if(l!==0)return l}return 0},decode(Z){let[X,W]=Z.readBytes(HZ);if(W!==0)return Y(W);let[V,l]=Z.readVarBytes();if(l!==0)return Y(l);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);let m;if(K>0){let[R,J]=Z.readVarInt();if(J!==0)return Y(J);m=R}return d({kdm:X,headCph:V,lenBody:K,offBody:m})}};async function Vl(Z,X,W,V,l){let K=await l.deriveIdentity(Z,X),G=new i,m=new i,R=0,J=0;for(let y of W){let L=new i,M=L.writeStruct(YZ,y.head);if(M!==0)return Y(M);let p=L.result(),S=await K.kdmFor(p),H=l.deriveCipher(S,"encrypt"),B=await H.encrypt(p),O=y.body?await H.encrypt(y.body):new Uint8Array(0),U=y.head.len>0&&y.head.hsh!==void 0?O.length:0,E={kdm:S,headCph:B,lenBody:U,offBody:U>0?J:void 0},Q=G.writeStruct(fW,E);if(Q!==0)return Y(Q);if(y.body)m.writeBytes(O),J+=O.length;R++}let C=m.result(),F=G.result(),b=await V.blake3(F),c=await K.sign(b),k={lbl:Z,idx:X,num:R,hsh:b,sig:c},T=new i;T.writeStruct(vW,{head:k,indexEnc:F,bodyEnc:C});let I=T.result();return d(I)}async function ll(Z,X,W){let[V,l]=vW.decode(new P(Z));if(l!==0)return Y(l);let{head:K,indexEnc:G,bodyEnc:m}=V,R=await W.deriveIdentity(K.lbl,K.idx);if(!await X.checkSigEd25519(K.sig,K.hsh,R.publicKey))return Y(3);let C=await X.blake3(G);if(!e(C,K.hsh))return Y(19);let F=new P(G),b=[];for(let k=0;k<K.num;k++){let[T,I]=F.readStruct(fW);if(I!==0)return Y(I);b.push(T)}if(b.length!==K.num)return Y(14);let c=[];for(let k of b){let T=W.deriveCipher(k.kdm,"decrypt"),I;try{I=await T.decrypt(k.headCph)}catch{return Y(20)}let[y,L]=YZ.decode(new P(I));if(L!==0)return Y(L);let M;if(k.lenBody>0&&k.offBody!==void 0){if(y.hsh===void 0)return Y(14);let p=m.slice(k.offBody,k.offBody+k.lenBody);try{M=await T.decrypt(p)}catch{return Y(20)}let S=await X.blake3(M);if(!e(S,y.hsh))return Y(19)}c.push({head:y,body:M})}return d(c)}async function Kl({now:Z,bod:X,crypto:W}){let V=await W.genRandomBytes(8),l=new i,K=l.writeStruct(_,{id:V,ts:Z});if(K!==0)return Y(K);let G=l.result();return eX({now:Z,eid:G,ctr:0,bod:X,crypto:W})}async function eX({now:Z,eid:X,ctr:W,bod:V,crypto:l}){let K=new P(X),[G,m]=_.decode(K);if(m!==0)return Y(m);let R=Z.getTime()-G.ts.getTime(),J,C=V?.length??0;if(V&&C>0)J=await l.blake3(V);return d({eid:X,off:R,ctr:W,len:C,hsh:J})}function Gl(Z,X){let W=Z.length<X.length?Z.length:X.length;for(let V=0;V<W;V++)if(Z[V]!==X[V])return Z[V]-X[V];return Z.length-X.length}async function WX(Z,X){let W=Array.from(Z);W.sort(Gl);let V=0;for(let G of W)V+=G.length;let l=new Uint8Array(V),K=0;for(let G of W)l.set(G,K),K+=G.length;return X.blake3(l)}function ml(Z){let X=new i,W=X.writeVarBytes(Z.eid);if(W!==0)return Y(W);let V=X.writeDate(Z.updatedAt);if(V!==0)return Y(V);let l=X.writeVarInt(Z.ctr);if(l!==0)return Y(l);return d(X.result())}async function MX(Z,X){let W=[];for(let V of Z){let[l,K]=ml(V);if(K!==0||!l)return Y(K);W.push(l)}return d(await WX(W,X))}var AR=Symbol("MasterSeed"),oR=Symbol("SealedMasterKey"),dZ=32,$W=24+dZ+16;function ZZ(Z){if(Z.byteLength!==dZ)return Y(10);return d(Z)}function LZ(Z){if(Z.byteLength!==$W)return Y(10);return d(Z)}var vR=Symbol("EntityID");function Yl(Z){return"type"in Z}var fR=Symbol("DerivationSeed"),$R=Symbol("PublicKey"),qR=Symbol("PrivateKey"),aR=Symbol("HostSpecificKeyPair"),_R=Symbol("Hash");function j0(Z){if(!Z)return!1;if(typeof Z!=="object")return!1;if("body"in Z===!1)return!1;if("type"in Z===!1)return!1;return!0}function E0(Z){if(!Z.bod||Z.bod.length===0){let V={off:Z.off,ctr:Z.ctr,eid:Z.eid};return d(V)}let X=iW(Z.bod);if(j0(X)===!1)return console.warn("msg body invalid",X),Y(14);let W={off:Z.off,ctr:Z.ctr,eid:Z.eid,gid:X.gid,pid:X.pid,tags:X.tags,type:X.type,body:X.body};return d(W)}class zX{applier;emitter=new gZ;clearer;onDirtyEids;cacheDriven;peerIngest;constructor(Z,X,W,V){this.applier=Z;this.clearer=X,this.onDirtyEids=W,this.cacheDriven=V?.cacheDriven??!1,this.peerIngest=V?.peerIngest}apply=async(Z)=>{let X=[],W=[];for(let m of Z){let[R,J]=E0(m);if(W.push(J),J!==0)continue;X.push(R)}let{stats:V,types:l,eids:K}=await this.applier(X),G=[];for(let m=0;m<Z.length;m++){let R=W[m],J=V[m];if(R!==0){G.push(R);continue}if(J!==0){G.push(J);continue}G.push(0)}if(!this.cacheDriven)for(let m of l)this.emitter.emit(m,null);if(K.length>0)this.onDirtyEids?.(K);return G};clear=async()=>{let Z=await this.clearer();if(Z!==0)return Z;return this.emitter.emitAll(null),Z};notify=(Z)=>{for(let X of Z)this.emitter.emit(X,null)};refresh=async(Z)=>{if(this.peerIngest){await this.peerIngest(Z);return}};on=(Z,X)=>{this.emitter.addEventListener(Z,X)};off=(Z,X)=>{this.emitter.removeEventListener(Z,X)}}var qW={apply:async function(Z){return Z.map(()=>0)},clear:async function(){return 0},notify:function(Z){},refresh:async function(Z){},on:function(Z,X){},off:function(Z,X){}};var f="entities",ZW="entity_type_created_at",_W="entity_type_updated_at",sW="entity_type_group_id",rW="entity_type_parent_id",VX="entity_tags",Rl="db",Jl=13;function w0(Z){return"typ"in Z}function D0(Z){let X={bod:Z.body,crd:Z.createdAt,...Z.ctr!==0?{ctr:Z.ctr}:{},eid:g(Z.eid),gid:Z.gid,pid:Z.pid?g(Z.pid):void 0,tgs:Z.tags,typ:Z.type,upd:Z.updatedAt};if(X.gid===void 0)delete X.gid;if(X.pid===void 0)delete X.pid;if(X.tgs===void 0)delete X.tgs;if(X.ctr===void 0)delete X.ctr;return X}function A0(Z){if(!D(Z))return{eid:g(Z.eid),upd:Z.updatedAt,...Z.ctr!==0?{ctr:Z.ctr}:{}};return D0(Z)}function lX(Z){return{body:Z.bod,createdAt:Z.crd,updatedAt:Z.upd,ctr:Z.ctr??0,type:Z.typ,eid:t(Z.eid),gid:Z.gid,pid:Z.pid?t(Z.pid):void 0,...Z.tgs!==void 0?{tags:Z.tgs}:{}}}function aW(Z){if(w0(Z))return lX(Z);return{eid:t(Z.eid),updatedAt:Z.upd,ctr:Z.ctr??0}}class tW{db;opening;async init(){await this.ensureDb()}async ensureDb(){if(this.db)return this.db;if(this.opening)return this.opening;return this.opening=n0().then((Z)=>{return Z.onversionchange=()=>{if(Z.close(),this.db===Z)this.db=void 0},this.db=Z,this.opening=void 0,Z},(Z)=>{throw this.opening=void 0,Z}),this.opening}apply=async(Z)=>{let X=new Set,W=[],V;try{V=await this.ensureDb()}catch{return{stats:Z.map(()=>16),types:X,eids:W}}let l=V.transaction(f,"readwrite"),K=l.objectStore(f);return new Promise((G)=>{let m=Array(Z.length).fill(0);if(Z.length<1){G({stats:[],types:X,eids:W});return}l.oncomplete=()=>{G({stats:m,types:X,eids:W})},l.onerror=()=>{for(let J=0;J<m.length;J++)if(m[J]===void 0)m[J]=18;G({stats:m,types:X,eids:W})};let R=new Map;for(let J=0;J<Z.length;J++){let C=Z[J],F=g(C.eid),b={op:C,index:J},c=R.get(F);if(c)c.push(b);else R.set(F,[b])}for(let[J,C]of R){if(C.length<1)continue;let F=K.get(J);F.onsuccess=()=>{let b=F.result,c=b?aW(b):void 0,k=!1;for(let{op:T,index:I}of C){let[y,L]=KX(c,T);if(L!==0){m[I]=L;continue}if(y===void 0){m[I]=12;continue}k=!0;for(let M of GX(c,y))X.add(M);c=y}if(k)W.push(C[0].op.eid);if(c){let T=K.put(A0(c));T.onerror=(I)=>{I.preventDefault();for(let{index:y}of C)m[y]=18}}},F.onerror=()=>{for(let{index:b}of C)m[b]=18}}})};async clear(){let Z;try{Z=await this.ensureDb()}catch{return 16}let X=Z.transaction(f,"readwrite"),W=X.objectStore(f);return new Promise((V)=>{X.oncomplete=()=>V(0),X.onerror=()=>V(18),W.clear()})}async getRow(Z){let X;try{X=await this.ensureDb()}catch{return Y(16)}let W=g(Z),l=X.transaction(f,"readonly").objectStore(f);return new Promise((K)=>{let G=l.get(W);G.onsuccess=()=>{let m=G.result;if(!m)K(d(void 0));else K(d(aW(m)))},G.onerror=()=>K(Y(18))})}async getEnt(Z){let[X,W]=await this.getRow(Z);if(W!==0)return Y(W);if(X===void 0||!D(X))return d(void 0);return d(X)}async getAllOfTypeUpdatedBetween(Z,X,W){let V;try{V=await this.ensureDb()}catch{return Y(16)}let K=V.transaction(f,"readonly").objectStore(f).index(_W);return new Promise((G)=>{let m=K.getAll(IDBKeyRange.bound([Z,X],[Z,W]));m.onsuccess=()=>{let R=m.result;G(d(R.map(lX)))},m.onerror=()=>G(Y(18))})}async getGroupMembers(Z,X){let W;try{W=await this.ensureDb()}catch{return Y(16)}let l=W.transaction(f,"readonly").objectStore(f).index(sW);return new Promise((K)=>{let G=l.getAll(IDBKeyRange.only([Z,X]));G.onsuccess=()=>{let m=G.result;K(d(m.map(lX)))},G.onerror=()=>K(Y(18))})}async getAllOfType(Z){let X;try{X=await this.ensureDb()}catch{return Y(16)}let V=X.transaction(f,"readonly").objectStore(f).index(ZW);return new Promise((l)=>{let K=V.getAll(IDBKeyRange.bound([Z],[Z,[]]));K.onsuccess=()=>{let G=K.result;l(d(G.map(lX)))},K.onerror=()=>l(Y(18))})}async getByTag(Z,X){let W;try{W=await this.ensureDb()}catch{return Y(16)}let l=W.transaction(f,"readonly").objectStore(f).index(VX);return new Promise((K)=>{let G=l.getAll(IDBKeyRange.only(X));G.onsuccess=()=>{let R=G.result.filter((J)=>J.typ===Z).map(lX);K(d(R))},G.onerror=()=>K(Y(18))})}async getAllEntities(Z){if("pid"in Z){let X;try{X=await this.ensureDb()}catch{return Y(16)}let W=g(Z.pid),l=X.transaction(f,"readonly").objectStore(f).index(rW);return new Promise((K)=>{let G=l.getAll(IDBKeyRange.only([Z.type,W]));G.onsuccess=()=>{let R=G.result.map(lX);K(d(R))},G.onerror=()=>K(Y(18))})}else if("gid"in Z)return await this.getGroupMembers(Z.type,Z.gid);else if("tag"in Z)return await this.getByTag(Z.type,Z.tag);else if("updatedBetween"in Z)return await this.getAllOfTypeUpdatedBetween(Z.type,Z.updatedBetween.start,Z.updatedBetween.end);return await this.getAllOfType(Z.type)}async getEntities(Z){let[X,W]=await this.getAllEntities(Z);if(W!==0)return Y(W);return d(X)}async countEntities({type:Z}){let X;try{X=await this.ensureDb()}catch{return Y(16)}let V=X.transaction(f,"readonly").objectStore(f).index(ZW);return new Promise((l)=>{let K=IDBKeyRange.bound([Z],[Z,[]]),G=V.count(K);G.onsuccess=()=>l(d(G.result)),G.onerror=()=>l(Y(18))})}async checksum(Z){let X;try{X=await this.ensureDb()}catch{return Y(16)}let V=X.transaction(f,"readonly").objectStore(f),l=[];return new Promise((K)=>{let G=V.openCursor();G.onsuccess=()=>{let m=G.result;if(m){let R=m.value;l.push(hX(aW(R))),m.continue()}else MX(l,Z).then(K)},G.onerror=()=>K(Y(18))})}}function o0(Z,X){if(!Z.objectStoreNames.contains(f))Z.createObjectStore(f,{keyPath:"eid",autoIncrement:!1});let W=X.objectStore(f);if(!W.indexNames.contains(ZW))W.createIndex(ZW,["typ","crd"],{unique:!1});if(!W.indexNames.contains(_W))W.createIndex(_W,["typ","upd"],{unique:!1});if(!W.indexNames.contains(sW))W.createIndex(sW,["typ","gid"],{unique:!1});if(!W.indexNames.contains(rW))W.createIndex(rW,["typ","pid"],{unique:!1});if(W.indexNames.contains(VX)){if(W.index(VX).keyPath!=="tgs")W.deleteIndex(VX)}if(!W.indexNames.contains(VX))W.createIndex(VX,"tgs",{unique:!1,multiEntry:!0})}function n0(){return new Promise((Z,X)=>{let W=indexedDB.open(Rl,Jl);W.onupgradeneeded=()=>{let{result:V,transaction:l}=W;if(!l){X(Error("Transaction is null during EntDB upgrade"));return}try{o0(V,l)}catch(K){X(K instanceof Error?K:Error(String(K)))}},W.onblocked=()=>{console.warn(`[DIPLOMATIC] EntDB IDB upgrade blocked (${Rl} → v${Jl}); waiting for other connections to close`)},W.onsuccess=()=>Z(W.result),W.onerror=()=>X(W.error??Error("EntDB IndexedDB open failed"))})}async function Cl(){let Z=new tW;return await Z.init(),Z}class XW{ents=new Map;useIndex;byType=new Map;byTypePid=new Map;byTypeGid=new Map;byTypeTag=new Map;constructor(Z=[],X){this.useIndex=X?.indexes!==!1;for(let W of Z)this.put(W)}put(Z){let X=g(Z.eid),W=this.ents.get(X);if(W!==void 0&&D(W))this.unindex(X,W);if(this.ents.set(X,Z),D(Z))this.index(X,Z)}del(Z){let X=this.ents.get(Z);if(X===void 0)return;if(D(X))this.unindex(Z,X);this.ents.delete(Z)}index(Z,X){if(!this.useIndex)return;let W=this.byType.get(X.type);if(!W)W=new Map,this.byType.set(X.type,W);if(W.set(Z,X),X.pid){let V=g(X.pid),l=this.byTypePid.get(X.type);if(!l)l=new Map,this.byTypePid.set(X.type,l);let K=l.get(V);if(!K)K=new Map,l.set(V,K);K.set(Z,X)}if(typeof X.gid==="string"){let V=this.byTypeGid.get(X.type);if(!V)V=new Map,this.byTypeGid.set(X.type,V);let l=V.get(X.gid);if(!l)l=new Map,V.set(X.gid,l);l.set(Z,X)}if(X.tags){let V=this.byTypeTag.get(X.type);if(!V)V=new Map,this.byTypeTag.set(X.type,V);for(let l of X.tags){let K=V.get(l);if(!K)K=new Map,V.set(l,K);K.set(Z,X)}}}unindex(Z,X){if(!this.useIndex)return;let W=this.byType.get(X.type);if(W){if(W.delete(Z),W.size===0)this.byType.delete(X.type)}if(X.pid){let V=g(X.pid),l=this.byTypePid.get(X.type),K=l?.get(V);if(K){if(K.delete(Z),K.size===0)l?.delete(V)}if(l&&l.size===0)this.byTypePid.delete(X.type)}if(typeof X.gid==="string"){let V=this.byTypeGid.get(X.type),l=V?.get(X.gid);if(l){if(l.delete(Z),l.size===0)V?.delete(X.gid)}if(V&&V.size===0)this.byTypeGid.delete(X.type)}if(X.tags){let V=this.byTypeTag.get(X.type);if(V){for(let l of X.tags){let K=V.get(l);if(K){if(K.delete(Z),K.size===0)V.delete(l)}}if(V.size===0)this.byTypeTag.delete(X.type)}}}clearIndexes(){this.byType.clear(),this.byTypePid.clear(),this.byTypeGid.clear(),this.byTypeTag.clear()}bucketList(Z){if(!Z||Z.size===0)return[];let X=[];for(let W of Z.values())X.push(W);return X}async apply(Z){let X=new Set,W=[],V=[];for(let l of Z){let K=g(l.eid),G=this.ents.get(K),[m,R]=KX(G,l);if(R!==0){V.push(R);continue}if(m===void 0){V.push(12);continue}for(let J of GX(G,m))X.add(J);this.put(m),W.push(l.eid),V.push(0)}return{stats:V,types:X,eids:W}}async clear(){return this.ents.clear(),this.clearIndexes(),0}async getRow(Z){let X=g(Z),W=this.ents.get(X);return d(W)}async getEnt(Z){let[X,W]=await this.getRow(Z);if(W!==0)return Y(W);if(X===void 0||!D(X))return d(void 0);return d(X)}async getAllEntities({type:Z,gid:X,pid:W,tag:V,updatedBetween:l}){if(this.useIndex){if(W!==void 0){let G=g(W);return d(this.bucketList(this.byTypePid.get(Z)?.get(G)))}if(X!==void 0)return d(this.bucketList(this.byTypeGid.get(Z)?.get(X)));if(V!==void 0)return d(this.bucketList(this.byTypeTag.get(Z)?.get(V)));if(l!==void 0){let G=[],m=this.byType.get(Z);if(m){for(let R of m.values())if(R.updatedAt>=l.start&&R.updatedAt<=l.end)G.push(R)}return d(G)}return d(this.bucketList(this.byType.get(Z)))}let K=[];if(W!==void 0){for(let G of this.ents.values())if(D(G)&&G.type===Z&&G.pid&&e(G.pid,W))K.push(G)}else if(X!==void 0){for(let G of this.ents.values())if(D(G)&&G.type===Z&&(typeof G.gid==="string"&&G.gid===X))K.push(G)}else if(V!==void 0){for(let G of this.ents.values())if(D(G)&&G.type===Z&&G.tags&&G.tags.includes(V))K.push(G)}else if(l!==void 0){for(let G of this.ents.values())if(D(G)&&G.type===Z&&G.updatedAt>=l.start&&G.updatedAt<=l.end)K.push(G)}else for(let G of this.ents.values())if(D(G)&&G.type===Z)K.push(G);return d(K)}async getEntities(Z){let[X,W]=await this.getAllEntities(Z);if(W!==0)return Y(W);return d(X)}async countEntities({type:Z}){if(this.useIndex)return d(this.byType.get(Z)?.size??0);let X=0;for(let W of this.ents.values())if(D(W)&&W.type===Z)X+=1;return d(X)}async checksum(Z){let X=[];for(let W of this.ents.values())X.push(hX(W));return MX(X,Z)}}async function eW(Z){let X=await Cl();if(Z?.cache===!1)return X;return new SX(X,void 0,{indexes:Z?.indexes})}class SX{mem;durable;warmed=new Set;listeners=new Set;chain=Promise.resolve();constructor(Z,X,W){if(this.durable=Z,this.mem=new XW(X??[],{indexes:W?.indexes}),X)for(let V of X)this.warmed.add(V.type)}subscribe(Z){return this.listeners.add(Z),()=>{this.listeners.delete(Z)}}emit(Z){if(Z.size<1)return;for(let X of this.listeners)X(Z)}run(Z){let X=this.chain.then(Z,Z);return this.chain=X.then(()=>{return},()=>{return}),X}apply(Z){return this.run(async()=>{await this.pullEids(Z.map((K)=>K.eid));let X=_0(this.mem,Z);this.emit(X.types);let W=await this.durable.apply(Z),{changed:V,status:l}=await this.pullEids(Z.map((K)=>K.eid));if(this.emit(V),l!==0)return{stats:Z.map(()=>l),types:W.types,eids:W.eids};return W})}clear(){return this.run(async()=>{let Z=await this.durable.clear();if(Z!==0)return Z;let X=this.mem.ents.size>0;return await this.mem.clear(),this.warmed.clear(),0})}ingestFromDurable(Z){return this.run(async()=>{let{changed:X,status:W}=await this.pullEids(Z);return this.emit(X),W})}async pullEids(Z){let X=new Set,W=new Set;for(let V of Z){let l=g(V);if(W.has(l))continue;W.add(l);let K=this.mem.ents.get(l),[G,m]=await this.durable.getRow(V);if(m!==0)return{changed:X,status:m};if(G){if(this.mem.put(G),!K||!v0(K,G)){if(D(G))X.add(G.type);if(K!==void 0&&D(K))X.add(K.type)}}else if(K!==void 0){if(this.mem.del(l),D(K))X.add(K.type)}}return{changed:X,status:0}}async warmType(Z){if(this.warmed.has(Z))return 0;let[X,W]=await this.durable.getEntities({type:Z});if(W!==0)return W;if(X)for(let V of X){let l=g(V.eid),K=this.mem.ents.get(l);if(!K||a0(V,K))this.mem.put(V)}return this.warmed.add(Z),0}async getRow(Z){let X=g(Z);if(this.mem.ents.has(X))return this.mem.getRow(Z);return this.run(async()=>{if(this.mem.ents.has(X))return this.mem.getRow(Z);let[W,V]=await this.durable.getRow(Z);if(V!==0)return Y(V);if(W)this.mem.put(W);return d(W)})}async getEnt(Z){let[X,W]=await this.getRow(Z);if(W!==0)return Y(W);if(X===void 0||!D(X))return d(void 0);return d(X)}async getEntities(Z){if(!this.warmed.has(Z.type)){let X=await this.run(()=>this.warmType(Z.type));if(X!==0)return Y(X)}return this.mem.getEntities(Z)}async countEntities({type:Z}){if(!this.warmed.has(Z)){let X=await this.run(()=>this.warmType(Z));if(X!==0)return Y(X)}return this.mem.countEntities({type:Z})}async checksum(Z){return this.durable.checksum(Z)}}function v0(Z,X){if(D(Z)!==D(X))return!1;if(Z.ctr!==X.ctr)return!1;if(Z.updatedAt.getTime()!==X.updatedAt.getTime())return!1;if(!e(Z.eid,X.eid))return!1;if(!D(Z)||!D(X))return!0;if(Z.createdAt.getTime()!==X.createdAt.getTime())return!1;if(Z.type!==X.type)return!1;if(Z.gid!==X.gid)return!1;if(!$0(Z.pid,X.pid))return!1;if(!f0(Z.tags,X.tags))return!1;return q0(Z.body,X.body)}function f0(Z,X){if(Z===X)return!0;if(Z===void 0||X===void 0)return!1;if(Z.length!==X.length)return!1;for(let W=0;W<Z.length;W++)if(Z[W]!==X[W])return!1;return!0}function $0(Z,X){if(Z===void 0&&X===void 0)return!0;if(Z===void 0||X===void 0)return!1;return e(Z,X)}function q0(Z,X){if(Object.is(Z,X))return!0;if(Z instanceof Uint8Array&&X instanceof Uint8Array)return e(Z,X);if(Z instanceof Date&&X instanceof Date)return Z.getTime()===X.getTime();try{return e(AZ(Z),AZ(X))}catch{return!1}}function a0(Z,X){let W=Z.updatedAt.getTime(),V=X.updatedAt.getTime();if(W!==V)return W>V;return Z.ctr>X.ctr}function _0(Z,X){let W=new Set,V=[];for(let l of X){let K=g(l.eid),G=Z.ents.get(K),[m,R]=KX(G,l);if(R!==0){V.push(R);continue}if(m===void 0){V.push(12);continue}for(let J of GX(G,m))W.add(J);Z.put(m),V.push(0)}return{stats:V,types:W}}function WW(Z){if(Z instanceof SX){let X=new zX((W)=>Z.apply(W),()=>Z.clear(),void 0,{cacheDriven:!0,peerIngest:async(W)=>{await Z.ingestFromDurable(W)}});return Z.subscribe((W)=>X.notify(W)),X}return new zX((X)=>Z.apply(X),()=>Z.clear())}function D(Z){return"type"in Z}function s0(Z){return!D(Z)}function Fl(Z){if(!Array.isArray(Z)||Z.length===0)return;let X=new Set,W=[];for(let V of Z){if(typeof V!=="string"||V.length===0)continue;if(X.has(V))continue;X.add(V),W.push(V)}return W.length>0?W:void 0}function hX(Z){return{eid:Z.eid,ctr:Z.ctr,updatedAt:Z.updatedAt}}function ZV(Z){let X=new P(Z.eid),[W,V]=X.readStruct(_);if(V!==0)return Y(V);return d({eid:Z.eid,ctr:Z.ctr,updatedAt:new Date(W.ts.getTime()+Z.off)})}function KX(Z,X){let W=new P(X.eid),[V,l]=W.readStruct(_);if(l!==0)return Y(l);let K=new Date(V.ts.getTime()+X.off);if(Z!==void 0&&K<=Z.updatedAt)return Y(15);if(Yl(X)){let G=Fl(X.tags);return d({eid:X.eid,gid:X.gid,pid:X.pid,...G!==void 0?{tags:G}:{},type:X.type,createdAt:V.ts,updatedAt:K,ctr:X.ctr,body:X.body})}return d({eid:X.eid,updatedAt:K,ctr:X.ctr})}function GX(Z,X){let W=new Set;if(Z!==void 0&&D(Z))W.add(Z.type);if(D(X))W.add(X.type);return[...W]}var r0={getEnt:async()=>Y(21),getRow:async()=>Y(21),getEntities:async(Z)=>Y(21),countEntities:async()=>Y(21),checksum:async()=>Y(21),apply:async(Z)=>({stats:Z.map(()=>21),types:new Set,eids:[]}),clear:async()=>21};class VW{inflight=null;again=!1;run(Z){if(this.again=!0,this.inflight)return this.inflight;return this.inflight=this.drain(Z),this.inflight}async flush(){if(!this.inflight)return;try{await this.inflight}catch{}}async drain(Z){try{this.again=!1;let X=await Z();while(this.again)this.again=!1,X=await Z();return X}finally{this.inflight=null}}}var lW=100;class NX{timer=null;delayMs;work;tail=new VW;constructor(Z,X){this.delayMs=Z<0?0:Z,this.work=X}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 dl(Z){let X=new P(Z.eid),[W,V]=_.decode(X);if(V!==0)return;return W.ts.getTime()+Z.off}function t0(Z,X){let W=dl(Z),V=dl(X);if(W===void 0&&V===void 0)return 0;if(W===void 0)return 1;if(V===void 0)return-1;if(V!==W)return V-W;return X.ctr-Z.ctr}function mX(Z,X){return Z.slice().sort((W,V)=>t0(X(W),X(V)))}var oZ={phase:"idle"},YX=50;function KW(Z,X,W){if(Z<=0||X<=0)return!1;if(Z===1||Z===X)return!0;return Z%W===0}function GW(Z,X){if(typeof navigator.msSaveOrOpenBlob==="function"){navigator.msSaveOrOpenBlob(Z,X);return}let W=URL.createObjectURL(Z),V=document.createElement("a");V.href=W,V.download=X,document.body.appendChild(V),V.click(),document.body.removeChild(V),URL.revokeObjectURL(W)}function bl(Z,X,W){let V=[],l=[],K=0;for(let G of Z){let m=X(G);if(l.length>0&&K+m>W)V.push(l),l=[],K=0;if(l.push(G),K+=m,K>=W)V.push(l),l=[],K=0}if(l.length>0)V.push(l);return V}async function XV(Z,X,W){let V=Z.length;if(V<1)return[];let l=Array(V),K=0,G=Math.min(Math.max(1,X),V),m=async()=>{while(!0){let J=K;if(K+=1,J>=V)return;l[J]=await W(Z[J],J)}},R=[];for(let J=0;J<G;J++)R.push(m());return await Promise.all(R),l}async function mW(Z,X,W,V){let l=new P(Z.headCph),[K,G]=l.readStruct(_X);if(G!==0)return Y(G);let{sig:m,kdm:R,headCph:J}=K;if(!await V.checkSigEd25519(m,J,X))return Y(3);let F=W.deriveCipher(R,"decrypt"),b;try{b=await F.decrypt(J)}catch{return Y(20)}return d({kdm:R,headEnc:b})}var yZ="f",UZ="t",cZ="e";function e0(Z){return Z===yZ||Z===UZ||Z===cZ}function RX(Z){if(Z===!0||Z===UZ)return UZ;if(Z===cZ)return cZ;return yZ}function ZK(Z){return RX(Z.apld)===yZ}function WV(Z){return Z!==0&&Z!==15&&Z!==18&&Z!==17}function nZ(Z,X,W){if(Z.apld=X,X===cZ&&W!==void 0)Z.err=W;else delete Z.err}async function uZ(Z,X,W,V){let l=V?.body!==!1,K=RX(X.apld),G=X.body,m=G?.length??0,R;if(l&&G&&m>0)R=await W.blake3(G);let J={eid:X.eid,off:X.off??0,ctr:X.ctr??0,len:m,hsh:R},C={hash:Z,head:J,apld:K};if(l&&G!==void 0)C.body=G;if(K===cZ&&X.err!==void 0)C.err=X.err;return C}var VV=1048576,lV=1048576,kl=64;function XK(Z){return Z.sig.length+Z.kdm.length+Z.headCph.length+Z.bodyCph.length}async function WK(Z,X,W,V,l){if(V.length<1)return 0;let[K,G]=await Z.push(V);if(G!==0)return G;if(!K)return 27;for(let R of K){if(R.status!==0){console.error("push err",R);continue}let J=l[R.idx];if(!J){console.error("no hash",R);continue}await X.uploads.deq(W,[J])}let m=await X.hosts.get(W);if(m){let R=m.lastSeq,J=R,C=[];for(let F of K)if(F.status===0)C.push(F.seq);C.sort((F,b)=>F-b);for(let F of C)if(F===R+1)R=F;if(R>J)await X.hosts.touch(W,R)}return 0}async function cl(Z,X){if(X.length<1)return d([]);let W=new Map,V=[];for(let m of X)W.set(m.seq,m),V.push(m.seq);let[l,K]=await Z.pull(V);if(K!==0)return Y(K);if(!l)return Y(27);let G=[];for(let{seq:m,bodyCph:R}of l){let J=W.get(m);if(!J)continue;G.push({dl:J,bodyCph:R})}return d(G)}async function VK(Z,X,W,V){if(V.length<1)return d({parts:[],hashes:[]});let l=[],K=[],G=[],m=new Map;for(let{dl:J,bodyCph:C}of V){let{head:F,kdm:b,seq:c,host:k}=J,[T,I]=await Tl(J,W);if(I!==0||!T){let U=m.get(k)??[];U.push(c),m.set(k,U);continue}let{headEnc:y,headEncHash:L}=T,M=X.deriveCipher(b,"decrypt"),[p,S]=await BW(y,C,M,W,L);if(S!==0||!p){let U=m.get(k)??[];U.push(c),m.set(k,U);continue}let H={head:F,body:p.bod},B=p.headHash;G.push({key:B,data:Ll(H)}),l.push(H),K.push(B);let O=m.get(k)??[];O.push(c),m.set(k,O)}let R=await Z.messages.add(G);for(let[J,C]of m)await Z.downloads.deq(J,C);for(let J=0;J<R.length;J++){let C=R[J];if(C!==0&&C!==15)console.error("ERR storing",z[C],"for message",J)}return d({parts:l,hashes:K})}async function Tl(Z,X){let W=Z.headEnc;if(!W){let l=new i,K=l.writeStruct(YZ,Z.head);if(K!==0)return Y(K);W=l.result()}if(Z.headEncHash)return d({headEnc:W,headEncHash:Z.headEncHash});let V=await X.blake3(W);return d({headEnc:W,headEncHash:V})}async function Il(Z,X,W){let V=new Set;for(let G of X)V.add(g(G));if(V.size<1)return;let l=Array.from(await Z.downloads.list());if(l.length<1)return;let K=new Map;for(let G of l){let m;if(G.headEncHash)m=g(G.headEncHash);else{let[J,C]=await Tl(G,W);if(C!==0||!J)continue;m=g(J.headEncHash)}if(!V.has(m))continue;let R=K.get(G.host)??[];R.push(G.seq),K.set(G.host,R)}for(let[G,m]of K)await Z.downloads.deq(G,m)}async function KV({conn:Z,store:X,enclave:W,host:V,crypto:l,onProgress:K,peekProgressEvery:G,peekConcurrency:m}){let R=await Z.identity(),J=[],[C,F]=await Z.peek(V.lastSeq);if(F!==0)return F;let b=C.length,c=G??YX,k=m??kl;if(K&&b>0)K({phase:"peek",host:V.label,done:0,total:b});let T=0,I=await XV(C,k,async(L)=>{let[M,p]=await mW(L,R.publicKey,W,l),S;if(p!==0||!M)S={ok:!1,seq:L.seq,stat:p};else{let H=await l.blake3(M.headEnc);S={ok:!0,seq:L.seq,kdm:M.kdm,headEnc:M.headEnc,headEncHash:H}}if(T+=1,K&&KW(T,b,c))K({phase:"peek",host:V.label,done:T,total:b});return S}),y=new Set;for(let L of I){if(!L.ok){console.error("peek: decrypting item head",L.stat);continue}let M=g(L.headEncHash);if(await X.messages.has(L.headEncHash)){console.info("peek: local msg; skip download, deq upload"),await X.uploads.deq(V.label,[L.headEncHash]),await X.downloads.deq(V.label,[L.seq]);continue}if(y.has(M)){await X.downloads.deq(V.label,[L.seq]);continue}let S=new P(L.headEnc),[H,B]=S.readStruct(YZ);if(B!==0){console.error("peek: reading item head",B);continue}y.add(M),J.push({kdm:L.kdm,head:H,seq:L.seq,host:V.label,headEnc:L.headEnc,headEncHash:L.headEncHash})}if(await X.downloads.enq(J),C.length>0){let L=Math.max(...C.map((M)=>M.seq));await X.hosts.recordStats(V.label,{lastSeq:L})}if(K)K({phase:"peek",host:V.label,done:b,total:b});return 0}async function pl({conn:Z,store:X,host:W,maxPushBytes:V,onProgress:l}){let K=V??VV,G=await X.uploads.list(W.label),m=G.length,R=0;if(l&&m>0)l({phase:"push",host:W.label,done:0,total:m});let J=[],C=[],F=0,b=async()=>{if(J.length<1)return 0;let c=J.length,k=await WK(Z,X,W.label,J,C);if(J=[],C=[],F=0,k===0){if(R+=c,l)l({phase:"push",host:W.label,done:R,total:m})}return k};for(let c of G){let k=await X.messages.get(c);if(!k){R+=1;continue}let T={...k.head,bod:k.body},[I,y]=await Z.seal(T);if(y!==0)return y;if(!I)return 12;let L=XK(I);if(J.length>0&&F+L>K){let M=await b();if(M!==0)return M}if(J.push(I),C.push(c),F+=L,F>=K){let M=await b();if(M!==0)return M}}return b()}async function GV({conn:Z,store:X,enclave:W,host:V,crypto:l,maxPullBytes:K,onProgress:G},m){let R=K??lV,J=await X.downloads.list(),C=Array.from(J).filter((I)=>I.host===V.label);if(C.length<1)return 15;let F=mX(C,(I)=>I.head),b=bl(F,(I)=>I.head.len,R),c=F.length,k=0;if(G)G({phase:"pull",host:V.label,done:0,total:c});let T=cl(Z,b[0]);for(let I=0;I<b.length;I++){let[y,L]=await T;if(L!==0||!y)return L;if(k+=b[I].length,G)G({phase:"pull",host:V.label,done:k,total:c});let M=b[I+1];if(M)T=cl(Z,M);if(G)G({phase:"open",host:V.label,done:k,total:c});let p=mX(y,(H)=>H.dl.head),[,S]=await VK(X,W,l,p);if(S!==0)return S;if(m){if(G)G({phase:"exec",host:V.label,done:k,total:c});await m()}}return 0}function Ll({head:Z,body:X}){let W={eid:Z.eid,body:X,apld:yZ};if(Z.off!==0)W.off=Z.off;if(Z.ctr!==0)W.ctr=Z.ctr;return W}async function yl(Z,{conn:X,store:W,enclave:V,host:l,crypto:K,onProgress:G},m){let R=l.label,J=await X.identity(),C=new P(Z),[F,b]=C.readStructs(aX);if(b!==0){console.error("Failed decoding notif",z[b]);return}let c=!1,T=(await W.hosts.get(R))?.lastSeq,I=[],y=!1;for(let p of F){let[S,H]=await mW({seq:p.seq,headCph:p.headCph},J.publicKey,V,K);if(H!==0){console.error("Failed decrypting notif",z[H]);continue}let B=await K.blake3(S.headEnc);if(await W.messages.has(B))continue;let O=new P(S.headEnc),[U,E]=O.readStruct(YZ);if(E!==0){console.error("Failed to parse head",z[E]);continue}if(!p.bodyCph&&U.len>0)y=!0,await W.downloads.enq([{seq:p.seq,host:R,kdm:S.kdm,head:U,headEnc:S.headEnc,headEncHash:B}]);else I.push({...S,head:U,bodyCph:p.bodyCph,headEncHash:B});if(T===void 0||p.seq!==T+1)console.log("out of seq",p.seq,T),c=!0;else T=p.seq}if(T!==void 0)await W.hosts.touch(l.label,T);let L=[];for(let p of I){let S=V.deriveCipher(p.kdm,"decrypt"),[H,B]=await BW(p.headEnc,p.bodyCph,S,K);if(B!==0){console.error("Failed to open body",z[B]);continue}L.push({key:p.headEncHash,data:Ll({head:p.head,body:H.bod})})}let M=await W.messages.add(L);for(let p=0;p<M.length;p++){let S=M[p];if(S!==0&&S!==15)console.error("ERR storing",z[S],"for message",p)}if(G&&L.length>0)G({phase:"open",host:l.label,done:L.length,total:L.length});if(c||y||L.length>0)m()}async function mV(Z,X={}){let W=X.pull!==!1,V=X.push===!0,{conn:l,store:K,enclave:G,host:m,crypto:R,onProgress:J,peekProgressEvery:C,peekConcurrency:F}=Z,b=await l.identity(),[c,k]=await l.peek(0);if(k!==0)return Y(k);let T=c.length,I=C??YX,y=F??kl;if(J&&T>0)J({phase:"peek",host:m.label,done:0,total:T});let L=0,M=await XV(c,y,async(x)=>{let[j,u]=await mW(x,b.publicKey,G,R),w;if(u!==0||!j)w={ok:!1,seq:x.seq,stat:u};else{let N=await R.blake3(j.headEnc);w={ok:!0,seq:x.seq,kdm:j.kdm,headEnc:j.headEnc,headEncHash:N}}if(L+=1,J&&KW(L,T,I))J({phase:"peek",host:m.label,done:L,total:T});return w}),p=new Map;for(let x of M){if(!x.ok)continue;let j=g(x.headEncHash),u=p.get(j);if(u)u.count+=1;else p.set(j,{hash:x.headEncHash,count:1,sample:x})}let S=0,H=[];for(let x of p.values()){if(x.count>1)S+=x.count-1;H.push(x.hash)}let B=c.length,O=p.size,U=await WX(H,R),E=[],Q=0;for(let x of p.values()){if(await K.messages.has(x.hash)){await K.uploads.deq(m.label,[x.hash]);continue}if(Q+=1,!W)continue;let u=x.sample,w=new P(u.headEnc),[N,q]=w.readStruct(YZ);if(q!==0){console.error("reconcile: reading msg header",q);continue}E.push({kdm:u.kdm,head:N,seq:u.seq,host:m.label,headEnc:u.headEnc,headEncHash:u.headEncHash})}if(E.length>0)await K.downloads.enq(E);let A=0;if(V){let x=await K.messages.listKeys(),j=new Set(p.keys()),u=[];for(let w of x)if(!j.has(g(w)))A+=1,u.push(w);if(u.length>0)await K.uploads.enq(m.label,u)}else{let x=await K.messages.listKeys(),j=new Set(p.keys());for(let u of x)if(!j.has(g(u)))A+=1}let n=c.length>0?Math.max(...c.map((x)=>x.seq)):0;if(await K.hosts.recordStats(m.label,{setLastSeq:n}),J)J({phase:"peek",host:m.label,done:T,total:T});return d({msgcheck:U,numBags:B,uniqueMsgs:O,numDupes:S,missingLocal:Q,missingHost:A})}class vZ{clock;state;store;transport;crypto;forceSkewHandlingByDefault;onScheduleSync;connections=new Map;applyChain=Promise.resolve();syncRuns=new VW;clientState;xferState;maxPushBytes;maxPullBytes;peekProgressEvery=YX;lastProgress=oZ;scheduledSync;constructor(Z,X,W,V,l,K=!0,G=VV,m=lV,R){this.clock=Z;this.state=X;this.store=W;this.transport=V;this.crypto=l;this.forceSkewHandlingByDefault=K;this.onScheduleSync=R;this.maxPushBytes=G,this.maxPullBytes=m,this.clientState=new bZ(()=>this.getClientState()),this.xferState=new bZ(()=>this.getXferState()),this.scheduledSync=new NX(lW,async()=>{try{console.info("Running scheduled sync"),await this.sync()}catch(J){console.error("Debounced sync failed:",J)}})}emitProgress=(Z)=>{this.lastProgress=Z,this.xferState.emit()};async setSeed(Z,X){await this.store.seed.save(Z,X),this.clientState.emit()}async getClientState(){let{store:Z,connections:X}=this,W=await Z.seed.load(),V=await Z.hosts.list(),l=!1;for(let K of X.values())if(K.isConnected()){l=!0;break}return{hasSeed:W!==void 0,hasHost:Array.from(V).length>0,connected:l}}async getXferState(){let{uploads:Z,downloads:X}=this.store,W=await Z.count();return{numDownloads:await X.count(),numUploads:W,progress:this.lastProgress}}apply=(Z,X)=>{return this.enqueueApplyJob(()=>this.doApply(Z,X))};async doApply(Z,X={enqueueUpload:!0,triggerUpload:!0}){let W=[],V=[];for(let{head:K,body:G}of Z){let m=new i;m.writeStruct(YZ,K);let R=m.result(),J=await this.crypto.blake3(R),C={eid:K.eid,body:G,apld:yZ};if(K.off!==0)C.off=K.off;if(K.ctr!==0)C.ctr=K.ctr;W.push(J),V.push({key:J,data:C})}await this.store.messages.add(V),await Il(this.store,W,this.crypto);let l=await this.doApplyHashes(W);if(X.enqueueUpload){let K=[];for(let G=0;G<W.length;G++){let m=l[G];if(m===0||m===15)K.push(W[G])}if(K.length>0){let G=await this.store.hosts.list();for(let m of G)await this.store.uploads.enq(m.label,K);this.xferState.emit()}}if(X.triggerUpload)this.scheduleSync();return l}enqueueApplyJob(Z){let X=this.applyChain.then(Z,Z);return this.applyChain=X.then(()=>{return},()=>{return}),X}drainApplyQueue(){return this.enqueueApplyJob(()=>this.doDrainApplyQueue())}async doDrainApplyQueue(){let Z=await this.store.messages.list({apld:yZ});if(Z.length<1)return[];let X=mX(Z,(W)=>W.head);return this.applyStored(X)}applyHashes=(Z)=>{return this.enqueueApplyJob(()=>this.doApplyHashes(Z))};async doApplyHashes(Z){let X=[];for(let l of Z){let K=await this.store.messages.get(l);if(K)X.push(K)}let W=await this.applyStored(X),V=new Map;for(let l=0;l<X.length;l++)V.set(g(X[l].hash),W[l]??12);return Z.map((l)=>V.get(g(l))??13)}async applyStored(Z){if(Z.length<1)return[];let X=Z.map((K)=>({...K.head,bod:K.body})),W=await this.state.apply(X),V=[],l=[];for(let K=0;K<Z.length;K++){let G=W[K];if(G===0||G===15)V.push(Z[K].hash);else if(G!==void 0&&WV(G))l.push({key:Z[K].hash,err:G})}if(V.length>0)await this.store.messages.markApplied(V);if(l.length>0)await this.store.messages.markFailed(l);return W}async insertRaw(Z){let{clock:X,crypto:W}=this,[V,l]=await Kl({now:X.now(),bod:Z,crypto:W});if(l!==0)return Y(l);let G=(await this.apply([{head:V,body:Z}]))[0];if(G!==0&&G!==15)return Y(G??12);return d(V)}async makeUpdate(Z,X){let{clock:W,crypto:V}=this,l=W.now();if(Z.updatedAt.getTime()>l.getTime())return Y(4);let K=Z.ctr+1,[G,m]=await eX({now:l,eid:Z.eid,ctr:K,bod:X,crypto:V});if(m!==0)return Y(m);return d({head:G,body:X})}async updateWithSkew(Z,X,W){if(W===!1)return Y(4);let{clock:V,crypto:l}=this,K=V.now(),G=new P(Z.eid),[m,R]=G.readStruct(_);if(R!==0)return Y(R);let J=Z.updatedAt.getTime()-m.ts.getTime(),C={eid:Z.eid,off:J+1,ctr:Z.ctr+1,len:0},b=(await this.apply([{head:C,body:void 0}]))[0];if(b!==0&&b!==15)return Y(b??12);if(X===void 0)return d(C);let[c,k]=XX({id:m.id,ts:K});if(k!==0)return Y(k);let[T,I]=await eX({now:K,eid:c,ctr:0,bod:X,crypto:l});if(I!==0)return Y(I);let L=(await this.apply([{head:T,body:X}]))[0];if(L!==0&&L!==15)return Y(L??12);return d(T)}async updateRaw(Z,X,W=this.forceSkewHandlingByDefault){if(Z.updatedAt.getTime()>this.clock.now().getTime())return this.updateWithSkew(Z,X,W);return this.enqueueApplyJob(async()=>{let[V,l]=await this.makeUpdate(Z,X);if(l!==0)return Y(l);let G=(await this.doApply([V]))[0];if(G!==0&&G!==15)return Y(G??12);return d(V.head)})}async insert(Z){let{body:X,type:W,gid:V,pid:l,tags:K}=Z,m=AZ({body:X,type:W,gid:V,pid:l,tags:K});return this.insertRaw(m)}async update(Z){let{prior:X,body:W,type:V,gid:l,pid:K,tags:G,force:m}=Z,J=AZ({body:W,type:V,gid:l,pid:K,tags:G});return this.updateRaw(X,J,m??this.forceSkewHandlingByDefault)}async delete(Z){let X=Z.force??!0;if("prior"in Z)return this.updateRaw(Z.prior,void 0,X);let[W,V]=await this.revFromArchive(Z.eid);if(V!==0)return Y(V);return this.updateRaw(W,void 0,X)}async revFromArchive(Z){let X=await this.store.messages.last(Z);if(X)return ZV(X.head);let W=new P(Z),[V,l]=W.readStruct(_);if(l!==0)return Y(l);return d({eid:Z,ctr:-1,updatedAt:V.ts})}async genEID(Z){let{clock:X,crypto:W}=this,V=X.now();if(Z!==void 0)return XX({id:Z,ts:V});let l=await W.genRandomBytes(8);return XX({id:l,ts:V})}sync(){return this.syncRuns.run(()=>this.doSync())}async doSync(){let{connections:Z,crypto:X,store:W}=this,V=await W.seed.load();if(!V)return 22;await this.drainApplyQueue();for(let[l,K]of Z){let G=await W.hosts.get(l);if(!G)continue;let m={conn:K,store:W,enclave:V,host:G,crypto:X,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},R=await KV(m);if(R!==0)return console.error(`Failed to peek: ${R}`),this.emitProgress({phase:"idle"}),R;this.xferState.emit();let J=await pl(m);if(J!==0)return console.error(`Failed to push: ${J}`),this.emitProgress({phase:"idle"}),J;this.xferState.emit();let C=await GV(m,async()=>{await this.drainApplyQueue()});if(C!==0&&C!==15)return console.error(`Failed to pull: ${C}`),this.emitProgress({phase:"idle"}),C;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async rebuild(Z){if(this.scheduledSync.cancel(),await this.syncRuns.flush(),Z?.checkHost??!0){let W=await this.repull();if(W!==0)return W}return this.enqueueApplyJob(()=>this.replay())}async msgcheck(){let Z=await this.store.messages.listKeys();return WX(Z,this.crypto)}listMsgs(Z){return this.store.messages.list(Z)}countMsgs(Z){return this.store.messages.count(Z)}async reconcile(Z,X){this.scheduledSync.cancel(),await this.syncRuns.flush();let{connections:W,crypto:V,store:l}=this,K=await l.seed.load();if(!K)return Y(22);let G=await l.hosts.get(Z);if(!G)return Y(13);let m=W.get(Z);if(!m||!m.isConnected()){if(await this.connectToHost(G,!1,!1),G=await l.hosts.get(Z),!G)return Y(13);m=W.get(Z)}if(!m)return Y(12);let R={conn:m,store:l,enclave:K,crypto:V,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},[J,C]=await mV({...R,host:G},X);if(this.xferState.emit(),C!==0)return this.emitProgress({phase:"idle"}),Y(C);if(!J)return this.emitProgress({phase:"idle"}),Y(12);if(X?.sync===!1)return this.emitProgress({phase:"idle"}),d(J);let F=await this.sync();if(F!==0)return Y(F);let b=await l.hosts.get(Z);if(!b)return Y(13);let[c,k]=await mV({...R,host:b},{pull:!1,push:!1});if(this.xferState.emit(),this.emitProgress({phase:"idle"}),k!==0)return Y(k);if(!c)return Y(12);return d(c)}async repull(){let{connections:Z,crypto:X,store:W}=this,V=await W.seed.load();if(!V)return 22;let l=Array.from(await W.hosts.list());if(l.length<1)return 0;for(let K of l){let G=Z.get(K.label);if(!G||!G.isConnected())await this.connectToHost(K,!1,!1)}for(let[K,G]of Z){let m=await W.hosts.get(K);if(!m)continue;let R={conn:G,store:W,enclave:V,host:{...m,lastSeq:0},crypto:X,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery},J=await KV(R);if(J!==0)return console.error(`rebuild: failed to peek: ${J}`),this.emitProgress({phase:"idle"}),J;this.xferState.emit();let C=await GV(R);if(C!==0&&C!==15)return console.error(`rebuild: failed to pull: ${C}`),this.emitProgress({phase:"idle"}),C;this.xferState.emit()}return this.emitProgress({phase:"idle"}),0}async replay(){let Z=await this.state.clear();if(Z!==0)return Z;let X=await this.store.messages.list(),W=mX(X,(K)=>K.head),V=W.length;if(V<1)return this.emitProgress({phase:"idle"}),0;let l=0;while(l<W.length){let K=0,G=0,m=l;for(let J=l;J<W.length&&G<100&&K<102400;J++)K+=W[J].head.len,G++,m=J+1;let R=W.slice(l,m);await this.applyStored(R),this.emitProgress({phase:"exec",done:m,total:V}),l=m}return this.emitProgress({phase:"idle"}),0}async wipe(Z){let X=Z?.msgs!==!1,W=Z?.ents!==!1,V=Z?.meta!==!1,l=Z?.seed===!0;this.scheduledSync.cancel(),await this.disconnect(),await this.syncRuns.flush();let{store:K}=this;if(V)await K.hosts.wipe(),await K.uploads.wipe(),await K.downloads.wipe();if(X)await K.messages.wipe();if(l)await K.seed.wipe();if(W)await this.state.clear();this.lastProgress=oZ,this.clientState.emit(),this.xferState.emit()}import=async(Z,X)=>{let{crypto:W,store:V}=this,l=X?.onProgress,K=await V.seed.load();if(!K)return 22;console.time("import: decoding file...");let G=await Z.bytes(),[m,R]=await ll(G,W,K);if(R!==0)return R;console.timeEnd("import: decoding file...");let J=0;while(J<m.length){let C=0,F=0,b=J;for(let T=J;T<m.length&&F<100&&C<102400;T++)C+=m[T].head.len,F++,b=T+1;let c=m.slice(J,b);console.time(`import: applying [${J}, ${b}]`);let k=await this.apply(c,{enqueueUpload:!0,triggerUpload:!1});console.timeEnd(`import: applying [${J}, ${b}]`);for(let T=0;T<c.length;T++){let I=k[T];if(I!==0&&I!==15)console.warn(`failed to import msg ${J+T}: ${z[I]}`)}if(l)queueMicrotask(()=>l(b,m.length,0));this.emitProgress({phase:"import",done:b,total:m.length}),J=b}return this.scheduleSync(),this.emitProgress({phase:"idle"}),0};scheduleSync=()=>{if(this.onScheduleSync){this.onScheduleSync();return}this.scheduledSync.schedule()};async exportBytes(){let{crypto:Z,store:X}=this,W=await X.seed.load();if(!W)return Y(22);let V=await X.messages.list();return Vl("export",0,V,Z,W)}async export(Z){let[X,W]=await this.exportBytes();if(W!==0)return W;if(!X)return 12;let V=new Blob([X.slice()]);return GW(V,Z),0}async link(Z,X=!0){if(await this.store.hosts.add(Z),this.clientState.emit(),X){let W=await this.store.hosts.get(Z.label);if(W)await this.connectToHost(W)}}async unlink(Z){await this.store.hosts.del(Z),this.clientState.emit()}async hosts(){return Array.from(await this.store.hosts.list())}connectToHost=async(Z,X=!0,W=!0)=>{let{clock:V,connections:l,crypto:K,store:G,transport:m}=this,R=l.get(Z.label);if(R){if(R.isConnected())return;try{R.closeListener()}catch{}l.delete(Z.label)}let J=await G.seed.load();if(!J)return;console.info(`Connecting to ${Z.handle} (${Z.label})`);let C=new tX(J,K,Z,V,m(Z),(F)=>G.hosts.set(Z.label,F));if(await C.register(),X)await C.listen(async(F)=>{let b={conn:C,store:G,enclave:J,host:Z,crypto:K,maxPushBytes:this.maxPushBytes,maxPullBytes:this.maxPullBytes,onProgress:this.emitProgress,peekProgressEvery:this.peekProgressEvery};return yl(F,b,this.scheduleSync)},()=>this.clientState.emit(),()=>this.clientState.emit());if(l.set(Z.label,C),this.clientState.emit(),W)this.scheduleSync()};async connect(Z=!0,X=!0){let{connectToHost:W,scheduleSync:V,store:l}=this;if(!await l.seed.load())return;await this.drainApplyQueue();let G=await l.hosts.list();for(let m of G)await W(m,Z,!1);if(X)V()}disconnect=async()=>{for(let Z of this.connections.values())try{Z.closeListener()}catch{}this.connections.clear(),this.clientState.emit()}}var fZ=typeof globalThis==="object"&&"crypto"in globalThis?globalThis.crypto:void 0;function YW(Z){if(!Number.isSafeInteger(Z)||Z<0)throw Error("positive integer expected, got "+Z)}function YV(Z){return Z instanceof Uint8Array||ArrayBuffer.isView(Z)&&Z.constructor.name==="Uint8Array"}function a(Z,...X){if(!YV(Z))throw Error("Uint8Array expected");if(X.length>0&&!X.includes(Z.length))throw Error("Uint8Array expected of length "+X+", got length="+Z.length)}function RV(Z,X=!0){if(Z.destroyed)throw Error("Hash instance has been destroyed");if(X&&Z.finished)throw Error("Hash#digest() has already been called")}function Ql(Z,X){a(Z);let W=X.outputLen;if(Z.length<W)throw Error("digestInto() expects output buffer of length at least "+W)}function JV(Z){if(typeof Z!=="boolean")throw Error(`boolean expected, not ${Z}`)}/*! noble-ciphers - MIT License (c) 2023 Paul Miller (paulmillr.com) */var QZ=(Z)=>new Uint32Array(Z.buffer,Z.byteOffset,Math.floor(Z.byteLength/4));var lK=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;if(!lK)throw Error("Non little-endian hardware is not supported");function KK(Z){if(typeof Z!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(Z))}function RW(Z){if(typeof Z==="string")Z=KK(Z);else if(YV(Z))Z=JW(Z);else throw Error("Uint8Array expected, got "+typeof Z);return Z}function Ml(Z,X){if(X==null||typeof X!=="object")throw Error("options must be defined");return Object.assign(Z,X)}function zl(Z,X){if(Z.length!==X.length)return!1;let W=0;for(let V=0;V<Z.length;V++)W|=Z[V]^X[V];return W===0}var hl=(Z,X)=>{function W(V,...l){if(a(V),Z.nonceLength!==void 0){let C=l[0];if(!C)throw Error("nonce / iv required");if(Z.varSizeNonce)a(C);else a(C,Z.nonceLength)}let K=Z.tagLength;if(K&&l[1]!==void 0)a(l[1]);let G=X(V,...l),m=(C,F)=>{if(F!==void 0){if(C!==2)throw Error("cipher output not supported");a(F)}},R=!1;return{encrypt(C,F){if(R)throw Error("cannot encrypt() twice with same key + nonce");return R=!0,a(C),m(G.encrypt.length,F),G.encrypt(C,F)},decrypt(C,F){if(a(C),K&&C.length<K)throw Error("invalid ciphertext length: smaller than tagLength="+K);return m(G.decrypt.length,F),G.decrypt(C,F)}}}return Object.assign(W,Z),W};function CV(Z,X,W=!0){if(X===void 0)return new Uint8Array(Z);if(X.length!==Z)throw Error("invalid output length, expected "+Z+", got: "+X.length);if(W&&!GK(X))throw Error("invalid output, must be aligned");return X}function GK(Z){return Z.byteOffset%4===0}function JW(Z){return Uint8Array.from(Z)}function kZ(...Z){for(let X=0;X<Z.length;X++)Z[X].fill(0)}function CW(Z=32){if(fZ&&typeof fZ.getRandomValues==="function")return fZ.getRandomValues(new Uint8Array(Z));if(fZ&&typeof fZ.randomBytes==="function")return fZ.randomBytes(Z);throw Error("crypto.getRandomValues must be defined")}var Nl=(Z)=>Uint8Array.from(Z.split("").map((X)=>X.charCodeAt(0))),mK=Nl("expand 16-byte k"),YK=Nl("expand 32-byte k"),RK=QZ(mK),JK=QZ(YK);function h(Z,X){return Z<<X|Z>>>32-X}function FV(Z){return Z.byteOffset%4===0}var FW=64,CK=16,gl=4294967295,Sl=new Uint32Array;function FK(Z,X,W,V,l,K,G,m){let R=l.length,J=new Uint8Array(FW),C=QZ(J),F=FV(l)&&FV(K),b=F?QZ(l):Sl,c=F?QZ(K):Sl;for(let k=0;k<R;G++){if(Z(X,W,V,C,G,m),G>=gl)throw Error("arx: counter overflow");let T=Math.min(FW,R-k);if(F&&T===FW){let I=k/4;if(k%4!==0)throw Error("arx: invalid block position");for(let y=0,L;y<CK;y++)L=I+y,c[L]=b[L]^C[y];k+=FW;continue}for(let I=0,y;I<T;I++)y=k+I,K[y]=l[y]^J[I];k+=T}}function xl(Z,X){let{allowShortKeys:W,extendNonceFn:V,counterLength:l,counterRight:K,rounds:G}=Ml({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},X);if(typeof Z!=="function")throw Error("core must be a function");return YW(l),YW(G),JV(K),JV(W),(m,R,J,C,F=0)=>{a(m),a(R),a(J);let b=J.length;if(C===void 0)C=new Uint8Array(b);if(a(C),YW(F),F<0||F>=gl)throw Error("arx: counter overflow");if(C.length<b)throw Error(`arx: output (${C.length}) is shorter than data (${b})`);let c=[],k=m.length,T,I;if(k===32)c.push(T=JW(m)),I=JK;else if(k===16&&W)T=new Uint8Array(32),T.set(m),T.set(m,16),I=RK,c.push(T);else throw Error(`arx: invalid 32-byte key, got length=${k}`);if(!FV(R))c.push(R=JW(R));let y=QZ(T);if(V){if(R.length!==24)throw Error("arx: extended nonce must be 24 bytes");V(I,y,QZ(R.subarray(0,16)),y),R=R.subarray(16)}let L=16-l;if(L!==R.length)throw Error(`arx: nonce must be ${L} or 16 bytes`);if(L!==12){let p=new Uint8Array(12);p.set(R,K?0:12-R.length),R=p,c.push(R)}let M=QZ(R);return FK(Z,I,y,M,J,C,F,G),kZ(...c),C}}var r=(Z,X)=>Z[X++]&255|(Z[X++]&255)<<8;class Hl{constructor(Z){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,Z=RW(Z),a(Z,32);let X=r(Z,0),W=r(Z,2),V=r(Z,4),l=r(Z,6),K=r(Z,8),G=r(Z,10),m=r(Z,12),R=r(Z,14);this.r[0]=X&8191,this.r[1]=(X>>>13|W<<3)&8191,this.r[2]=(W>>>10|V<<6)&7939,this.r[3]=(V>>>7|l<<9)&8191,this.r[4]=(l>>>4|K<<12)&255,this.r[5]=K>>>1&8190,this.r[6]=(K>>>14|G<<2)&8191,this.r[7]=(G>>>11|m<<5)&8065,this.r[8]=(m>>>8|R<<8)&8191,this.r[9]=R>>>5&127;for(let J=0;J<8;J++)this.pad[J]=r(Z,16+2*J)}process(Z,X,W=!1){let V=W?0:2048,{h:l,r:K}=this,G=K[0],m=K[1],R=K[2],J=K[3],C=K[4],F=K[5],b=K[6],c=K[7],k=K[8],T=K[9],I=r(Z,X+0),y=r(Z,X+2),L=r(Z,X+4),M=r(Z,X+6),p=r(Z,X+8),S=r(Z,X+10),H=r(Z,X+12),B=r(Z,X+14),O=l[0]+(I&8191),U=l[1]+((I>>>13|y<<3)&8191),E=l[2]+((y>>>10|L<<6)&8191),Q=l[3]+((L>>>7|M<<9)&8191),A=l[4]+((M>>>4|p<<12)&8191),n=l[5]+(p>>>1&8191),x=l[6]+((p>>>14|S<<2)&8191),j=l[7]+((S>>>11|H<<5)&8191),u=l[8]+((H>>>8|B<<8)&8191),w=l[9]+(B>>>5|V),N=0,q=N+O*G+U*(5*T)+E*(5*k)+Q*(5*c)+A*(5*b);N=q>>>13,q&=8191,q+=n*(5*F)+x*(5*C)+j*(5*J)+u*(5*R)+w*(5*m),N+=q>>>13,q&=8191;let XZ=N+O*m+U*G+E*(5*T)+Q*(5*k)+A*(5*c);N=XZ>>>13,XZ&=8191,XZ+=n*(5*b)+x*(5*F)+j*(5*C)+u*(5*J)+w*(5*R),N+=XZ>>>13,XZ&=8191;let KZ=N+O*R+U*m+E*G+Q*(5*T)+A*(5*k);N=KZ>>>13,KZ&=8191,KZ+=n*(5*c)+x*(5*b)+j*(5*F)+u*(5*C)+w*(5*J),N+=KZ>>>13,KZ&=8191;let v=N+O*J+U*R+E*m+Q*G+A*(5*T);N=v>>>13,v&=8191,v+=n*(5*k)+x*(5*c)+j*(5*b)+u*(5*F)+w*(5*C),N+=v>>>13,v&=8191;let IZ=N+O*C+U*J+E*R+Q*m+A*G;N=IZ>>>13,IZ&=8191,IZ+=n*(5*T)+x*(5*k)+j*(5*c)+u*(5*b)+w*(5*F),N+=IZ>>>13,IZ&=8191;let qZ=N+O*F+U*C+E*J+Q*R+A*m;N=qZ>>>13,qZ&=8191,qZ+=n*G+x*(5*T)+j*(5*k)+u*(5*c)+w*(5*b),N+=qZ>>>13,qZ&=8191;let aZ=N+O*b+U*F+E*C+Q*J+A*R;N=aZ>>>13,aZ&=8191,aZ+=n*m+x*G+j*(5*T)+u*(5*k)+w*(5*c),N+=aZ>>>13,aZ&=8191;let _Z=N+O*c+U*b+E*F+Q*C+A*J;N=_Z>>>13,_Z&=8191,_Z+=n*R+x*m+j*G+u*(5*T)+w*(5*k),N+=_Z>>>13,_Z&=8191;let sZ=N+O*k+U*c+E*b+Q*F+A*C;N=sZ>>>13,sZ&=8191,sZ+=n*J+x*R+j*m+u*G+w*(5*T),N+=sZ>>>13,sZ&=8191;let rZ=N+O*T+U*k+E*c+Q*b+A*F;N=rZ>>>13,rZ&=8191,rZ+=n*C+x*J+j*R+u*m+w*G,N+=rZ>>>13,rZ&=8191,N=(N<<2)+N|0,N=N+q|0,q=N&8191,N=N>>>13,XZ+=N,l[0]=q,l[1]=XZ,l[2]=KZ,l[3]=v,l[4]=IZ,l[5]=qZ,l[6]=aZ,l[7]=_Z,l[8]=sZ,l[9]=rZ}finalize(){let{h:Z,pad:X}=this,W=new Uint16Array(10),V=Z[1]>>>13;Z[1]&=8191;for(let G=2;G<10;G++)Z[G]+=V,V=Z[G]>>>13,Z[G]&=8191;Z[0]+=V*5,V=Z[0]>>>13,Z[0]&=8191,Z[1]+=V,V=Z[1]>>>13,Z[1]&=8191,Z[2]+=V,W[0]=Z[0]+5,V=W[0]>>>13,W[0]&=8191;for(let G=1;G<10;G++)W[G]=Z[G]+V,V=W[G]>>>13,W[G]&=8191;W[9]-=8192;let l=(V^1)-1;for(let G=0;G<10;G++)W[G]&=l;l=~l;for(let G=0;G<10;G++)Z[G]=Z[G]&l|W[G];Z[0]=(Z[0]|Z[1]<<13)&65535,Z[1]=(Z[1]>>>3|Z[2]<<10)&65535,Z[2]=(Z[2]>>>6|Z[3]<<7)&65535,Z[3]=(Z[3]>>>9|Z[4]<<4)&65535,Z[4]=(Z[4]>>>12|Z[5]<<1|Z[6]<<14)&65535,Z[5]=(Z[6]>>>2|Z[7]<<11)&65535,Z[6]=(Z[7]>>>5|Z[8]<<8)&65535,Z[7]=(Z[8]>>>8|Z[9]<<5)&65535;let K=Z[0]+X[0];Z[0]=K&65535;for(let G=1;G<8;G++)K=(Z[G]+X[G]|0)+(K>>>16)|0,Z[G]=K&65535;kZ(W)}update(Z){RV(this);let{buffer:X,blockLen:W}=this;Z=RW(Z);let V=Z.length;for(let l=0;l<V;){let K=Math.min(W-this.pos,V-l);if(K===W){for(;W<=V-l;l+=W)this.process(Z,l);continue}if(X.set(Z.subarray(l,l+K),this.pos),this.pos+=K,l+=K,this.pos===W)this.process(X,0,!1),this.pos=0}return this}destroy(){kZ(this.h,this.r,this.buffer,this.pad)}digestInto(Z){RV(this),Ql(Z,this),this.finished=!0;let{buffer:X,h:W}=this,{pos:V}=this;if(V){X[V++]=1;for(;V<16;V++)X[V]=0;this.process(X,0,!0)}this.finalize();let l=0;for(let K=0;K<8;K++)Z[l++]=W[K]>>>0,Z[l++]=W[K]>>>8;return Z}digest(){let{buffer:Z,outputLen:X}=this;this.digestInto(Z);let W=Z.slice(0,X);return this.destroy(),W}}function dK(Z){let X=(V,l)=>Z(l).update(RW(V)).digest(),W=Z(new Uint8Array(32));return X.outputLen=W.outputLen,X.blockLen=W.blockLen,X.create=(V)=>Z(V),X}var dV=dK((Z)=>new Hl(Z));function bK(Z,X,W,V,l,K=20){let G=Z[0],m=X[0],R=X[1],J=X[2],C=X[3],F=Z[1],b=W[0],c=W[1],k=l,T=0,I=Z[2],y=X[4],L=X[5],M=X[6],p=X[7],S=Z[3],H=G,B=m,O=R,U=J,E=C,Q=F,A=b,n=c,x=k,j=T,u=I,w=y,N=L,q=M,XZ=p,KZ=S;for(let IZ=0;IZ<K;IZ+=2)E^=h(H+N|0,7),x^=h(E+H|0,9),N^=h(x+E|0,13),H^=h(N+x|0,18),j^=h(Q+B|0,7),q^=h(j+Q|0,9),B^=h(q+j|0,13),Q^=h(B+q|0,18),XZ^=h(u+A|0,7),O^=h(XZ+u|0,9),A^=h(O+XZ|0,13),u^=h(A+O|0,18),U^=h(KZ+w|0,7),n^=h(U+KZ|0,9),w^=h(n+U|0,13),KZ^=h(w+n|0,18),B^=h(H+U|0,7),O^=h(B+H|0,9),U^=h(O+B|0,13),H^=h(U+O|0,18),A^=h(Q+E|0,7),n^=h(A+Q|0,9),E^=h(n+A|0,13),Q^=h(E+n|0,18),w^=h(u+j|0,7),x^=h(w+u|0,9),j^=h(x+w|0,13),u^=h(j+x|0,18),N^=h(KZ+XZ|0,7),q^=h(N+KZ|0,9),XZ^=h(q+N|0,13),KZ^=h(XZ+q|0,18);let v=0;V[v++]=G+H|0,V[v++]=m+B|0,V[v++]=R+O|0,V[v++]=J+U|0,V[v++]=C+E|0,V[v++]=F+Q|0,V[v++]=b+A|0,V[v++]=c+n|0,V[v++]=k+x|0,V[v++]=T+j|0,V[v++]=I+u|0,V[v++]=y+w|0,V[v++]=L+N|0,V[v++]=M+q|0,V[v++]=p+XZ|0,V[v++]=S+KZ|0}function cK(Z,X,W,V){let l=Z[0],K=X[0],G=X[1],m=X[2],R=X[3],J=Z[1],C=W[0],F=W[1],b=W[2],c=W[3],k=Z[2],T=X[4],I=X[5],y=X[6],L=X[7],M=Z[3];for(let S=0;S<20;S+=2)R^=h(l+I|0,7),b^=h(R+l|0,9),I^=h(b+R|0,13),l^=h(I+b|0,18),c^=h(J+K|0,7),y^=h(c+J|0,9),K^=h(y+c|0,13),J^=h(K+y|0,18),L^=h(k+C|0,7),G^=h(L+k|0,9),C^=h(G+L|0,13),k^=h(C+G|0,18),m^=h(M+T|0,7),F^=h(m+M|0,9),T^=h(F+m|0,13),M^=h(T+F|0,18),K^=h(l+m|0,7),G^=h(K+l|0,9),m^=h(G+K|0,13),l^=h(m+G|0,18),C^=h(J+R|0,7),F^=h(C+J|0,9),R^=h(F+C|0,13),J^=h(R+F|0,18),T^=h(k+c|0,7),b^=h(T+k|0,9),c^=h(b+T|0,13),k^=h(c+b|0,18),I^=h(M+L|0,7),y^=h(I+M|0,9),L^=h(y+I|0,13),M^=h(L+y|0,18);let p=0;V[p++]=l,V[p++]=J,V[p++]=k,V[p++]=M,V[p++]=C,V[p++]=F,V[p++]=b,V[p++]=c}var bV=xl(bK,{counterRight:!0,extendNonceFn:cK}),cV=hl({blockSize:64,nonceLength:24,tagLength:16},(Z,X)=>{return{encrypt(W,V){V=CV(W.length+32,V,!1);let l=V.subarray(0,32),K=V.subarray(32);V.set(W,32),kZ(l),bV(Z,X,V,V);let G=dV(K,l);return V.set(G,16),kZ(V.subarray(0,16),G),V.subarray(16)},decrypt(W,V){a(W),V=CV(W.length+32,V,!1);let l=V.subarray(0,32),K=V.subarray(32,48),G=V.subarray(48);V.set(W,32),kZ(l);let m=bV(Z,X,l,l),R=dV(G,m);if(!zl(K,R))throw Error("invalid tag");return bV(Z,X,V.subarray(16),V.subarray(16)),kZ(l,K,R),G}}});/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function kK(Z){return Z instanceof Uint8Array||ArrayBuffer.isView(Z)&&Z.constructor.name==="Uint8Array"}function gX(Z){if(!Number.isSafeInteger(Z)||Z<0)throw Error("positive integer expected, got "+Z)}function $Z(Z,...X){if(!kK(Z))throw Error("Uint8Array expected");if(X.length>0&&!X.includes(Z.length))throw Error("Uint8Array expected of length "+X+", got length="+Z.length)}function xX(Z,X=!0){if(Z.destroyed)throw Error("Hash instance has been destroyed");if(X&&Z.finished)throw Error("Hash#digest() has already been called")}function dW(Z,X){$Z(Z);let W=X.outputLen;if(Z.length<W)throw Error("digestInto() expects output buffer of length at least "+W)}function Pl(Z){return new Uint8Array(Z.buffer,Z.byteOffset,Z.byteLength)}function JX(Z){return new Uint32Array(Z.buffer,Z.byteOffset,Math.floor(Z.byteLength/4))}function CX(...Z){for(let X=0;X<Z.length;X++)Z[X].fill(0)}function HX(Z,X){return Z<<32-X|Z>>>X}var il=(()=>new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68)();function Ul(Z){return Z<<24&4278190080|Z<<8&16711680|Z>>>8&65280|Z>>>24&255}var ul=il?(Z)=>Z:(Z)=>Ul(Z);function TK(Z){for(let X=0;X<Z.length;X++)Z[X]=Ul(Z[X]);return Z}var VZ=il?(Z)=>Z:TK;function IK(Z){if(typeof Z!=="string")throw Error("string expected");return new Uint8Array(new TextEncoder().encode(Z))}function FX(Z){if(typeof Z==="string")Z=IK(Z);return $Z(Z),Z}class kV{}function Ol(Z){let X=(V,l)=>Z(l).update(FX(V)).digest(),W=Z({});return X.outputLen=W.outputLen,X.blockLen=W.blockLen,X.create=(V)=>Z(V),X}var Bl=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);var bW=BigInt(4294967295),jl=BigInt(32);function TV(Z,X=!1){if(X)return{h:Number(Z&bW),l:Number(Z>>jl&bW)};return{h:Number(Z>>jl&bW)|0,l:Number(Z&bW)|0}}function MZ(Z,X,W,V,l){return Z=Z+X+l|0,V=HX(V^Z,16),W=W+V|0,X=HX(X^W,12),{a:Z,b:X,c:W,d:V}}function zZ(Z,X,W,V,l){return Z=Z+X+l|0,V=HX(V^Z,8),W=W+V|0,X=HX(X^W,7),{a:Z,b:X,c:W,d:V}}class IV extends kV{constructor(Z,X){super();this.finished=!1,this.destroyed=!1,this.length=0,this.pos=0,gX(Z),gX(X),this.blockLen=Z,this.outputLen=X,this.buffer=new Uint8Array(Z),this.buffer32=JX(this.buffer)}update(Z){xX(this),Z=FX(Z),$Z(Z);let{blockLen:X,buffer:W,buffer32:V}=this,l=Z.length,K=Z.byteOffset,G=Z.buffer;for(let m=0;m<l;){if(this.pos===X)VZ(V),this.compress(V,0,!1),VZ(V),this.pos=0;let R=Math.min(X-this.pos,l-m),J=K+m;if(R===X&&!(J%4)&&m+R<l){let C=new Uint32Array(G,J,Math.floor((l-m)/4));VZ(C);for(let F=0;m+X<l;F+=V.length,m+=X)this.length+=X,this.compress(C,F,!1);VZ(C);continue}W.set(Z.subarray(m,m+R),this.pos),this.pos+=R,this.length+=R,m+=R}return this}digestInto(Z){xX(this),dW(Z,this);let{pos:X,buffer32:W}=this;this.finished=!0,CX(this.buffer.subarray(X)),VZ(W),this.compress(W,0,!0),VZ(W);let V=JX(Z);this.get().forEach((l,K)=>V[K]=ul(l))}digest(){let{buffer:Z,outputLen:X}=this;this.digestInto(Z);let W=Z.slice(0,X);return this.destroy(),W}_cloneInto(Z){let{buffer:X,length:W,finished:V,destroyed:l,outputLen:K,pos:G}=this;return Z||(Z=new this.constructor({dkLen:K})),Z.set(...this.get()),Z.buffer.set(X),Z.destroyed=l,Z.finished=V,Z.length=W,Z.pos=G,Z.outputLen=K,Z}clone(){return this._cloneInto()}}function pV(Z,X,W,V,l,K,G,m,R,J,C,F,b,c,k,T,I,y,L,M){let p=0;for(let S=0;S<V;S++)({a:l,b:R,c:b,d:I}=MZ(l,R,b,I,W[X+Z[p++]])),{a:l,b:R,c:b,d:I}=zZ(l,R,b,I,W[X+Z[p++]]),{a:K,b:J,c,d:y}=MZ(K,J,c,y,W[X+Z[p++]]),{a:K,b:J,c,d:y}=zZ(K,J,c,y,W[X+Z[p++]]),{a:G,b:C,c:k,d:L}=MZ(G,C,k,L,W[X+Z[p++]]),{a:G,b:C,c:k,d:L}=zZ(G,C,k,L,W[X+Z[p++]]),{a:m,b:F,c:T,d:M}=MZ(m,F,T,M,W[X+Z[p++]]),{a:m,b:F,c:T,d:M}=zZ(m,F,T,M,W[X+Z[p++]]),{a:l,b:J,c:k,d:M}=MZ(l,J,k,M,W[X+Z[p++]]),{a:l,b:J,c:k,d:M}=zZ(l,J,k,M,W[X+Z[p++]]),{a:K,b:C,c:T,d:I}=MZ(K,C,T,I,W[X+Z[p++]]),{a:K,b:C,c:T,d:I}=zZ(K,C,T,I,W[X+Z[p++]]),{a:G,b:F,c:b,d:y}=MZ(G,F,b,y,W[X+Z[p++]]),{a:G,b:F,c:b,d:y}=zZ(G,F,b,y,W[X+Z[p++]]),{a:m,b:R,c,d:L}=MZ(m,R,c,L,W[X+Z[p++]]),{a:m,b:R,c,d:L}=zZ(m,R,c,L,W[X+Z[p++]]);return{v0:l,v1:K,v2:G,v3:m,v4:R,v5:J,v6:C,v7:F,v8:b,v9:c,v10:k,v11:T,v12:I,v13:y,v14:L,v15:M}}var TZ={CHUNK_START:1,CHUNK_END:2,PARENT:4,ROOT:8,KEYED_HASH:16,DERIVE_KEY_CONTEXT:32,DERIVE_KEY_MATERIAL:64},hZ=Bl.slice(),El=(()=>{let Z=Array.from({length:16},(V,l)=>l),X=(V)=>[2,6,3,10,7,0,4,13,1,11,12,5,9,14,15,8].map((l)=>V[l]),W=[];for(let V=0,l=Z;V<7;V++,l=X(l))W.push(...l);return Uint8Array.from(W)})();class LV extends IV{constructor(Z={},X=0){super(64,Z.dkLen===void 0?32:Z.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:W,context:V}=Z,l=V!==void 0;if(W!==void 0){if(l)throw Error('Only "key" or "context" can be specified at same time');let K=FX(W).slice();$Z(K,32),this.IV=JX(K),VZ(this.IV),this.flags=X|TZ.KEYED_HASH}else if(l){let K=FX(V),G=new LV({dkLen:32},TZ.DERIVE_KEY_CONTEXT).update(K).digest();this.IV=JX(G),VZ(this.IV),this.flags=X|TZ.DERIVE_KEY_MATERIAL}else this.IV=hZ.slice(),this.flags=X;this.state=this.IV.slice(),this.bufferOut=Pl(this.bufferOut32)}get(){return[]}set(){}b2Compress(Z,X,W,V=0){let{state:l,pos:K}=this,{h:G,l:m}=TV(BigInt(Z),!0),{v0:R,v1:J,v2:C,v3:F,v4:b,v5:c,v6:k,v7:T,v8:I,v9:y,v10:L,v11:M,v12:p,v13:S,v14:H,v15:B}=pV(El,V,W,7,l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],hZ[0],hZ[1],hZ[2],hZ[3],G,m,K,X);l[0]=R^I,l[1]=J^y,l[2]=C^L,l[3]=F^M,l[4]=b^p,l[5]=c^S,l[6]=k^H,l[7]=T^B}compress(Z,X=0,W=!1){let V=this.flags;if(!this.chunkPos)V|=TZ.CHUNK_START;if(this.chunkPos===15||W)V|=TZ.CHUNK_END;if(!W)this.pos=this.blockLen;if(this.b2Compress(this.chunksDone,V,Z,X),this.chunkPos+=1,this.chunkPos===16||W){let l=this.state;this.state=this.IV.slice();for(let K,G=this.chunksDone+1;W||!(G&1);G>>=1){if(!(K=this.stack.pop()))break;this.buffer32.set(K,0),this.buffer32.set(l,8),this.pos=this.blockLen,this.b2Compress(0,this.flags|TZ.PARENT,this.buffer32,0),l=this.state,this.state=this.IV.slice()}this.chunksDone++,this.chunkPos=0,this.stack.push(l)}this.pos=0}_cloneInto(Z){Z=super._cloneInto(Z);let{IV:X,flags:W,state:V,chunkPos:l,posOut:K,chunkOut:G,stack:m,chunksDone:R}=this;return Z.state.set(V.slice()),Z.stack=m.map((J)=>Uint32Array.from(J)),Z.IV.set(X),Z.flags=W,Z.chunkPos=l,Z.chunksDone=R,Z.posOut=K,Z.chunkOut=G,Z.enableXOF=this.enableXOF,Z.bufferOut32.set(this.bufferOut32),Z}destroy(){this.destroyed=!0,CX(this.state,this.buffer32,this.IV,this.bufferOut32),CX(...this.stack)}b2CompressOut(){let{state:Z,pos:X,flags:W,buffer32:V,bufferOut32:l}=this,{h:K,l:G}=TV(BigInt(this.chunkOut++));VZ(V);let{v0:m,v1:R,v2:J,v3:C,v4:F,v5:b,v6:c,v7:k,v8:T,v9:I,v10:y,v11:L,v12:M,v13:p,v14:S,v15:H}=pV(El,0,V,7,Z[0],Z[1],Z[2],Z[3],Z[4],Z[5],Z[6],Z[7],hZ[0],hZ[1],hZ[2],hZ[3],G,K,X,W);l[0]=m^T,l[1]=R^I,l[2]=J^y,l[3]=C^L,l[4]=F^M,l[5]=b^p,l[6]=c^S,l[7]=k^H,l[8]=Z[0]^T,l[9]=Z[1]^I,l[10]=Z[2]^y,l[11]=Z[3]^L,l[12]=Z[4]^M,l[13]=Z[5]^p,l[14]=Z[6]^S,l[15]=Z[7]^H,VZ(V),VZ(l),this.posOut=0}finish(){if(this.finished)return;this.finished=!0,CX(this.buffer.subarray(this.pos));let Z=this.flags|TZ.ROOT;if(this.stack.length)Z|=TZ.PARENT,VZ(this.buffer32),this.compress(this.buffer32,0,!0),VZ(this.buffer32),this.chunksDone=0,this.pos=this.blockLen;else Z|=(!this.chunkPos?TZ.CHUNK_START:0)|TZ.CHUNK_END;this.flags=Z,this.b2CompressOut()}writeInto(Z){xX(this,!1),$Z(Z),this.finish();let{blockLen:X,bufferOut:W}=this;for(let V=0,l=Z.length;V<l;){if(this.posOut>=X)this.b2CompressOut();let K=Math.min(X-this.posOut,l-V);Z.set(W.subarray(this.posOut,this.posOut+K),V),this.posOut+=K,V+=K}return Z}xofInto(Z){if(!this.enableXOF)throw Error("XOF is not possible after digest call");return this.writeInto(Z)}xof(Z){return gX(Z),this.xofInto(new Uint8Array(Z))}digestInto(Z){if(dW(Z,this),this.finished)throw Error("digest() was already called");return this.enableXOF=!1,this.writeInto(Z),this.destroy(),Z}digest(){return this.digestInto(new Uint8Array(this.outputLen))}}var wl=Ol((Z)=>new LV(Z));var yV=new Uint8Array([48,46,2,1,0,48,5,6,3,43,101,112,4,34,4,32]);function Dl(Z){let X=new Uint8Array(yV.length+32);return X.set(yV),X.set(Z.subarray(0,32),yV.length),X}function Al(Z){return typeof Z==="string"?new TextEncoder().encode(Z):Z}function dX(Z){let X=new ArrayBuffer(Z.byteLength);return new Uint8Array(X).set(Z),X}class QV{verifyKeys=new Map;signKeys=new Map;async genRandomBytes(Z){return CW(Z)}async gen256BitSecureRandomSeed(){return CW(32)}async encryptXSalsa20Poly1305Combined(Z,X){let W=CW(24),l=cV(X,W).encrypt(Z);return new Uint8Array([...W,...l])}async decryptXSalsa20Poly1305Combined(Z,X){let W=Z.slice(0,24),V=Z.slice(24);return cV(X,W).decrypt(V)}async deriveEd25519KeyPair(Z){let X=Z,W=Dl(X),V=await globalThis.crypto.subtle.importKey("pkcs8",dX(W),{name:"Ed25519"},!0,["sign"]),l=await globalThis.crypto.subtle.exportKey("jwk",V);if(typeof l.x!=="string")throw Error("Ed25519 JWK missing x");let K=await globalThis.crypto.subtle.importKey("jwk",{kty:"OKP",crv:"Ed25519",x:l.x},{name:"Ed25519"},!0,["verify"]),G=new Uint8Array(await globalThis.crypto.subtle.exportKey("raw",K)),m=new Uint8Array(64);return m.set(X,0),m.set(G,32),this.signKeys.set(GZ(X),V),this.verifyKeys.set(GZ(G),K),{keyType:"ed25519",privateKey:m,publicKey:G}}async importSignKey(Z){let X=Z.subarray(0,32),W=GZ(X),V=this.signKeys.get(W);if(V)return V;let l=Dl(X),K=await globalThis.crypto.subtle.importKey("pkcs8",dX(l),{name:"Ed25519"},!1,["sign"]);return this.signKeys.set(W,K),K}async importVerifyKey(Z){let X=GZ(Z),W=this.verifyKeys.get(X);if(W)return W;let V=await globalThis.crypto.subtle.importKey("raw",dX(Z),{name:"Ed25519"},!1,["verify"]);return this.verifyKeys.set(X,V),V}async signEd25519(Z,X){let W=Al(Z),V=await this.importSignKey(X),l=await globalThis.crypto.subtle.sign({name:"Ed25519"},V,dX(W));return new Uint8Array(l)}async checkSigEd25519(Z,X,W){let V=Al(X);try{let l=await this.importVerifyKey(W);return await globalThis.crypto.subtle.verify({name:"Ed25519"},l,dX(Z),dX(V))}catch{return!1}}async blake3(Z){return wl(Z)}}var pK=new QV,SZ=pK;import{useEffect as SW,useState as iV}from"react";class MV{db;constructor(Z){this.db=Z}async enq(Z){let X=[...Z];if(X.length===0)return;let W=this.db.transaction(RZ,"readwrite"),V=W.objectStore(RZ);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error);for(let G of X){let m=`${G.host}:${G.seq}`;V.put(G,m)}})}async deq(Z,X){let W=[...X];if(W.length===0)return;let V=this.db.transaction(RZ,"readwrite"),l=V.objectStore(RZ);return new Promise((K,G)=>{V.oncomplete=()=>K(),V.onerror=()=>G(V.error);for(let m of W){let R=`${Z}:${m}`;l.delete(R)}})}async list(){let X=this.db.transaction(RZ,"readonly").objectStore(RZ);return new Promise((W,V)=>{let l=X.getAll();l.onsuccess=()=>W(l.result),l.onerror=()=>V(l.error)})}async count(){let X=this.db.transaction(RZ,"readonly").objectStore(RZ);return new Promise((W,V)=>{let l=X.count();l.onsuccess=()=>W(l.result),l.onerror=()=>V(l.error)})}async wipe(){let Z=this.db.transaction(RZ,"readwrite"),X=Z.objectStore(RZ);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.clear()})}}function ol(Z){return{label:Z.label,handle:new URL(Z.handle),idx:Z.idx,lastSeq:Z.lastSeq||0,clockOffset:Z.clockOffset,subscription:Z.subscription}}function LK(Z,X){let W={...Z};if(X.setLastSeq!==void 0)W.lastSeq=X.setLastSeq;else if(X.lastSeq!==void 0){let V=W.lastSeq||0;if(X.lastSeq>V)W.lastSeq=X.lastSeq}return delete W.numBags,delete W.numDupes,W}class zV{db;constructor(Z){this.db=Z}async add(Z){return this.put({...Z,lastSeq:0})}async put(Z){let X={...Z,handle:Z.handle.toString(),lastSeq:Z.lastSeq??0},W=this.db.transaction(lZ,"readwrite"),V=W.objectStore(lZ);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error),V.put(X)})}async touch(Z,X){return this.recordStats(Z,{lastSeq:X})}async recordStats(Z,X){let W=this.db.transaction(lZ,"readwrite"),V=W.objectStore(lZ);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error);let G=V.get(Z);G.onsuccess=()=>{let m=G.result;if(!m)return;V.put(LK(m,X))}})}async get(Z){let W=this.db.transaction(lZ,"readonly").objectStore(lZ);return new Promise((V,l)=>{let K=W.get(Z);K.onsuccess=()=>{let G=K.result;if(!G)V(void 0);else V(ol(G))},K.onerror=()=>l(K.error)})}async set(Z,X){let W=await this.get(Z);if(!W)return 13;try{return await this.put({...W,...X}),0}catch{return 18}}async del(Z){let X=this.db.transaction(lZ,"readwrite"),W=X.objectStore(lZ);return new Promise((V,l)=>{X.oncomplete=()=>V(),X.onerror=()=>l(X.error),W.delete(Z)})}async list(){let X=this.db.transaction(lZ,"readonly").objectStore(lZ);return new Promise((W,V)=>{let l=X.getAll();l.onsuccess=()=>{let K=l.result;W(K.map(ol))},l.onerror=()=>V(l.error)})}async wipe(){let Z=this.db.transaction(lZ,"readwrite"),X=Z.objectStore(lZ);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.clear()})}}class hV{crypto;db;constructor(Z,X){this.crypto=X;this.db=Z}async add(Z){let X=this.db.transaction(o,"readwrite"),W=X.objectStore(o);return new Promise((V)=>{if(Z.length===0){V([]);return}let l=Array(Z.length).fill(0);X.oncomplete=()=>V(l),X.onerror=()=>{for(let K=0;K<l.length;K++)l[K]=18;V(l)};for(let K=0;K<Z.length;K++){let{key:G,data:m}=Z[K],R=g(G),J=W.put(m,R);J.onerror=(C)=>{C.preventDefault(),l[K]=18}}})}async del(Z){let X=[...Z];if(X.length===0)return;let W=this.db.transaction(o,"readwrite"),V=W.objectStore(o);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error);for(let G of X){let m=g(G);V.delete(m)}})}async get(Z){let W=this.db.transaction(o,"readonly").objectStore(o);return new Promise((V,l)=>{let K=g(Z),G=W.get(K);G.onsuccess=async()=>{let m=G.result;if(m)V(await uZ(Z,m,this.crypto));else V(void 0)},G.onerror=()=>l(G.error)})}async has(Z){return await this.get(Z)!==void 0}async list(Z){let X=Z?.apld,W=Z?.body!==!1,l=this.db.transaction(o,"readonly").objectStore(o);return new Promise((K,G)=>{let m=[],R=X===void 0?l.openCursor():l.index(PX).openCursor(IDBKeyRange.only(X));R.onsuccess=(J)=>{let C=J.target.result;if(C){let F=X===void 0?C.key:C.primaryKey,b=C.value;m.push({hash:t(F),data:b}),C.continue()}else Promise.all(m.map(({hash:F,data:b})=>uZ(F,b,this.crypto,{body:W}))).then(K).catch(G)},R.onerror=()=>G(R.error)})}async count(Z){let W=this.db.transaction(o,"readonly").objectStore(o);return new Promise((V,l)=>{let K=Z===void 0?W.count():W.index(PX).count(IDBKeyRange.only(Z));K.onsuccess=()=>V(K.result),K.onerror=()=>l(K.error)})}async listKeys(){let X=this.db.transaction(o,"readonly").objectStore(o);return new Promise((W,V)=>{let l=[],K=X.openKeyCursor();K.onsuccess=(G)=>{let m=G.target.result;if(m)l.push(t(m.key)),m.continue();else W(l)},K.onerror=()=>V(K.error)})}async last(Z){let W=this.db.transaction(o,"readonly").objectStore(o);return new Promise((V,l)=>{let K,G=W.openCursor();G.onsuccess=async(m)=>{let R=m.target.result;if(R){let{key:J,value:C}=R;if(e(Z,C.eid)){if(!K||(C.ctr??0)>(K.data.ctr??0)||(C.ctr??0)===(K.data.ctr??0)&&(C.off??0)>(K.data.off??0))K={key:J,data:C}}R.continue()}else if(K){let J=t(K.key);V(await uZ(J,K.data,this.crypto))}else V(void 0)},G.onerror=()=>l(G.error)})}async markApplied(Z){let X=[...Z];if(X.length===0)return;let W=this.db.transaction(o,"readwrite"),V=W.objectStore(o);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error);for(let G of X){let m=g(G),R=V.get(m);R.onsuccess=()=>{let J=R.result;if(!J)return;nZ(J,UZ),V.put(J,m)},R.onerror=(J)=>{J.preventDefault()}}})}async markFailed(Z){let X=[...Z];if(X.length===0)return;let W=this.db.transaction(o,"readwrite"),V=W.objectStore(o);return new Promise((l,K)=>{W.oncomplete=()=>l(),W.onerror=()=>K(W.error);for(let{key:G,err:m}of X){let R=g(G),J=V.get(R);J.onsuccess=()=>{let C=J.result;if(!C)return;nZ(C,cZ,m),V.put(C,R)},J.onerror=(C)=>{C.preventDefault()}}})}async wipe(){let Z=this.db.transaction(o,"readwrite"),X=Z.objectStore(o);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.clear()})}}var OZ={encode(Z,X){let W=Z.writeVarString(X.handle);if(W!==0)return W;let V=Z.writeVarString(X.label);if(V!==0)return V;return Z.writeVarInt(X.idx??0)},decode(Z){let[X,W]=Z.readVarString();if(W!==0)return Y(W);let[V,l]=Z.readVarString();if(l!==0)return Y(l);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);return d({handle:X,label:V,idx:K})}};var iX=1,cW={encode(Z,X){if(X.v!==iX)return 10;let[,W]=ZZ(X.masterSeed);if(W!==0)return W;let V=Z.writeVarInt(X.v);if(V!==0)return V;Z.writeBytes(X.masterSeed);let l=Z.writeVarInt(X.hosts.length);if(l!==0)return l;for(let K of X.hosts){let G=Z.writeStruct(OZ,K);if(G!==0)return G}return 0},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);if(X!==iX)return Y(14);let[V,l]=Z.readBytes(dZ);if(l!==0)return Y(l);if(V===void 0)return Y(14);let[K,G]=ZZ(V);if(G!==0)return Y(G);if(K===void 0)return Y(14);let[m,R]=Z.readVarInt();if(R!==0)return Y(R);if(m===void 0||m<0)return Y(10);let J=[];for(let C=0;C<m;C++){let[F,b]=Z.readStruct(OZ);if(b!==0)return Y(b);if(F===void 0)return Y(14);J.push(F)}return d({v:iX,masterSeed:K,hosts:J})}};function SV(Z,X){let[W,V]=ZZ(Z);if(V!==0)return Y(V);if(W===void 0)return Y(10);let[l,K]=ZZ(W.slice());if(K!==0)return Y(K);if(l===void 0)return Y(10);return d({v:iX,masterSeed:l,hosts:X.map((G)=>({handle:G.handle,label:G.label,idx:G.idx??0}))})}var UX={encode(Z,X){let[,W]=ZZ(X.masterSeed);if(W!==0)return W;Z.writeBytes(X.masterSeed);let V=Z.writeVarInt(X.hosts.length);if(V!==0)return V;for(let l of X.hosts){let K=Z.writeStruct(OZ,l);if(K!==0)return K}return 0},decode(Z){let[X,W]=Z.readBytes(dZ);if(W!==0)return Y(W);if(X===void 0)return Y(14);let[V,l]=ZZ(X);if(l!==0)return Y(l);if(V===void 0)return Y(14);let[K,G]=Z.readVarInt();if(G!==0)return Y(G);if(K===void 0||K<0)return Y(10);let m=[];for(let R=0;R<K;R++){let[J,C]=Z.readStruct(OZ);if(C!==0)return Y(C);if(J===void 0)return Y(14);m.push(J)}return d({masterSeed:V,hosts:m})}};function NZ(Z){let X=new Uint8Array(Z);if(Z>0)crypto.getRandomValues(X);return X}var BZ=32,nl=-7,vl=-8,fl=-257,uX=[{type:"public-key",alg:nl},{type:"public-key",alg:vl},{type:"public-key",alg:fl}];function kW(Z){return Z.trim().toLowerCase().replace(/\.$/,"")||"localhost"}function jZ(Z){let X=new Uint8Array(Z.byteLength);return X.set(Z),X}function EZ(Z){if(Z?.rpId!==void 0)return d(Z.rpId);if(typeof location>"u")return Y(9);return d(kW(location.hostname))}function wZ(){if(typeof navigator>"u"||!navigator.credentials||typeof PublicKeyCredential>"u")return 24;return 0}function DZ(Z){if(Z===null||Z.type!=="public-key"||!("rawId"in Z)||typeof Z.getClientExtensionResults!=="function")return Y(27);return d(Z)}async function OX(Z){if(typeof PublicKeyCredential>"u")return!1;let X=PublicKeyCredential.getClientCapabilities;if(typeof X!=="function")return!0;let W=await X.call(PublicKeyCredential);if(Z in W)return W[Z]===!0;return!0}function $l(){return OX("extension:largeBlob")}async function TW(Z){let X=wZ();if(X!==0)return Y(X);let[W,V]=EZ(Z);if(V!==0)return Y(V);if(W===void 0)return Y(9);let l=Z?.userName??"diplomatic-seed",K={residentKey:"required",requireResidentKey:!0,userVerification:"required"};if(Z?.authenticatorAttachment!==void 0)K.authenticatorAttachment=Z.authenticatorAttachment;let G={largeBlob:{support:"required"}},m;try{m=await navigator.credentials.create({publicKey:{challenge:NZ(BZ),rp:{id:W,name:Z?.rpName??"DIPLOMATIC"},user:{id:NZ(16),name:l,displayName:l},pubKeyCredParams:uX,authenticatorSelection:K,extensions:G}})}catch{return Y(24)}let[R,J]=DZ(m);if(J!==0)return Y(J);if(R===void 0)return Y(27);if(R.getClientExtensionResults().largeBlob?.supported!==!0)return Y(24);return d(new Uint8Array(R.rawId))}async function BX(Z,X,W){let V=wZ();if(V!==0)return V;let[l,K]=EZ(W);if(K!==0)return K;if(l===void 0)return 9;let G={largeBlob:{write:jZ(X)}},m;try{m=await navigator.credentials.get({publicKey:{challenge:NZ(BZ),rpId:l,allowCredentials:[{type:"public-key",id:jZ(Z)}],userVerification:"required",extensions:G}})}catch{return 24}let[R,J]=DZ(m);if(J!==0)return J;if(R===void 0)return 27;if(R.getClientExtensionResults().largeBlob?.written!==!0)return 24;return 0}async function IW(Z,X){let W=wZ();if(W!==0)return Y(W);let[V,l]=EZ(X);if(l!==0)return Y(l);if(V===void 0)return Y(9);let K={largeBlob:{read:!0}},G;try{let F={challenge:NZ(BZ),rpId:V,userVerification:"required",extensions:K};if(Z!==void 0)F.allowCredentials=[{type:"public-key",id:jZ(Z)}];G=await navigator.credentials.get({publicKey:F})}catch{return Y(24)}let[m,R]=DZ(G);if(R!==0)return Y(R);if(m===void 0)return Y(27);let C=m.getClientExtensionResults().largeBlob?.blob;if(C===void 0)return Y(7);return d({blob:new Uint8Array(C),credId:new Uint8Array(m.rawId)})}var jX=new TextEncoder().encode("diplomatic.prf.v1"),NV=32;async function yK(){return OX("extension:prf")}async function gV(Z){let X=wZ();if(X!==0)return Y(X);let[W,V]=EZ(Z);if(V!==0)return Y(V);if(W===void 0)return Y(9);let l=Z?.userName??"diplomatic-prf",K={residentKey:"required",requireResidentKey:!0,userVerification:"required",authenticatorAttachment:Z?.authenticatorAttachment??"platform"},G;try{G=await navigator.credentials.create({publicKey:{challenge:NZ(BZ),rp:{id:W,name:Z?.rpName??"DIPLOMATIC"},user:{id:NZ(16),name:l,displayName:l},pubKeyCredParams:uX,authenticatorSelection:K,extensions:{prf:{}}}})}catch{return Y(24)}let[m,R]=DZ(G);if(R!==0)return Y(R);if(m===void 0)return Y(27);let J=m.getClientExtensionResults();return d({credId:new Uint8Array(m.rawId),prfEnabled:J.prf?.enabled===!0})}async function bX(Z){let X=wZ();if(X!==0)return Y(X);let[W,V]=EZ(Z);if(V!==0)return Y(V);if(W===void 0)return Y(9);let l=Z?.salt??jX,K=jZ(l),G={challenge:NZ(BZ),rpId:W,userVerification:"required",extensions:{prf:{eval:{first:K}}}};if(Z?.credId!==void 0)G.allowCredentials=[{type:"public-key",id:jZ(Z.credId)}];let m;try{m=await navigator.credentials.get({publicKey:G})}catch{return Y(24)}let[R,J]=DZ(m);if(J!==0)return Y(J);if(R===void 0)return Y(27);let C=R.getClientExtensionResults().prf?.results;if(C?.first===void 0)return Y(7);let F=C.first,b=F instanceof ArrayBuffer?new Uint8Array(F):new Uint8Array(F.buffer,F.byteOffset,F.byteLength),c=b.byteLength>=NV?b.slice(0,NV):b;if(c.byteLength!==NV)return Y(27);return d({prf:c,credId:new Uint8Array(R.rawId)})}var pW="dmFyIHcwPTY0O3ZhciBYSj0zMixUMD04O3ZhciBJJD0zMjt2YXIgV0o9MzAwMDAsR0o9NTEyLGo7KCh3KT0+e3dbdy5TdWNjZXNzPTBdPSJTdWNjZXNzIjt3W3cuSW52YWxpZFNpZ25hdHVyZT0zXT0iSW52YWxpZFNpZ25hdHVyZSI7d1t3LkNsb2NrT3V0T2ZTeW5jPTRdPSJDbG9ja091dE9mU3luYyI7d1t3LlVzZXJOb3RSZWdpc3RlcmVkPTVdPSJVc2VyTm90UmVnaXN0ZXJlZCI7d1t3LlNlcnZlck1pc2NvbmZpZ3VyZWQ9Nl09IlNlcnZlck1pc2NvbmZpZ3VyZWQiO3dbdy5NaXNzaW5nQm9keT03XT0iTWlzc2luZ0JvZHkiO3dbdy5FeHRyYUJvZHlDb250ZW50PThdPSJFeHRyYUJvZHlDb250ZW50Ijt3W3cuTWlzc2luZ1BhcmFtPTldPSJNaXNzaW5nUGFyYW0iO3dbdy5JbnZhbGlkUGFyYW09MTBdPSJJbnZhbGlkUGFyYW0iO3dbdy5JbnZhbGlkUmVxdWVzdD0xMV09IkludmFsaWRSZXF1ZXN0Ijt3W3cuSW50ZXJuYWxFcnJvcj0xMl09IkludGVybmFsRXJyb3IiO3dbdy5Ob3RGb3VuZD0xM109Ik5vdEZvdW5kIjt3W3cuSW52YWxpZE1lc3NhZ2U9MTRdPSJJbnZhbGlkTWVzc2FnZSI7d1t3Lk5vQ2hhbmdlPTE1XT0iTm9DaGFuZ2UiO3dbdy5EYXRhYmFzZUNsb3NlZD0xNl09IkRhdGFiYXNlQ2xvc2VkIjt3W3cuU3RvcmFnZUVycm9yPTE3XT0iU3RvcmFnZUVycm9yIjt3W3cuRGF0YWJhc2VFcnJvcj0xOF09IkRhdGFiYXNlRXJyb3IiO3dbdy5IYXNoTWlzbWF0Y2g9MTldPSJIYXNoTWlzbWF0Y2giO3dbdy5EZWNyeXB0aW9uRXJyb3I9MjBdPSJEZWNyeXB0aW9uRXJyb3IiO3dbdy5Ob3RJbXBsZW1lbnRlZD0yMV09Ik5vdEltcGxlbWVudGVkIjt3W3cuTWlzc2luZ1NlZWQ9MjJdPSJNaXNzaW5nU2VlZCI7d1t3Lk91dE9mQm91bmRzPTIzXT0iT3V0T2ZCb3VuZHMiO3dbdy5Ib3N0RXJyb3I9MjRdPSJIb3N0RXJyb3IiO3dbdy5Db21tdW5pY2F0aW9uRXJyb3I9MjVdPSJDb21tdW5pY2F0aW9uRXJyb3IiO3dbdy5WYXJMaW1pdEV4Y2VlZGVkPTI2XT0iVmFyTGltaXRFeGNlZWRlZCI7d1t3LkludmFsaWRSZXNwb25zZT0yN109IkludmFsaWRSZXNwb25zZSI7d1t3LkNvbm5lY3Rpb25DbG9zZWQ9MjhdPSJDb25uZWN0aW9uQ2xvc2VkIn0pKGp8fD17fSk7ZnVuY3Rpb24gekooJCl7aWYoISR8fHR5cGVvZiAkIT09Im9iamVjdCIpcmV0dXJuITE7aWYoISgib3AiaW4gJCl8fCEoImlkImluICQpKXJldHVybiExO3JldHVybiB0eXBlb2YgJC5vcD09PSJzdHJpbmciJiZ0eXBlb2YgJC5pZD09PSJudW1iZXIifWZ1bmN0aW9uIEtKKCQpe2xldCBaPSQubGVuZ3RoLEo9MCxRPTA7d2hpbGUoUTxaKXtsZXQgVj0kLmNoYXJDb2RlQXQoUSsrKTtpZigoViY0Mjk0OTY3MTY4KT09PTApe0orKztjb250aW51ZX1lbHNlIGlmKChWJjQyOTQ5NjUyNDgpPT09MClKKz0yO2Vsc2V7aWYoVj49NTUyOTYmJlY8PTU2MzE5KXtpZihRPFope2xldCBZPSQuY2hhckNvZGVBdChRKTtpZigoWSY2NDUxMik9PT01NjMyMCkrK1EsVj0oKFYmMTAyMyk8PDEwKSsoWSYxMDIzKSs2NTUzNn19aWYoKFYmNDI5NDkwMTc2MCk9PT0wKUorPTM7ZWxzZSBKKz00fX1yZXR1cm4gSn1mdW5jdGlvbiBMUSgkLFosSil7bGV0IFE9JC5sZW5ndGgsVj1KLFk9MDt3aGlsZShZPFEpe2xldCBYPSQuY2hhckNvZGVBdChZKyspO2lmKChYJjQyOTQ5NjcxNjgpPT09MCl7WltWKytdPVg7Y29udGludWV9ZWxzZSBpZigoWCY0Mjk0OTY1MjQ4KT09PTApWltWKytdPVg+PjYmMzF8MTkyO2Vsc2V7aWYoWD49NTUyOTYmJlg8PTU2MzE5KXtpZihZPFEpe2xldCBXPSQuY2hhckNvZGVBdChZKTtpZigoVyY2NDUxMik9PT01NjMyMCkrK1ksWD0oKFgmMTAyMyk8PDEwKSsoVyYxMDIzKSs2NTUzNn19aWYoKFgmNDI5NDkwMTc2MCk9PT0wKVpbVisrXT1YPj4xMiYxNXwyMjQsWltWKytdPVg+PjYmNjN8MTI4O2Vsc2UgWltWKytdPVg+PjE4Jjd8MjQwLFpbVisrXT1YPj4xMiY2M3wxMjgsWltWKytdPVg+PjYmNjN8MTI4fVpbVisrXT1YJjYzfDEyOH19dmFyIHhRPW5ldyBUZXh0RW5jb2RlcixmUT01MDtmdW5jdGlvbiBrUSgkLFosSil7eFEuZW5jb2RlSW50bygkLFouc3ViYXJyYXkoSikpfWZ1bmN0aW9uIEZKKCQsWixKKXtpZigkLmxlbmd0aD5mUSlrUSgkLFosSik7ZWxzZSBMUSgkLFosSil9dmFyIEJRPTQwOTY7ZnVuY3Rpb24gZSQoJCxaLEope2xldCBRPVosVj1RK0osWT1bXSxYPSIiO3doaWxlKFE8Vil7bGV0IFc9JFtRKytdO2lmKChXJjEyOCk9PT0wKVkucHVzaChXKTtlbHNlIGlmKChXJjIyNCk9PT0xOTIpe2xldCB6PSRbUSsrXSY2MztZLnB1c2goKFcmMzEpPDw2fHopfWVsc2UgaWYoKFcmMjQwKT09PTIyNCl7bGV0IHo9JFtRKytdJjYzLEs9JFtRKytdJjYzO1kucHVzaCgoVyYzMSk8PDEyfHo8PDZ8Syl9ZWxzZSBpZigoVyYyNDgpPT09MjQwKXtsZXQgej0kW1ErK10mNjMsSz0kW1ErK10mNjMsRj0kW1ErK10mNjMsTj0oVyY3KTw8MTh8ejw8MTJ8Szw8NnxGO2lmKE4+NjU1MzUpTi09NjU1MzYsWS5wdXNoKE4+Pj4xMCYxMDIzfDU1Mjk2KSxOPTU2MzIwfE4mMTAyMztZLnB1c2goTil9ZWxzZSBZLnB1c2goVyk7aWYoWS5sZW5ndGg+PUJRKVgrPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uWSksWS5sZW5ndGg9MH1pZihZLmxlbmd0aD4wKVgrPVN0cmluZy5mcm9tQ2hhckNvZGUoLi4uWSk7cmV0dXJuIFh9dmFyIEVRPW5ldyBUZXh0RGVjb2RlcixtUT0yMDA7ZnVuY3Rpb24gZ1EoJCxaLEope2xldCBRPSQuc3ViYXJyYXkoWixaK0opO3JldHVybiBFUS5kZWNvZGUoUSl9ZnVuY3Rpb24gTkooJCxaLEope2lmKEo+bVEpcmV0dXJuIGdRKCQsWixKKTtlbHNlIHJldHVybiBlJCgkLFosSil9Y2xhc3MgdTB7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKCQsWil7dGhpcy50eXBlPSQsdGhpcy5kYXRhPVp9fWNsYXNzIHMgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcigkKXtzdXBlcigkKTtsZXQgWj1PYmplY3QuY3JlYXRlKHMucHJvdG90eXBlKTtPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxaKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOnMubmFtZX0pfX12YXIgbDA9NDI5NDk2NzI5NTtmdW5jdGlvbiBSSigkLFosSil7bGV0IFE9Si80Mjk0OTY3Mjk2LFY9SjskLnNldFVpbnQzMihaLFEpLCQuc2V0VWludDMyKForNCxWKX1mdW5jdGlvbiBIJCgkLFosSil7bGV0IFE9TWF0aC5mbG9vcihKLzQyOTQ5NjcyOTYpLFY9SjskLnNldFVpbnQzMihaLFEpLCQuc2V0VWludDMyKForNCxWKX1mdW5jdGlvbiBNJCgkLFope2xldCBKPSQuZ2V0SW50MzIoWiksUT0kLmdldFVpbnQzMihaKzQpO3JldHVybiBKKjQyOTQ5NjcyOTYrUX1mdW5jdGlvbiBVSigkLFope2xldCBKPSQuZ2V0VWludDMyKFopLFE9JC5nZXRVaW50MzIoWis0KTtyZXR1cm4gSio0Mjk0OTY3Mjk2K1F9dmFyIFNRPS0xLHZRPTQyOTQ5NjcyOTUsYlE9MTcxNzk4NjkxODM7ZnVuY3Rpb24geVEoe3NlYzokLG5zZWM6Wn0pe2lmKCQ+PTAmJlo+PTAmJiQ8PWJRKWlmKFo9PT0wJiYkPD12USl7bGV0IEo9bmV3IFVpbnQ4QXJyYXkoNCk7cmV0dXJuIG5ldyBEYXRhVmlldyhKLmJ1ZmZlcikuc2V0VWludDMyKDAsJCksSn1lbHNle2xldCBKPSQvNDI5NDk2NzI5NixRPSQmNDI5NDk2NzI5NSxWPW5ldyBVaW50OEFycmF5KDgpLFk9bmV3IERhdGFWaWV3KFYuYnVmZmVyKTtyZXR1cm4gWS5zZXRVaW50MzIoMCxaPDwyfEomMyksWS5zZXRVaW50MzIoNCxRKSxWfWVsc2V7bGV0IEo9bmV3IFVpbnQ4QXJyYXkoMTIpLFE9bmV3IERhdGFWaWV3KEouYnVmZmVyKTtyZXR1cm4gUS5zZXRVaW50MzIoMCxaKSxIJChRLDQsJCksSn19ZnVuY3Rpb24gaVEoJCl7bGV0IFo9JC5nZXRUaW1lKCksSj1NYXRoLmZsb29yKFovMTAwMCksUT0oWi1KKjEwMDApKjFlNixWPU1hdGguZmxvb3IoUS8xZTkpO3JldHVybntzZWM6SitWLG5zZWM6US1WKjFlOX19ZnVuY3Rpb24gaFEoJCl7aWYoJCBpbnN0YW5jZW9mIERhdGUpe2xldCBaPWlRKCQpO3JldHVybiB5UShaKX1lbHNlIHJldHVybiBudWxsfWZ1bmN0aW9uIHVRKCQpe2xldCBaPW5ldyBEYXRhVmlldygkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsJC5ieXRlTGVuZ3RoKTtzd2l0Y2goJC5ieXRlTGVuZ3RoKXtjYXNlIDQ6e2xldCBKPVouZ2V0VWludDMyKDApLFE9MDtyZXR1cm57c2VjOkosbnNlYzowfX1jYXNlIDg6e2xldCBKPVouZ2V0VWludDMyKDApLFE9Wi5nZXRVaW50MzIoNCksVj0oSiYzKSo0Mjk0OTY3Mjk2K1EsWT1KPj4+MjtyZXR1cm57c2VjOlYsbnNlYzpZfX1jYXNlIDEyOntsZXQgSj1NJChaLDQpLFE9Wi5nZXRVaW50MzIoMCk7cmV0dXJue3NlYzpKLG5zZWM6UX19ZGVmYXVsdDp0aHJvdyBuZXcgcyhgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7JC5sZW5ndGh9YCl9fWZ1bmN0aW9uIGxRKCQpe2xldCBaPXVRKCQpO3JldHVybiBuZXcgRGF0ZShaLnNlYyoxMDAwK1oubnNlYy8xZTYpfXZhciBPSj17dHlwZTpTUSxlbmNvZGU6aFEsZGVjb2RlOmxRfTtjbGFzcyBwMHtzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBwMDtfX2JyYW5kO2J1aWx0SW5FbmNvZGVycz1bXTtidWlsdEluRGVjb2RlcnM9W107ZW5jb2RlcnM9W107ZGVjb2RlcnM9W107Y29uc3RydWN0b3IoKXt0aGlzLnJlZ2lzdGVyKE9KKX1yZWdpc3Rlcih7dHlwZTokLGVuY29kZTpaLGRlY29kZTpKfSl7aWYoJD49MCl0aGlzLmVuY29kZXJzWyRdPVosdGhpcy5kZWNvZGVyc1skXT1KO2Vsc2V7bGV0IFE9LTEtJDt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tRXT1aLHRoaXMuYnVpbHRJbkRlY29kZXJzW1FdPUp9fXRyeVRvRW5jb2RlKCQsWil7Zm9yKGxldCBKPTA7Sjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7SisrKXtsZXQgUT10aGlzLmJ1aWx0SW5FbmNvZGVyc1tKXTtpZihRIT1udWxsKXtsZXQgVj1RKCQsWik7aWYoViE9bnVsbCl7bGV0IFk9LTEtSjtyZXR1cm4gbmV3IHUwKFksVil9fX1mb3IobGV0IEo9MDtKPHRoaXMuZW5jb2RlcnMubGVuZ3RoO0orKyl7bGV0IFE9dGhpcy5lbmNvZGVyc1tKXTtpZihRIT1udWxsKXtsZXQgVj1RKCQsWik7aWYoViE9bnVsbClyZXR1cm4gbmV3IHUwKEosVil9fWlmKCQgaW5zdGFuY2VvZiB1MClyZXR1cm4gJDtyZXR1cm4gbnVsbH1kZWNvZGUoJCxaLEope2xldCBRPVo8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS1aXTp0aGlzLmRlY29kZXJzW1pdO2lmKFEpcmV0dXJuIFEoJCxaLEopO2Vsc2UgcmV0dXJuIG5ldyB1MChaLCQpfX1mdW5jdGlvbiBwUSgkKXtyZXR1cm4gJCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHx0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI8InUiJiYkIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXJ9ZnVuY3Rpb24gUSQoJCl7aWYoJCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuICQ7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoJCkpcmV0dXJuIG5ldyBVaW50OEFycmF5KCQuYnVmZmVyLCQuYnl0ZU9mZnNldCwkLmJ5dGVMZW5ndGgpO2Vsc2UgaWYocFEoJCkpcmV0dXJuIG5ldyBVaW50OEFycmF5KCQpO2Vsc2UgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSgkKX12YXIgblE9MTAwLGNRPTIwNDg7Y2xhc3MgQyR7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcigkKXt0aGlzLmV4dGVuc2lvbkNvZGVjPSQ/LmV4dGVuc2lvbkNvZGVjPz9wMC5kZWZhdWx0Q29kZWMsdGhpcy5jb250ZXh0PSQ/LmNvbnRleHQsdGhpcy51c2VCaWdJbnQ2ND0kPy51c2VCaWdJbnQ2ND8/ITEsdGhpcy5tYXhEZXB0aD0kPy5tYXhEZXB0aD8/blEsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT0kPy5pbml0aWFsQnVmZmVyU2l6ZT8/Y1EsdGhpcy5zb3J0S2V5cz0kPy5zb3J0S2V5cz8/ITEsdGhpcy5mb3JjZUZsb2F0MzI9JD8uZm9yY2VGbG9hdDMyPz8hMSx0aGlzLmlnbm9yZVVuZGVmaW5lZD0kPy5pZ25vcmVVbmRlZmluZWQ/PyExLHRoaXMuZm9yY2VJbnRlZ2VyVG9GbG9hdD0kPy5mb3JjZUludGVnZXJUb0Zsb2F0Pz8hMSx0aGlzLnBvcz0wLHRoaXMudmlldz1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKHRoaXMuaW5pdGlhbEJ1ZmZlclNpemUpKSx0aGlzLmJ5dGVzPW5ldyBVaW50OEFycmF5KHRoaXMudmlldy5idWZmZXIpfWNsb25lKCl7cmV0dXJuIG5ldyBDJCh7ZXh0ZW5zaW9uQ29kZWM6dGhpcy5leHRlbnNpb25Db2RlYyxjb250ZXh0OnRoaXMuY29udGV4dCx1c2VCaWdJbnQ2NDp0aGlzLnVzZUJpZ0ludDY0LG1heERlcHRoOnRoaXMubWF4RGVwdGgsaW5pdGlhbEJ1ZmZlclNpemU6dGhpcy5pbml0aWFsQnVmZmVyU2l6ZSxzb3J0S2V5czp0aGlzLnNvcnRLZXlzLGZvcmNlRmxvYXQzMjp0aGlzLmZvcmNlRmxvYXQzMixpZ25vcmVVbmRlZmluZWQ6dGhpcy5pZ25vcmVVbmRlZmluZWQsZm9yY2VJbnRlZ2VyVG9GbG9hdDp0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXR9KX1yZWluaXRpYWxpemVTdGF0ZSgpe3RoaXMucG9zPTB9ZW5jb2RlU2hhcmVkUmVmKCQpe2lmKHRoaXMuZW50ZXJlZClyZXR1cm4gdGhpcy5jbG9uZSgpLmVuY29kZVNoYXJlZFJlZigkKTt0cnl7cmV0dXJuIHRoaXMuZW50ZXJlZD0hMCx0aGlzLnJlaW5pdGlhbGl6ZVN0YXRlKCksdGhpcy5kb0VuY29kZSgkLDEpLHRoaXMuYnl0ZXMuc3ViYXJyYXkoMCx0aGlzLnBvcyl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWVuY29kZSgkKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoJCk7dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoJCwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZSgkLFope2lmKFo+dGhpcy5tYXhEZXB0aCl0aHJvdyBFcnJvcihgVG9vIGRlZXAgb2JqZWN0cyBpbiBkZXB0aCAke1p9YCk7aWYoJD09bnVsbCl0aGlzLmVuY29kZU5pbCgpO2Vsc2UgaWYodHlwZW9mICQ9PT0iYm9vbGVhbiIpdGhpcy5lbmNvZGVCb29sZWFuKCQpO2Vsc2UgaWYodHlwZW9mICQ9PT0ibnVtYmVyIilpZighdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0KXRoaXMuZW5jb2RlTnVtYmVyKCQpO2Vsc2UgdGhpcy5lbmNvZGVOdW1iZXJBc0Zsb2F0KCQpO2Vsc2UgaWYodHlwZW9mICQ9PT0ic3RyaW5nIil0aGlzLmVuY29kZVN0cmluZygkKTtlbHNlIGlmKHRoaXMudXNlQmlnSW50NjQmJnR5cGVvZiAkPT09ImJpZ2ludCIpdGhpcy5lbmNvZGVCaWdJbnQ2NCgkKTtlbHNlIHRoaXMuZW5jb2RlT2JqZWN0KCQsWil9ZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoJCl7bGV0IFo9dGhpcy5wb3MrJDtpZih0aGlzLnZpZXcuYnl0ZUxlbmd0aDxaKXRoaXMucmVzaXplQnVmZmVyKFoqMil9cmVzaXplQnVmZmVyKCQpe2xldCBaPW5ldyBBcnJheUJ1ZmZlcigkKSxKPW5ldyBVaW50OEFycmF5KFopLFE9bmV3IERhdGFWaWV3KFopO0ouc2V0KHRoaXMuYnl0ZXMpLHRoaXMudmlldz1RLHRoaXMuYnl0ZXM9Sn1lbmNvZGVOaWwoKXt0aGlzLndyaXRlVTgoMTkyKX1lbmNvZGVCb29sZWFuKCQpe2lmKCQ9PT0hMSl0aGlzLndyaXRlVTgoMTk0KTtlbHNlIHRoaXMud3JpdGVVOCgxOTUpfWVuY29kZU51bWJlcigkKXtpZighdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0JiZOdW1iZXIuaXNTYWZlSW50ZWdlcigkKSlpZigkPj0wKWlmKCQ8MTI4KXRoaXMud3JpdGVVOCgkKTtlbHNlIGlmKCQ8MjU2KXRoaXMud3JpdGVVOCgyMDQpLHRoaXMud3JpdGVVOCgkKTtlbHNlIGlmKCQ8NjU1MzYpdGhpcy53cml0ZVU4KDIwNSksdGhpcy53cml0ZVUxNigkKTtlbHNlIGlmKCQ8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjA2KSx0aGlzLndyaXRlVTMyKCQpO2Vsc2UgaWYoIXRoaXMudXNlQmlnSW50NjQpdGhpcy53cml0ZVU4KDIwNyksdGhpcy53cml0ZVU2NCgkKTtlbHNlIHRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdCgkKTtlbHNlIGlmKCQ+PS0zMil0aGlzLndyaXRlVTgoMjI0fCQrMzIpO2Vsc2UgaWYoJD49LTEyOCl0aGlzLndyaXRlVTgoMjA4KSx0aGlzLndyaXRlSTgoJCk7ZWxzZSBpZigkPj0tMzI3NjgpdGhpcy53cml0ZVU4KDIwOSksdGhpcy53cml0ZUkxNigkKTtlbHNlIGlmKCQ+PS0yMTQ3NDgzNjQ4KXRoaXMud3JpdGVVOCgyMTApLHRoaXMud3JpdGVJMzIoJCk7ZWxzZSBpZighdGhpcy51c2VCaWdJbnQ2NCl0aGlzLndyaXRlVTgoMjExKSx0aGlzLndyaXRlSTY0KCQpO2Vsc2UgdGhpcy5lbmNvZGVOdW1iZXJBc0Zsb2F0KCQpO2Vsc2UgdGhpcy5lbmNvZGVOdW1iZXJBc0Zsb2F0KCQpfWVuY29kZU51bWJlckFzRmxvYXQoJCl7aWYodGhpcy5mb3JjZUZsb2F0MzIpdGhpcy53cml0ZVU4KDIwMiksdGhpcy53cml0ZUYzMigkKTtlbHNlIHRoaXMud3JpdGVVOCgyMDMpLHRoaXMud3JpdGVGNjQoJCl9ZW5jb2RlQmlnSW50NjQoJCl7aWYoJD49QmlnSW50KDApKXRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVCaWdVaW50NjQoJCk7ZWxzZSB0aGlzLndyaXRlVTgoMjExKSx0aGlzLndyaXRlQmlnSW50NjQoJCl9d3JpdGVTdHJpbmdIZWFkZXIoJCl7aWYoJDwzMil0aGlzLndyaXRlVTgoMTYwKyQpO2Vsc2UgaWYoJDwyNTYpdGhpcy53cml0ZVU4KDIxNyksdGhpcy53cml0ZVU4KCQpO2Vsc2UgaWYoJDw2NTUzNil0aGlzLndyaXRlVTgoMjE4KSx0aGlzLndyaXRlVTE2KCQpO2Vsc2UgaWYoJDw0Mjk0OTY3Mjk2KXRoaXMud3JpdGVVOCgyMTkpLHRoaXMud3JpdGVVMzIoJCk7ZWxzZSB0aHJvdyBFcnJvcihgVG9vIGxvbmcgc3RyaW5nOiAkeyR9IGJ5dGVzIGluIFVURi04YCl9ZW5jb2RlU3RyaW5nKCQpe2xldCBKPUtKKCQpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStKKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKEopLEZKKCQsdGhpcy5ieXRlcyx0aGlzLnBvcyksdGhpcy5wb3MrPUp9ZW5jb2RlT2JqZWN0KCQsWil7bGV0IEo9dGhpcy5leHRlbnNpb25Db2RlYy50cnlUb0VuY29kZSgkLHRoaXMuY29udGV4dCk7aWYoSiE9bnVsbCl0aGlzLmVuY29kZUV4dGVuc2lvbihKKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoJCkpdGhpcy5lbmNvZGVBcnJheSgkLFopO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KCQpKXRoaXMuZW5jb2RlQmluYXJ5KCQpO2Vsc2UgaWYodHlwZW9mICQ9PT0ib2JqZWN0Iil0aGlzLmVuY29kZU1hcCgkLFopO2Vsc2UgdGhyb3cgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSgkKX1gKX1lbmNvZGVCaW5hcnkoJCl7bGV0IFo9JC5ieXRlTGVuZ3RoO2lmKFo8MjU2KXRoaXMud3JpdGVVOCgxOTYpLHRoaXMud3JpdGVVOChaKTtlbHNlIGlmKFo8NjU1MzYpdGhpcy53cml0ZVU4KDE5NyksdGhpcy53cml0ZVUxNihaKTtlbHNlIGlmKFo8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMTk4KSx0aGlzLndyaXRlVTMyKFopO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBiaW5hcnk6ICR7Wn1gKTtsZXQgSj1RJCgkKTt0aGlzLndyaXRlVThhKEopfWVuY29kZUFycmF5KCQsWil7bGV0IEo9JC5sZW5ndGg7aWYoSjwxNil0aGlzLndyaXRlVTgoMTQ0K0opO2Vsc2UgaWYoSjw2NTUzNil0aGlzLndyaXRlVTgoMjIwKSx0aGlzLndyaXRlVTE2KEopO2Vsc2UgaWYoSjw0Mjk0OTY3Mjk2KXRoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIoSik7ZWxzZSB0aHJvdyBFcnJvcihgVG9vIGxhcmdlIGFycmF5OiAke0p9YCk7Zm9yKGxldCBRIG9mICQpdGhpcy5kb0VuY29kZShRLForMSl9Y291bnRXaXRob3V0VW5kZWZpbmVkKCQsWil7bGV0IEo9MDtmb3IobGV0IFEgb2YgWilpZigkW1FdIT09dm9pZCAwKUorKztyZXR1cm4gSn1lbmNvZGVNYXAoJCxaKXtsZXQgSj1PYmplY3Qua2V5cygkKTtpZih0aGlzLnNvcnRLZXlzKUouc29ydCgpO2xldCBRPXRoaXMuaWdub3JlVW5kZWZpbmVkP3RoaXMuY291bnRXaXRob3V0VW5kZWZpbmVkKCQsSik6Si5sZW5ndGg7aWYoUTwxNil0aGlzLndyaXRlVTgoMTI4K1EpO2Vsc2UgaWYoUTw2NTUzNil0aGlzLndyaXRlVTgoMjIyKSx0aGlzLndyaXRlVTE2KFEpO2Vsc2UgaWYoUTw0Mjk0OTY3Mjk2KXRoaXMud3JpdGVVOCgyMjMpLHRoaXMud3JpdGVVMzIoUSk7ZWxzZSB0aHJvdyBFcnJvcihgVG9vIGxhcmdlIG1hcCBvYmplY3Q6ICR7UX1gKTtmb3IobGV0IFYgb2YgSil7bGV0IFk9JFtWXTtpZighKHRoaXMuaWdub3JlVW5kZWZpbmVkJiZZPT09dm9pZCAwKSl0aGlzLmVuY29kZVN0cmluZyhWKSx0aGlzLmRvRW5jb2RlKFksWisxKX19ZW5jb2RlRXh0ZW5zaW9uKCQpe2lmKHR5cGVvZiAkLmRhdGE9PT0iZnVuY3Rpb24iKXtsZXQgSj0kLmRhdGEodGhpcy5wb3MrNiksUT1KLmxlbmd0aDtpZihRPj00Mjk0OTY3Mjk2KXRocm93IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtRfWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIoUSksdGhpcy53cml0ZUk4KCQudHlwZSksdGhpcy53cml0ZVU4YShKKTtyZXR1cm59bGV0IFo9JC5kYXRhLmxlbmd0aDtpZihaPT09MSl0aGlzLndyaXRlVTgoMjEyKTtlbHNlIGlmKFo9PT0yKXRoaXMud3JpdGVVOCgyMTMpO2Vsc2UgaWYoWj09PTQpdGhpcy53cml0ZVU4KDIxNCk7ZWxzZSBpZihaPT09OCl0aGlzLndyaXRlVTgoMjE1KTtlbHNlIGlmKFo9PT0xNil0aGlzLndyaXRlVTgoMjE2KTtlbHNlIGlmKFo8MjU2KXRoaXMud3JpdGVVOCgxOTkpLHRoaXMud3JpdGVVOChaKTtlbHNlIGlmKFo8NjU1MzYpdGhpcy53cml0ZVU4KDIwMCksdGhpcy53cml0ZVUxNihaKTtlbHNlIGlmKFo8NDI5NDk2NzI5Nil0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKFopO2Vsc2UgdGhyb3cgRXJyb3IoYFRvbyBsYXJnZSBleHRlbnNpb24gb2JqZWN0OiAke1p9YCk7dGhpcy53cml0ZUk4KCQudHlwZSksdGhpcy53cml0ZVU4YSgkLmRhdGEpfXdyaXRlVTgoJCl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsJCksdGhpcy5wb3MrK313cml0ZVU4YSgkKXtsZXQgWj0kLmxlbmd0aDt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKFopLHRoaXMuYnl0ZXMuc2V0KCQsdGhpcy5wb3MpLHRoaXMucG9zKz1afXdyaXRlSTgoJCl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0SW50OCh0aGlzLnBvcywkKSx0aGlzLnBvcysrfXdyaXRlVTE2KCQpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldFVpbnQxNih0aGlzLnBvcywkKSx0aGlzLnBvcys9Mn13cml0ZUkxNigkKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDIpLHRoaXMudmlldy5zZXRJbnQxNih0aGlzLnBvcywkKSx0aGlzLnBvcys9Mn13cml0ZVUzMigkKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRVaW50MzIodGhpcy5wb3MsJCksdGhpcy5wb3MrPTR9d3JpdGVJMzIoJCl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0SW50MzIodGhpcy5wb3MsJCksdGhpcy5wb3MrPTR9d3JpdGVGMzIoJCl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg0KSx0aGlzLnZpZXcuc2V0RmxvYXQzMih0aGlzLnBvcywkKSx0aGlzLnBvcys9NH13cml0ZUY2NCgkKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRGbG9hdDY0KHRoaXMucG9zLCQpLHRoaXMucG9zKz04fXdyaXRlVTY0KCQpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksUkoodGhpcy52aWV3LHRoaXMucG9zLCQpLHRoaXMucG9zKz04fXdyaXRlSTY0KCQpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksSCQodGhpcy52aWV3LHRoaXMucG9zLCQpLHRoaXMucG9zKz04fXdyaXRlQmlnVWludDY0KCQpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEJpZ1VpbnQ2NCh0aGlzLnBvcywkKSx0aGlzLnBvcys9OH13cml0ZUJpZ0ludDY0KCQpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEJpZ0ludDY0KHRoaXMucG9zLCQpLHRoaXMucG9zKz04fX1mdW5jdGlvbiBfMCgkLFope3JldHVybiBuZXcgQyQoWikuZW5jb2RlU2hhcmVkUmVmKCQpfWZ1bmN0aW9uIFAkKCQpe3JldHVybmAkeyQ8MD8iLSI6IiJ9MHgke01hdGguYWJzKCQpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9YH12YXIgZFE9MTYsclE9MTY7Y2xhc3MgJFp7aGl0PTA7bWlzcz0wO2NhY2hlczttYXhLZXlMZW5ndGg7bWF4TGVuZ3RoUGVyS2V5O2NvbnN0cnVjdG9yKCQ9ZFEsWj1yUSl7dGhpcy5tYXhLZXlMZW5ndGg9JCx0aGlzLm1heExlbmd0aFBlcktleT1aLHRoaXMuY2FjaGVzPVtdO2ZvcihsZXQgSj0wO0o8dGhpcy5tYXhLZXlMZW5ndGg7SisrKXRoaXMuY2FjaGVzLnB1c2goW10pfWNhbkJlQ2FjaGVkKCQpe3JldHVybiAkPjAmJiQ8PXRoaXMubWF4S2V5TGVuZ3RofWZpbmQoJCxaLEope2xldCBRPXRoaXMuY2FjaGVzW0otMV07JDpmb3IobGV0IFYgb2YgUSl7bGV0IFk9Vi5ieXRlcztmb3IobGV0IFg9MDtYPEo7WCsrKWlmKFlbWF0hPT0kW1orWF0pY29udGludWUgJDtyZXR1cm4gVi5zdHJ9cmV0dXJuIG51bGx9c3RvcmUoJCxaKXtsZXQgSj10aGlzLmNhY2hlc1skLmxlbmd0aC0xXSxRPXtieXRlczokLHN0cjpafTtpZihKLmxlbmd0aD49dGhpcy5tYXhMZW5ndGhQZXJLZXkpSltNYXRoLnJhbmRvbSgpKkoubGVuZ3RofDBdPVE7ZWxzZSBKLnB1c2goUSl9ZGVjb2RlKCQsWixKKXtsZXQgUT10aGlzLmZpbmQoJCxaLEopO2lmKFEhPW51bGwpcmV0dXJuIHRoaXMuaGl0KyssUTt0aGlzLm1pc3MrKztsZXQgVj1lJCgkLFosSiksWT1VaW50OEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCQsWixaK0opO3JldHVybiB0aGlzLnN0b3JlKFksViksVn19dmFyIFpaPSJhcnJheSIsWSQ9Im1hcF9rZXkiLElKPSJtYXBfdmFsdWUiLG9RPSgkKT0+e2lmKHR5cGVvZiAkPT09InN0cmluZyJ8fHR5cGVvZiAkPT09Im51bWJlciIpcmV0dXJuICQ7dGhyb3cgbmV3IHMoIlRoZSB0eXBlIG9mIGtleSBtdXN0IGJlIHN0cmluZyBvciBudW1iZXIgYnV0ICIrdHlwZW9mICQpfTtjbGFzcyBISntzdGFjaz1bXTtzdGFja0hlYWRQb3NpdGlvbj0tMTtnZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuc3RhY2tIZWFkUG9zaXRpb24rMX10b3AoKXtyZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXX1wdXNoQXJyYXlTdGF0ZSgkKXtsZXQgWj10aGlzLmdldFVuaW5pdGlhbGl6ZWRTdGF0ZUZyb21Qb29sKCk7Wi50eXBlPVpaLFoucG9zaXRpb249MCxaLnNpemU9JCxaLmFycmF5PUFycmF5KCQpfXB1c2hNYXBTdGF0ZSgkKXtsZXQgWj10aGlzLmdldFVuaW5pdGlhbGl6ZWRTdGF0ZUZyb21Qb29sKCk7Wi50eXBlPVkkLFoucmVhZENvdW50PTAsWi5zaXplPSQsWi5tYXA9e319Z2V0VW5pbml0aWFsaXplZFN0YXRlRnJvbVBvb2woKXtpZih0aGlzLnN0YWNrSGVhZFBvc2l0aW9uKyssdGhpcy5zdGFja0hlYWRQb3NpdGlvbj09PXRoaXMuc3RhY2subGVuZ3RoKXtsZXQgJD17dHlwZTp2b2lkIDAsc2l6ZTowLGFycmF5OnZvaWQgMCxwb3NpdGlvbjowLHJlYWRDb3VudDowLG1hcDp2b2lkIDAsa2V5Om51bGx9O3RoaXMuc3RhY2sucHVzaCgkKX1yZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrSGVhZFBvc2l0aW9uXX1yZWxlYXNlKCQpe2lmKHRoaXMuc3RhY2tbdGhpcy5zdGFja0hlYWRQb3NpdGlvbl0hPT0kKXRocm93IEVycm9yKCJJbnZhbGlkIHN0YWNrIHN0YXRlLiBSZWxlYXNlZCBzdGF0ZSBpcyBub3Qgb24gdG9wIG9mIHRoZSBzdGFjay4iKTtpZigkLnR5cGU9PT1aWil7bGV0IEo9JDtKLnNpemU9MCxKLmFycmF5PXZvaWQgMCxKLnBvc2l0aW9uPTAsSi50eXBlPXZvaWQgMH1pZigkLnR5cGU9PT1ZJHx8JC50eXBlPT09SUope2xldCBKPSQ7Si5zaXplPTAsSi5tYXA9dm9pZCAwLEoucmVhZENvdW50PTAsSi50eXBlPXZvaWQgMH10aGlzLnN0YWNrSGVhZFBvc2l0aW9uLS19cmVzZXQoKXt0aGlzLnN0YWNrLmxlbmd0aD0wLHRoaXMuc3RhY2tIZWFkUG9zaXRpb249LTF9fXZhciBWJD0tMSxKWj1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDApKSxhUT1uZXcgVWludDhBcnJheShKWi5idWZmZXIpO3RyeXtKWi5nZXRJbnQ4KDApfWNhdGNoKCQpe2lmKCEoJCBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpKXRocm93IEVycm9yKCJUaGlzIG1vZHVsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IEphdmFTY3JpcHQgZW5naW5lIGJlY2F1c2UgRGF0YVZpZXcgZG9lcyBub3QgdGhyb3cgUmFuZ2VFcnJvciBvbiBvdXQtb2YtYm91bmRzIGFjY2VzcyIpfXZhciBxSj1SYW5nZUVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpLHNRPW5ldyAkWjtjbGFzcyB3JHtleHRlbnNpb25Db2RlYztjb250ZXh0O3VzZUJpZ0ludDY0O3Jhd1N0cmluZ3M7bWF4U3RyTGVuZ3RoO21heEJpbkxlbmd0aDttYXhBcnJheUxlbmd0aDttYXhNYXBMZW5ndGg7bWF4RXh0TGVuZ3RoO2tleURlY29kZXI7bWFwS2V5Q29udmVydGVyO3RvdGFsUG9zPTA7cG9zPTA7dmlldz1KWjtieXRlcz1hUTtoZWFkQnl0ZT1WJDtzdGFjaz1uZXcgSEo7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcigkKXt0aGlzLmV4dGVuc2lvbkNvZGVjPSQ/LmV4dGVuc2lvbkNvZGVjPz9wMC5kZWZhdWx0Q29kZWMsdGhpcy5jb250ZXh0PSQ/LmNvbnRleHQsdGhpcy51c2VCaWdJbnQ2ND0kPy51c2VCaWdJbnQ2ND8/ITEsdGhpcy5yYXdTdHJpbmdzPSQ/LnJhd1N0cmluZ3M/PyExLHRoaXMubWF4U3RyTGVuZ3RoPSQ/Lm1heFN0ckxlbmd0aD8/bDAsdGhpcy5tYXhCaW5MZW5ndGg9JD8ubWF4QmluTGVuZ3RoPz9sMCx0aGlzLm1heEFycmF5TGVuZ3RoPSQ/Lm1heEFycmF5TGVuZ3RoPz9sMCx0aGlzLm1heE1hcExlbmd0aD0kPy5tYXhNYXBMZW5ndGg/P2wwLHRoaXMubWF4RXh0TGVuZ3RoPSQ/Lm1heEV4dExlbmd0aD8/bDAsdGhpcy5rZXlEZWNvZGVyPSQ/LmtleURlY29kZXIhPT12b2lkIDA/JC5rZXlEZWNvZGVyOnNRLHRoaXMubWFwS2V5Q29udmVydGVyPSQ/Lm1hcEtleUNvbnZlcnRlcj8/b1F9Y2xvbmUoKXtyZXR1cm4gbmV3IHckKHtleHRlbnNpb25Db2RlYzp0aGlzLmV4dGVuc2lvbkNvZGVjLGNvbnRleHQ6dGhpcy5jb250ZXh0LHVzZUJpZ0ludDY0OnRoaXMudXNlQmlnSW50NjQscmF3U3RyaW5nczp0aGlzLnJhd1N0cmluZ3MsbWF4U3RyTGVuZ3RoOnRoaXMubWF4U3RyTGVuZ3RoLG1heEJpbkxlbmd0aDp0aGlzLm1heEJpbkxlbmd0aCxtYXhBcnJheUxlbmd0aDp0aGlzLm1heEFycmF5TGVuZ3RoLG1heE1hcExlbmd0aDp0aGlzLm1heE1hcExlbmd0aCxtYXhFeHRMZW5ndGg6dGhpcy5tYXhFeHRMZW5ndGgsa2V5RGVjb2Rlcjp0aGlzLmtleURlY29kZXJ9KX1yZWluaXRpYWxpemVTdGF0ZSgpe3RoaXMudG90YWxQb3M9MCx0aGlzLmhlYWRCeXRlPVYkLHRoaXMuc3RhY2sucmVzZXQoKX1zZXRCdWZmZXIoJCl7bGV0IFo9USQoJCk7dGhpcy5ieXRlcz1aLHRoaXMudmlldz1uZXcgRGF0YVZpZXcoWi5idWZmZXIsWi5ieXRlT2Zmc2V0LFouYnl0ZUxlbmd0aCksdGhpcy5wb3M9MH1hcHBlbmRCdWZmZXIoJCl7aWYodGhpcy5oZWFkQnl0ZT09PVYkJiYhdGhpcy5oYXNSZW1haW5pbmcoMSkpdGhpcy5zZXRCdWZmZXIoJCk7ZWxzZXtsZXQgWj10aGlzLmJ5dGVzLnN1YmFycmF5KHRoaXMucG9zKSxKPVEkKCQpLFE9bmV3IFVpbnQ4QXJyYXkoWi5sZW5ndGgrSi5sZW5ndGgpO1Euc2V0KFopLFEuc2V0KEosWi5sZW5ndGgpLHRoaXMuc2V0QnVmZmVyKFEpfX1oYXNSZW1haW5pbmcoJCl7cmV0dXJuIHRoaXMudmlldy5ieXRlTGVuZ3RoLXRoaXMucG9zPj0kfWNyZWF0ZUV4dHJhQnl0ZUVycm9yKCQpe2xldHt2aWV3OloscG9zOkp9PXRoaXM7cmV0dXJuIFJhbmdlRXJyb3IoYEV4dHJhICR7Wi5ieXRlTGVuZ3RoLUp9IG9mICR7Wi5ieXRlTGVuZ3RofSBieXRlKHMpIGZvdW5kIGF0IGJ1ZmZlclskeyR9XWApfWRlY29kZSgkKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5kZWNvZGUoJCk7dHJ5e3RoaXMuZW50ZXJlZD0hMCx0aGlzLnJlaW5pdGlhbGl6ZVN0YXRlKCksdGhpcy5zZXRCdWZmZXIoJCk7bGV0IFo9dGhpcy5kb0RlY29kZVN5bmMoKTtpZih0aGlzLmhhc1JlbWFpbmluZygxKSl0aHJvdyB0aGlzLmNyZWF0ZUV4dHJhQnl0ZUVycm9yKHRoaXMucG9zKTtyZXR1cm4gWn1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19KmRlY29kZU11bHRpKCQpe2lmKHRoaXMuZW50ZXJlZCl7eWllbGQqdGhpcy5jbG9uZSgpLmRlY29kZU11bHRpKCQpO3JldHVybn10cnl7dGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLnNldEJ1ZmZlcigkKTt3aGlsZSh0aGlzLmhhc1JlbWFpbmluZygxKSl5aWVsZCB0aGlzLmRvRGVjb2RlU3luYygpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1hc3luYyBkZWNvZGVBc3luYygkKXtpZih0aGlzLmVudGVyZWQpcmV0dXJuIHRoaXMuY2xvbmUoKS5kZWNvZGVBc3luYygkKTt0cnl7dGhpcy5lbnRlcmVkPSEwO2xldCBaPSExLEo7Zm9yIGF3YWl0KGxldCBYIG9mICQpe2lmKFopdGhyb3cgdGhpcy5lbnRlcmVkPSExLHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy50b3RhbFBvcyk7dGhpcy5hcHBlbmRCdWZmZXIoWCk7dHJ5e0o9dGhpcy5kb0RlY29kZVN5bmMoKSxaPSEwfWNhdGNoKFcpe2lmKCEoVyBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpKXRocm93IFd9dGhpcy50b3RhbFBvcys9dGhpcy5wb3N9aWYoWil7aWYodGhpcy5oYXNSZW1haW5pbmcoMSkpdGhyb3cgdGhpcy5jcmVhdGVFeHRyYUJ5dGVFcnJvcih0aGlzLnRvdGFsUG9zKTtyZXR1cm4gSn1sZXR7aGVhZEJ5dGU6USxwb3M6Vix0b3RhbFBvczpZfT10aGlzO3Rocm93IFJhbmdlRXJyb3IoYEluc3VmZmljaWVudCBkYXRhIGluIHBhcnNpbmcgJHtQJChRKX0gYXQgJHtZfSAoJHtWfSBpbiB0aGUgY3VycmVudCBidWZmZXIpYCl9ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWRlY29kZUFycmF5U3RyZWFtKCQpe3JldHVybiB0aGlzLmRlY29kZU11bHRpQXN5bmMoJCwhMCl9ZGVjb2RlU3RyZWFtKCQpe3JldHVybiB0aGlzLmRlY29kZU11bHRpQXN5bmMoJCwhMSl9YXN5bmMqZGVjb2RlTXVsdGlBc3luYygkLFope2lmKHRoaXMuZW50ZXJlZCl7eWllbGQqdGhpcy5jbG9uZSgpLmRlY29kZU11bHRpQXN5bmMoJCxaKTtyZXR1cm59dHJ5e3RoaXMuZW50ZXJlZD0hMDtsZXQgSj1aLFE9LTE7Zm9yIGF3YWl0KGxldCBWIG9mICQpe2lmKFomJlE9PT0wKXRocm93IHRoaXMuY3JlYXRlRXh0cmFCeXRlRXJyb3IodGhpcy50b3RhbFBvcyk7aWYodGhpcy5hcHBlbmRCdWZmZXIoViksSilRPXRoaXMucmVhZEFycmF5U2l6ZSgpLEo9ITEsdGhpcy5jb21wbGV0ZSgpO3RyeXt3aGlsZSghMClpZih5aWVsZCB0aGlzLmRvRGVjb2RlU3luYygpLC0tUT09PTApYnJlYWt9Y2F0Y2goWSl7aWYoIShZIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikpdGhyb3cgWX10aGlzLnRvdGFsUG9zKz10aGlzLnBvc319ZmluYWxseXt0aGlzLmVudGVyZWQ9ITF9fWRvRGVjb2RlU3luYygpeyQ6d2hpbGUoITApe2xldCAkPXRoaXMucmVhZEhlYWRCeXRlKCksWjtpZigkPj0yMjQpWj0kLTI1NjtlbHNlIGlmKCQ8MTkyKWlmKCQ8MTI4KVo9JDtlbHNlIGlmKCQ8MTQ0KXtsZXQgUT0kLTEyODtpZihRIT09MCl7dGhpcy5wdXNoTWFwU3RhdGUoUSksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlICR9ZWxzZSBaPXt9fWVsc2UgaWYoJDwxNjApe2xldCBRPSQtMTQ0O2lmKFEhPT0wKXt0aGlzLnB1c2hBcnJheVN0YXRlKFEpLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSAkfWVsc2UgWj1bXX1lbHNle2xldCBRPSQtMTYwO1o9dGhpcy5kZWNvZGVTdHJpbmcoUSwwKX1lbHNlIGlmKCQ9PT0xOTIpWj1udWxsO2Vsc2UgaWYoJD09PTE5NClaPSExO2Vsc2UgaWYoJD09PTE5NSlaPSEwO2Vsc2UgaWYoJD09PTIwMilaPXRoaXMucmVhZEYzMigpO2Vsc2UgaWYoJD09PTIwMylaPXRoaXMucmVhZEY2NCgpO2Vsc2UgaWYoJD09PTIwNClaPXRoaXMucmVhZFU4KCk7ZWxzZSBpZigkPT09MjA1KVo9dGhpcy5yZWFkVTE2KCk7ZWxzZSBpZigkPT09MjA2KVo9dGhpcy5yZWFkVTMyKCk7ZWxzZSBpZigkPT09MjA3KWlmKHRoaXMudXNlQmlnSW50NjQpWj10aGlzLnJlYWRVNjRBc0JpZ0ludCgpO2Vsc2UgWj10aGlzLnJlYWRVNjQoKTtlbHNlIGlmKCQ9PT0yMDgpWj10aGlzLnJlYWRJOCgpO2Vsc2UgaWYoJD09PTIwOSlaPXRoaXMucmVhZEkxNigpO2Vsc2UgaWYoJD09PTIxMClaPXRoaXMucmVhZEkzMigpO2Vsc2UgaWYoJD09PTIxMSlpZih0aGlzLnVzZUJpZ0ludDY0KVo9dGhpcy5yZWFkSTY0QXNCaWdJbnQoKTtlbHNlIFo9dGhpcy5yZWFkSTY0KCk7ZWxzZSBpZigkPT09MjE3KXtsZXQgUT10aGlzLmxvb2tVOCgpO1o9dGhpcy5kZWNvZGVTdHJpbmcoUSwxKX1lbHNlIGlmKCQ9PT0yMTgpe2xldCBRPXRoaXMubG9va1UxNigpO1o9dGhpcy5kZWNvZGVTdHJpbmcoUSwyKX1lbHNlIGlmKCQ9PT0yMTkpe2xldCBRPXRoaXMubG9va1UzMigpO1o9dGhpcy5kZWNvZGVTdHJpbmcoUSw0KX1lbHNlIGlmKCQ9PT0yMjApe2xldCBRPXRoaXMucmVhZFUxNigpO2lmKFEhPT0wKXt0aGlzLnB1c2hBcnJheVN0YXRlKFEpLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSAkfWVsc2UgWj1bXX1lbHNlIGlmKCQ9PT0yMjEpe2xldCBRPXRoaXMucmVhZFUzMigpO2lmKFEhPT0wKXt0aGlzLnB1c2hBcnJheVN0YXRlKFEpLHRoaXMuY29tcGxldGUoKTtjb250aW51ZSAkfWVsc2UgWj1bXX1lbHNlIGlmKCQ9PT0yMjIpe2xldCBRPXRoaXMucmVhZFUxNigpO2lmKFEhPT0wKXt0aGlzLnB1c2hNYXBTdGF0ZShRKSx0aGlzLmNvbXBsZXRlKCk7Y29udGludWUgJH1lbHNlIFo9e319ZWxzZSBpZigkPT09MjIzKXtsZXQgUT10aGlzLnJlYWRVMzIoKTtpZihRIT09MCl7dGhpcy5wdXNoTWFwU3RhdGUoUSksdGhpcy5jb21wbGV0ZSgpO2NvbnRpbnVlICR9ZWxzZSBaPXt9fWVsc2UgaWYoJD09PTE5Nil7bGV0IFE9dGhpcy5sb29rVTgoKTtaPXRoaXMuZGVjb2RlQmluYXJ5KFEsMSl9ZWxzZSBpZigkPT09MTk3KXtsZXQgUT10aGlzLmxvb2tVMTYoKTtaPXRoaXMuZGVjb2RlQmluYXJ5KFEsMil9ZWxzZSBpZigkPT09MTk4KXtsZXQgUT10aGlzLmxvb2tVMzIoKTtaPXRoaXMuZGVjb2RlQmluYXJ5KFEsNCl9ZWxzZSBpZigkPT09MjEyKVo9dGhpcy5kZWNvZGVFeHRlbnNpb24oMSwwKTtlbHNlIGlmKCQ9PT0yMTMpWj10aGlzLmRlY29kZUV4dGVuc2lvbigyLDApO2Vsc2UgaWYoJD09PTIxNClaPXRoaXMuZGVjb2RlRXh0ZW5zaW9uKDQsMCk7ZWxzZSBpZigkPT09MjE1KVo9dGhpcy5kZWNvZGVFeHRlbnNpb24oOCwwKTtlbHNlIGlmKCQ9PT0yMTYpWj10aGlzLmRlY29kZUV4dGVuc2lvbigxNiwwKTtlbHNlIGlmKCQ9PT0xOTkpe2xldCBRPXRoaXMubG9va1U4KCk7Wj10aGlzLmRlY29kZUV4dGVuc2lvbihRLDEpfWVsc2UgaWYoJD09PTIwMCl7bGV0IFE9dGhpcy5sb29rVTE2KCk7Wj10aGlzLmRlY29kZUV4dGVuc2lvbihRLDIpfWVsc2UgaWYoJD09PTIwMSl7bGV0IFE9dGhpcy5sb29rVTMyKCk7Wj10aGlzLmRlY29kZUV4dGVuc2lvbihRLDQpfWVsc2UgdGhyb3cgbmV3IHMoYFVucmVjb2duaXplZCB0eXBlIGJ5dGU6ICR7UCQoJCl9YCk7dGhpcy5jb21wbGV0ZSgpO2xldCBKPXRoaXMuc3RhY2s7d2hpbGUoSi5sZW5ndGg+MCl7bGV0IFE9Si50b3AoKTtpZihRLnR5cGU9PT1aWilpZihRLmFycmF5W1EucG9zaXRpb25dPVosUS5wb3NpdGlvbisrLFEucG9zaXRpb249PT1RLnNpemUpWj1RLmFycmF5LEoucmVsZWFzZShRKTtlbHNlIGNvbnRpbnVlICQ7ZWxzZSBpZihRLnR5cGU9PT1ZJCl7aWYoWj09PSJfX3Byb3RvX18iKXRocm93IG5ldyBzKCJUaGUga2V5IF9fcHJvdG9fXyBpcyBub3QgYWxsb3dlZCIpO1Eua2V5PXRoaXMubWFwS2V5Q29udmVydGVyKFopLFEudHlwZT1JSjtjb250aW51ZSAkfWVsc2UgaWYoUS5tYXBbUS5rZXldPVosUS5yZWFkQ291bnQrKyxRLnJlYWRDb3VudD09PVEuc2l6ZSlaPVEubWFwLEoucmVsZWFzZShRKTtlbHNle1Eua2V5PW51bGwsUS50eXBlPVkkO2NvbnRpbnVlICR9fXJldHVybiBafX1yZWFkSGVhZEJ5dGUoKXtpZih0aGlzLmhlYWRCeXRlPT09ViQpdGhpcy5oZWFkQnl0ZT10aGlzLnJlYWRVOCgpO3JldHVybiB0aGlzLmhlYWRCeXRlfWNvbXBsZXRlKCl7dGhpcy5oZWFkQnl0ZT1WJH1yZWFkQXJyYXlTaXplKCl7bGV0ICQ9dGhpcy5yZWFkSGVhZEJ5dGUoKTtzd2l0Y2goJCl7Y2FzZSAyMjA6cmV0dXJuIHRoaXMucmVhZFUxNigpO2Nhc2UgMjIxOnJldHVybiB0aGlzLnJlYWRVMzIoKTtkZWZhdWx0OmlmKCQ8MTYwKXJldHVybiAkLTE0NDtlbHNlIHRocm93IG5ldyBzKGBVbnJlY29nbml6ZWQgYXJyYXkgdHlwZSBieXRlOiAke1AkKCQpfWApfX1wdXNoTWFwU3RhdGUoJCl7aWYoJD50aGlzLm1heE1hcExlbmd0aCl0aHJvdyBuZXcgcyhgTWF4IGxlbmd0aCBleGNlZWRlZDogbWFwIGxlbmd0aCAoJHskfSkgPiBtYXhNYXBMZW5ndGhMZW5ndGggKCR7dGhpcy5tYXhNYXBMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaE1hcFN0YXRlKCQpfXB1c2hBcnJheVN0YXRlKCQpe2lmKCQ+dGhpcy5tYXhBcnJheUxlbmd0aCl0aHJvdyBuZXcgcyhgTWF4IGxlbmd0aCBleGNlZWRlZDogYXJyYXkgbGVuZ3RoICgkeyR9KSA+IG1heEFycmF5TGVuZ3RoICgke3RoaXMubWF4QXJyYXlMZW5ndGh9KWApO3RoaXMuc3RhY2sucHVzaEFycmF5U3RhdGUoJCl9ZGVjb2RlU3RyaW5nKCQsWil7aWYoIXRoaXMucmF3U3RyaW5nc3x8dGhpcy5zdGF0ZUlzTWFwS2V5KCkpcmV0dXJuIHRoaXMuZGVjb2RlVXRmOFN0cmluZygkLFopO3JldHVybiB0aGlzLmRlY29kZUJpbmFyeSgkLFopfWRlY29kZVV0ZjhTdHJpbmcoJCxaKXtpZigkPnRoaXMubWF4U3RyTGVuZ3RoKXRocm93IG5ldyBzKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBVVEYtOCBieXRlIGxlbmd0aCAoJHskfSkgPiBtYXhTdHJMZW5ndGggKCR7dGhpcy5tYXhTdHJMZW5ndGh9KWApO2lmKHRoaXMuYnl0ZXMuYnl0ZUxlbmd0aDx0aGlzLnBvcytaKyQpdGhyb3cgcUo7bGV0IEo9dGhpcy5wb3MrWixRO2lmKHRoaXMuc3RhdGVJc01hcEtleSgpJiZ0aGlzLmtleURlY29kZXI/LmNhbkJlQ2FjaGVkKCQpKVE9dGhpcy5rZXlEZWNvZGVyLmRlY29kZSh0aGlzLmJ5dGVzLEosJCk7ZWxzZSBRPU5KKHRoaXMuYnl0ZXMsSiwkKTtyZXR1cm4gdGhpcy5wb3MrPVorJCxRfXN0YXRlSXNNYXBLZXkoKXtpZih0aGlzLnN0YWNrLmxlbmd0aD4wKXJldHVybiB0aGlzLnN0YWNrLnRvcCgpLnR5cGU9PT1ZJDtyZXR1cm4hMX1kZWNvZGVCaW5hcnkoJCxaKXtpZigkPnRoaXMubWF4QmluTGVuZ3RoKXRocm93IG5ldyBzKGBNYXggbGVuZ3RoIGV4Y2VlZGVkOiBiaW4gbGVuZ3RoICgkeyR9KSA+IG1heEJpbkxlbmd0aCAoJHt0aGlzLm1heEJpbkxlbmd0aH0pYCk7aWYoIXRoaXMuaGFzUmVtYWluaW5nKCQrWikpdGhyb3cgcUo7bGV0IEo9dGhpcy5wb3MrWixRPXRoaXMuYnl0ZXMuc3ViYXJyYXkoSixKKyQpO3JldHVybiB0aGlzLnBvcys9WiskLFF9ZGVjb2RlRXh0ZW5zaW9uKCQsWil7aWYoJD50aGlzLm1heEV4dExlbmd0aCl0aHJvdyBuZXcgcyhgTWF4IGxlbmd0aCBleGNlZWRlZDogZXh0IGxlbmd0aCAoJHskfSkgPiBtYXhFeHRMZW5ndGggKCR7dGhpcy5tYXhFeHRMZW5ndGh9KWApO2xldCBKPXRoaXMudmlldy5nZXRJbnQ4KHRoaXMucG9zK1opLFE9dGhpcy5kZWNvZGVCaW5hcnkoJCxaKzEpO3JldHVybiB0aGlzLmV4dGVuc2lvbkNvZGVjLmRlY29kZShRLEosdGhpcy5jb250ZXh0KX1sb29rVTgoKXtyZXR1cm4gdGhpcy52aWV3LmdldFVpbnQ4KHRoaXMucG9zKX1sb29rVTE2KCl7cmV0dXJuIHRoaXMudmlldy5nZXRVaW50MTYodGhpcy5wb3MpfWxvb2tVMzIoKXtyZXR1cm4gdGhpcy52aWV3LmdldFVpbnQzMih0aGlzLnBvcyl9cmVhZFU4KCl7bGV0ICQ9dGhpcy52aWV3LmdldFVpbnQ4KHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrKywkfXJlYWRJOCgpe2xldCAkPXRoaXMudmlldy5nZXRJbnQ4KHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrKywkfXJlYWRVMTYoKXtsZXQgJD10aGlzLnZpZXcuZ2V0VWludDE2KHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTIsJH1yZWFkSTE2KCl7bGV0ICQ9dGhpcy52aWV3LmdldEludDE2KHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTIsJH1yZWFkVTMyKCl7bGV0ICQ9dGhpcy52aWV3LmdldFVpbnQzMih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LCR9cmVhZEkzMigpe2xldCAkPXRoaXMudmlldy5nZXRJbnQzMih0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LCR9cmVhZFU2NCgpe2xldCAkPVVKKHRoaXMudmlldyx0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LCR9cmVhZEk2NCgpe2xldCAkPU0kKHRoaXMudmlldyx0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LCR9cmVhZFU2NEFzQmlnSW50KCl7bGV0ICQ9dGhpcy52aWV3LmdldEJpZ1VpbnQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LCR9cmVhZEk2NEFzQmlnSW50KCl7bGV0ICQ9dGhpcy52aWV3LmdldEJpZ0ludDY0KHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTgsJH1yZWFkRjMyKCl7bGV0ICQ9dGhpcy52aWV3LmdldEZsb2F0MzIodGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCwkfXJlYWRGNjQoKXtsZXQgJD10aGlzLnZpZXcuZ2V0RmxvYXQ2NCh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LCR9fWZ1bmN0aW9uIFFaKCQsWil7cmV0dXJuIG5ldyB3JChaKS5kZWNvZGUoJCl9Y2xhc3MgWCR7bGlzdGVuZXJzPW5ldyBNYXA7YWRkRXZlbnRMaXN0ZW5lcigkLFope2xldCBKPXRoaXMubGlzdGVuZXJzLmdldCgkKTtpZighSilKPW5ldyBTZXQsdGhpcy5saXN0ZW5lcnMuc2V0KCQsSik7cmV0dXJuIEouYWRkKFopLCgpPT57dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCQsWil9fXJlbW92ZUV2ZW50TGlzdGVuZXIoJCxaKXtsZXQgSj10aGlzLmxpc3RlbmVycy5nZXQoJCk7aWYoSil7aWYoSi5kZWxldGUoWiksSi5zaXplPT09MCl0aGlzLmxpc3RlbmVycy5kZWxldGUoJCl9fWVtaXQoJCxaKXtsZXQgSj10aGlzLmxpc3RlbmVycy5nZXQoJCk7aWYoSil7bGV0IFE9QXJyYXkuZnJvbShKKTtmb3IobGV0IFYgb2YgUSlWKFopfX1lbWl0QWxsKCQpe2xldCBaPUFycmF5LmZyb20odGhpcy5saXN0ZW5lcnMua2V5cygpKTtmb3IobGV0IEogb2YgWil0aGlzLmVtaXQoSiwkKX19Y2xhc3MgTDB7Z2V0dGVyO3N0YXRpYyBldmVudE5hbWU9InVwZGF0ZSI7ZW1pdHRlcjtjb25zdHJ1Y3RvcigkKXt0aGlzLmdldHRlcj0kO3RoaXMuZW1pdHRlcj1uZXcgWCR9Z2V0PSgpPT50aGlzLmdldHRlcigpO2FzeW5jIGVtaXQoKXtsZXQgJD1hd2FpdCB0aGlzLmdldHRlcigpO3F1ZXVlTWljcm90YXNrKCgpPT50aGlzLmVtaXR0ZXIuZW1pdChMMC5ldmVudE5hbWUsJCkpfWxpc3RlbigkKXtyZXR1cm4gdGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoTDAuZXZlbnROYW1lLCQpLCgpPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoTDAuZXZlbnROYW1lLCQpfX19ZnVuY3Rpb24gUigkKXtyZXR1cm5bJCwwXX1mdW5jdGlvbiBHKCQpe3JldHVyblt2b2lkIDAsJF19ZnVuY3Rpb24gdFEoJCl7aWYoJDwwKWNvbnNvbGUuaW5mbygiTiIsJCksY29uc29sZS50cmFjZSgpO2lmKHR5cGVvZiAkIT09ImJpZ2ludCIpJD1CaWdJbnQoJCk7aWYoJDwwbilyZXR1cm4gRygxMCk7bGV0IFo9W107d2hpbGUoJD4wbil7bGV0IEo9TnVtYmVyKCQmMHg3Zm4pO2lmKCQ+Pj03biwkPjBuKVoucHVzaChKfDEyOCk7ZWxzZSBaLnB1c2goSil9aWYoWi5sZW5ndGg9PT0wKXJldHVybiBSKG5ldyBVaW50OEFycmF5KFswXSkpO2lmKFoubGVuZ3RoPjgpcmV0dXJuIEcoMjYpO3JldHVybiBSKG5ldyBVaW50OEFycmF5KFopKX1mdW5jdGlvbiBlUSgkLFo9MCl7bGV0IEo9MG4sUT0wLFY9Wjt3aGlsZSghMCl7aWYoVj49JC5sZW5ndGgpcmV0dXJuIEcoMTQpO2xldCBZPSRbVisrXTtpZihZPT09dm9pZCAwKXJldHVybiBHKDE0KTtpZihKfD1CaWdJbnQoWSYxMjcpPDxCaWdJbnQoUSksKFkmMTI4KT09PTApe2lmKFYtWj44KXJldHVybiBHKDI2KTtyZXR1cm4gUih7dmFsdWU6Sj4weDFmZmZmZmZmZmZmZmZmbj9KOk51bWJlcihKKSxieXRlc1JlYWQ6Vi1afSl9aWYoUSs9NyxRPj01NilyZXR1cm4gRygyNil9fWNsYXNzIGd7ZGF0YTtwb3M9MDtjb25zdHJ1Y3RvcigkKXt0aGlzLmRhdGE9JH1zdGF0aWMgYXN5bmMgZnJvbVJlc3BvbnNlKCQpe2xldCBaPWF3YWl0ICQuYXJyYXlCdWZmZXIoKSxKPW5ldyBVaW50OEFycmF5KFopO3JldHVybiBuZXcgZyhKKX1yZWFkQmlnSW50KCl7aWYodGhpcy5wb3MrOD50aGlzLmRhdGEubGVuZ3RoKXJldHVybiBHKDcpO2xldCAkPW5ldyBEYXRhVmlldyh0aGlzLmRhdGEuYnVmZmVyLHRoaXMuZGF0YS5ieXRlT2Zmc2V0K3RoaXMucG9zKS5nZXRCaWdVaW50NjQoMCwhMSk7cmV0dXJuIHRoaXMucG9zKz04LFIoJCl9cmVhZERhdGUoKXtsZXRbJCxaXT10aGlzLnJlYWRWYXJJbnQoKTtpZihaIT09MClyZXR1cm4gRyhaKTtyZXR1cm4gUihuZXcgRGF0ZSgkKSl9cmVhZFZhckludCgpe2xldFskLFpdPWVRKHRoaXMuZGF0YSx0aGlzLnBvcyk7aWYoWiE9PTApcmV0dXJuIEcoWik7dGhpcy5wb3MrPSQuYnl0ZXNSZWFkO2xldCBKPSQudmFsdWU7cmV0dXJuIFIodHlwZW9mIEo9PT0iYmlnaW50Ij9OdW1iZXIoSik6Sil9cmVhZFZhclN0cmluZygpe2xldFskLFpdPXRoaXMucmVhZFZhckludCgpO2lmKFohPT0wKXJldHVybiBHKFopO2xldFtKLFFdPXRoaXMucmVhZEJ5dGVzKCQpO2lmKFEhPT0wKXJldHVybiBHKFEpO2xldCBWPW5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShKKTtyZXR1cm4gUihWKX1yZWFkQnl0ZXMoJCl7aWYoJDwwKXJldHVybiBHKDEwKTtpZih0aGlzLnBvcyskPnRoaXMuZGF0YS5sZW5ndGgpcmV0dXJuIEcoMjMpO2xldCBaPXRoaXMuZGF0YS5zbGljZSh0aGlzLnBvcyx0aGlzLnBvcyskKTtyZXR1cm4gdGhpcy5wb3MrPSQsUihaKX1yZWFkVmFyQnl0ZXMoKXtsZXRbJCxaXT10aGlzLnJlYWRWYXJJbnQoKTtpZihaIT09MClyZXR1cm4gRyhaKTtyZXR1cm4gdGhpcy5yZWFkQnl0ZXMoJCl9cmVhZFN0cnVjdCgkKXtyZXR1cm4gJC5kZWNvZGUodGhpcyl9cmVhZFN0cnVjdHMoJCl7bGV0IFo9W107d2hpbGUoIXRoaXMuZG9uZSgpKXtsZXRbSixRXT10aGlzLnJlYWRTdHJ1Y3QoJCk7aWYoUSE9PTApcmV0dXJuIEcoUSk7Wi5wdXNoKEopfXJldHVybiBSKFopfXJlYWRCeXRlc1NlcSgkKXtsZXQgWj1bXTt3aGlsZSghdGhpcy5kb25lKCkpe2xldFtKLFFdPXRoaXMucmVhZEJ5dGVzKCQpO2lmKFEhPT0wKXJldHVybiBHKFEpO1oucHVzaChKKX1yZXR1cm4gUihaKX1kb25lKCl7cmV0dXJuIHRoaXMucG9zPj10aGlzLmRhdGEubGVuZ3RofWNvbnN1bWVkKCl7cmV0dXJuIHRoaXMucG9zfX1jbGFzcyBTe3BhcnRzPVtdO3dyaXRlQmlnSW50KCQpe2xldCBaPW5ldyBVaW50OEFycmF5KDgpO25ldyBEYXRhVmlldyhaLmJ1ZmZlcikuc2V0QmlnVWludDY0KDAsJCwhMSksdGhpcy5wYXJ0cy5wdXNoKFopfXdyaXRlRGF0ZSgkKXtsZXQgWj0kLmdldFRpbWUoKTtyZXR1cm4gdGhpcy53cml0ZVZhckludChaKX13cml0ZVZhckludCgkKXtsZXRbWixKXT10USgkKTtpZihKIT09MClyZXR1cm4gSjtyZXR1cm4gdGhpcy5wYXJ0cy5wdXNoKFopLDB9d3JpdGVWYXJTdHJpbmcoJCl7bGV0IFo9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCQpLEo9dGhpcy53cml0ZVZhckludChaLmxlbmd0aCk7aWYoSiE9PTApcmV0dXJuIEo7cmV0dXJuIHRoaXMud3JpdGVCeXRlcyhaKSwwfXByZXBlbmRCeXRlcygkKXt0aGlzLnBhcnRzLnVuc2hpZnQoJCl9d3JpdGVCeXRlcygkKXt0aGlzLnBhcnRzLnB1c2goJCl9d3JpdGVWYXJCeXRlcygkKXtsZXQgWj10aGlzLndyaXRlVmFySW50KCQubGVuZ3RoKTtpZihaIT09MClyZXR1cm4gWjtyZXR1cm4gdGhpcy53cml0ZUJ5dGVzKCQpLDB9d3JpdGVTdHJ1Y3QoJCxaKXtyZXR1cm4gJC5lbmNvZGUodGhpcyxaKX13cml0ZVN0cnVjdHMoJCxaKXtmb3IobGV0IEogb2YgWil7bGV0IFE9dGhpcy53cml0ZVN0cnVjdCgkLEopO2lmKFEhPT0wKXJldHVybiBRfXJldHVybiAwfXdyaXRlQnl0ZXNTZXEoJCl7Zm9yKGxldCBaIG9mICQpdGhpcy53cml0ZUJ5dGVzKFopfXJlc3VsdCgpe2xldCAkPXRoaXMucGFydHMucmVkdWNlKChRLFYpPT5RK1YubGVuZ3RoLDApLFo9bmV3IFVpbnQ4QXJyYXkoJCksSj0wO2ZvcihsZXQgUSBvZiB0aGlzLnBhcnRzKVouc2V0KFEsSiksSis9US5sZW5ndGg7cmV0dXJuIFp9KnNjYW4oKXtmb3IobGV0ICQgb2YgdGhpcy5wYXJ0cyl5aWVsZCAkfX1hc3luYyBmdW5jdGlvbiBWWigkLFope2xldCBKPW5ldyBTLFE9Si53cml0ZURhdGUoWik7aWYoUSE9PTApcmV0dXJuIEcoUSk7bGV0IFY9Si5yZXN1bHQoKSxZPWF3YWl0ICQuc2lnbihWKTtyZXR1cm4gUih7cHViS2V5OiQucHVibGljS2V5LHNpZzpZLHRpbWVzdGFtcDpafSl9YXN5bmMgZnVuY3Rpb24gRDAoJCxaLEope2xldCBRPUoubm93KCkuZ2V0VGltZSgpLFY9JC50aW1lc3RhbXAuZ2V0VGltZSgpO2lmKE1hdGguYWJzKFEtVik+V0opcmV0dXJuIDQ7bGV0IFg9bmV3IFM7WC53cml0ZURhdGUoJC50aW1lc3RhbXApO2xldCBXPVgucmVzdWx0KCk7aWYoIWF3YWl0IFouY2hlY2tTaWdFZDI1NTE5KCQuc2lnLFcsJC5wdWJLZXkpKXJldHVybiAzO3JldHVybiAwfXZhciBRMD17ZW5jb2RlKCQsWil7bGV0IEo9JC53cml0ZVZhckJ5dGVzKFouaWQpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVEYXRlKFoudHMpO2lmKFEhPT0wKXJldHVybiBRO3JldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkVmFyQnl0ZXMoKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWREYXRlKCk7aWYoViE9PTApcmV0dXJuIEcoVik7cmV0dXJuIFIoe2lkOlosdHM6UX0pfX07ZnVuY3Rpb24gVCQoJCl7bGV0IFo9bmV3IFMsSj1aLndyaXRlU3RydWN0KFEwLCQpO2lmKEohPT0wKXJldHVybiBHKEopO2xldCBRPVoucmVzdWx0KCk7cmV0dXJuIFIoUSl9dmFyIFgwPXtlbmNvZGUoJCxaKXtsZXQgSj0kLndyaXRlVmFyQnl0ZXMoWi5laWQpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVWYXJJbnQoWi5vZmYpO2lmKFEhPT0wKXJldHVybiBRO2xldCBWPSQud3JpdGVWYXJJbnQoWi5jdHIpO2lmKFYhPT0wKXJldHVybiBWO2xldCBZPSQud3JpdGVWYXJJbnQoWi5sZW4pO2lmKFkhPT0wKXJldHVybiBZO2lmKFouaHNoKSQud3JpdGVCeXRlcyhaLmhzaCk7cmV0dXJuIDB9LGRlY29kZSgkKXtsZXRbWixKXT0kLnJlYWRWYXJCeXRlcygpO2lmKEohPT0wKXJldHVybiBHKEopO2xldCBRPW5ldyBnKFopLFssVl09UTAuZGVjb2RlKFEpO2lmKFYhPT0wKXJldHVybiBHKFYpO2xldFtZLFhdPSQucmVhZFZhckludCgpO2lmKFghPT0wKXJldHVybiBHKFgpO2xldFtXLHpdPSQucmVhZFZhckludCgpO2lmKHohPT0wKXJldHVybiBHKHopO2xldFtLLEZdPSQucmVhZFZhckludCgpO2lmKEYhPT0wKXJldHVybiBHKEYpO2xldCBOO2lmKEs+MCl7bGV0W1UsT109JC5yZWFkQnl0ZXMoSSQpO2lmKE8hPT0wKXJldHVybiBHKE8pO049VX1yZXR1cm4gUih7ZWlkOlosb2ZmOlksY3RyOlcsbGVuOkssaHNoOk59KX19O2Z1bmN0aW9uIE4wKCQpe3JldHVybiBBcnJheS5mcm9tKCQpLm1hcCgoSik9PkoudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiIil9ZnVuY3Rpb24gRCQoJCl7aWYoJC5sZW5ndGglMiE9PTApdGhyb3cgRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO2xldCBaPW5ldyBVaW50OEFycmF5KCQubGVuZ3RoLzIpO2ZvcihsZXQgSj0wO0o8JC5sZW5ndGg7Sis9MilaW0ovMl09TnVtYmVyLnBhcnNlSW50KCQuc3Vic3RyKEosMiksMTYpO3JldHVybiBafWZ1bmN0aW9uIFYwKCQsWil7aWYoJD09PVopcmV0dXJuITA7aWYoJC5ieXRlTGVuZ3RoIT09Wi5ieXRlTGVuZ3RoKXJldHVybiExO3JldHVybiAkLmV2ZXJ5KChKLFEpPT5KPT09WltRXSl9dmFyIGY7aWYodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvQmFzZTY0PT09ImZ1bmN0aW9uIilmPSgkKT0+JC50b0Jhc2U2NCgpO2Vsc2UgZj0oJCk9PmJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi4kKSk7dmFyIEYwO2lmKHR5cGVvZiBVaW50OEFycmF5LmZyb21CYXNlNjQ9PT0iZnVuY3Rpb24iKUYwPSgkKT0+VWludDhBcnJheS5mcm9tQmFzZTY0KCQpO2Vsc2UgRjA9KCQpPT5VaW50OEFycmF5LmZyb20oYXRvYigkKSwoWik9PlouY2hhckNvZGVBdCgwKSk7ZnVuY3Rpb24gVyQoJCxaKXtsZXQgSj1uZXcgVWludDhBcnJheSgkLmxlbmd0aCtaLmxlbmd0aCk7cmV0dXJuIEouc2V0KCQsMCksSi5zZXQoWiwkLmxlbmd0aCksSn1mdW5jdGlvbiBNSigkLFosSil7cmV0dXJuIEouY2hlY2tTaWdFZDI1NTE5KCQuc2lnLCQuaGVhZENwaCxaKX1hc3luYyBmdW5jdGlvbiBDSigkLFosSixRKXtsZXQgVjtpZigkLmJvZCYmJC5sZW4+MClWPWF3YWl0IEouYmxha2UzKCQuYm9kKTtsZXQgWT1uZXcgUyxYPVgwLmVuY29kZShZLHsuLi4kLGhzaDpWfSk7aWYoWCE9PTApcmV0dXJuIEcoWCk7bGV0IFc9WS5yZXN1bHQoKSx6PWF3YWl0IFoua2RtRm9yKFcpLEs9US5kZXJpdmVDaXBoZXIoeiwiZW5jcnlwdCIpLEY9YXdhaXQgSy5lbmNyeXB0KFcpLE49JC5ib2Q/YXdhaXQgSy5lbmNyeXB0KCQuYm9kKTpuZXcgVWludDhBcnJheSgwKSxVPWF3YWl0IFouc2lnbihGKTtyZXR1cm4gUih7c2lnOlUsa2RtOnosaGVhZENwaDpGLGJvZHlDcGg6Tn0pfWFzeW5jIGZ1bmN0aW9uIFlaKCQsWixKLFEsVil7bGV0IFk9bmV3IGcoJCksW1gsV109WDAuZGVjb2RlKFkpO2lmKFchPT0wKXJldHVybiBHKDE0KTtsZXQgejt0cnl7ej1aJiZaLmxlbmd0aD4wP2F3YWl0IEouZGVjcnlwdChaKTp2b2lkIDB9Y2F0Y2h7cmV0dXJuIEcoMjApfWxldCBLPVguaHNoJiZ6PT09dm9pZCAwLEY9WC5oc2g9PT12b2lkIDAmJnohPT12b2lkIDA7aWYoS3x8RilyZXR1cm4gRygxOSk7aWYoWC5oc2gmJnope2xldCBVPWF3YWl0IFEuYmxha2UzKHopO2lmKCFWMChVLFguaHNoKSlyZXR1cm4gRygxOSl9bGV0IE49Vj8/YXdhaXQgUS5ibGFrZTMoJCk7cmV0dXJuIFIoe21zZ0hlYWQ6WCxib2Q6eixoZWFkSGFzaDpOfSl9Y2xhc3MgWFp7bm93KCl7cmV0dXJuIG5ldyBEYXRlfX1mdW5jdGlvbiBQSigkLFosSixRKXtsZXQgVj1aLmdldFRpbWUoKS0kLmdldFRpbWUoKSxZPUouZ2V0VGltZSgpLVEuZ2V0VGltZSgpO3JldHVybihWK1kpLzJ9dmFyIEckPXtlbmNvZGUoJCxaKXtpZigkLndyaXRlVmFySW50KFoucXVvdGEpLFoucXVvdGE+MCl7aWYoWi51c2FnZT09PXZvaWQgMClyZXR1cm4gOTskLndyaXRlVmFySW50KFoudXNhZ2UpfXJldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkVmFySW50KCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0IFE7aWYoWj4wKXtsZXRbVixZXT0kLnJlYWRWYXJJbnQoKTtpZihZIT09MClyZXR1cm4gRyhZKTtRPVZ9cmV0dXJuIFIoe3F1b3RhOlosdXNhZ2U6UX0pfX07dmFyIFdaPXtlbmNvZGUoJCxaKXskLndyaXRlQnl0ZXMobmV3IFVpbnQ4QXJyYXkoW1ouc3RhdHVzXSkpO2xldCBKPSQud3JpdGVEYXRlKFoudGltZVJjdmQpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVEYXRlKFoudGltZVNlbnQpO2lmKFEhPT0wKXJldHVybiBRO2xldCBWPSQud3JpdGVWYXJJbnQoWi5zdWJzY3JpcHRpb24udGVybSk7aWYoViE9PTApcmV0dXJuIFY7bGV0IFk9JC53cml0ZVZhckludChaLnN1YnNjcmlwdGlvbi5lbGFwc2VkKTtpZihZIT09MClyZXR1cm4gWTtsZXQgWD0kLndyaXRlU3RydWN0KEckLFouc3Vic2NyaXB0aW9uLnN0YXQpO2lmKFghPT0wKXJldHVybiBYO2xldCBXPSQud3JpdGVTdHJ1Y3QoRyQsWi5zdWJzY3JpcHRpb24uZHluKTtpZihXIT09MClyZXR1cm4gVztyZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZEJ5dGVzKDEpO2lmKEohPT0wKXJldHVybiBHKEopO2xldCBRPVpbMF0sW1YsWV09JC5yZWFkRGF0ZSgpO2lmKFkhPT0wKXJldHVybiBHKFkpO2xldFtYLFddPSQucmVhZERhdGUoKTtpZihXIT09MClyZXR1cm4gRyhXKTtsZXRbeixLXT0kLnJlYWRWYXJJbnQoKTtpZihLIT09MClyZXR1cm4gRyhLKTtsZXRbRixOXT0kLnJlYWRWYXJJbnQoKTtpZihOIT09MClyZXR1cm4gRyhOKTtsZXRbVSxPXT0kLnJlYWRTdHJ1Y3QoRyQpO2lmKE8hPT0wKXJldHVybiBHKE8pO2xldFtxLEldPSQucmVhZFN0cnVjdChHJCk7aWYoSSE9PTApcmV0dXJuIEcoSSk7cmV0dXJuIFIoe3N0YXR1czpRLHRpbWVSY3ZkOlYsdGltZVNlbnQ6WCxzdWJzY3JpcHRpb246e3Rlcm06eixlbGFwc2VkOkYsc3RhdDpVLGR5bjpxfX0pfX07dmFyIEdaPXtlbmNvZGUoJCxaKXtsZXQgSj0kLndyaXRlVmFyQnl0ZXMoWi5oZWFkQ3BoKTtpZihKIT09MClyZXR1cm4gSjtsZXQgUT0kLndyaXRlVmFySW50KFouc2VxKTtpZihRIT09MClyZXR1cm4gUTtyZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZFZhckJ5dGVzKCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0W1EsVl09JC5yZWFkVmFySW50KCk7aWYoViE9PTApcmV0dXJuIEcoVik7cmV0dXJuIFIoe2hlYWRDcGg6WixzZXE6UX0pfX07dmFyIFkwPXtlbmNvZGUoJCxaKXskLndyaXRlQnl0ZXMoWi5wdWJLZXkpLCQud3JpdGVCeXRlcyhaLnNpZyk7bGV0IEo9JC53cml0ZURhdGUoWi50aW1lc3RhbXApO2lmKEohPT0wKXJldHVybiBKO3JldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkQnl0ZXMoWEopO2lmKEohPT0wKXJldHVybiBHKEopO2xldFtRLFZdPSQucmVhZEJ5dGVzKHcwKTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXRbWSxYXT0kLnJlYWREYXRlKCk7aWYoWCE9PTApcmV0dXJuIEcoWCk7cmV0dXJuIFIoe3B1YktleTpaLHNpZzpRLHRpbWVzdGFtcDpZfSl9fTt2YXIgd0o9e2FzeW5jIGVuY29kZVJlcSgkLFosSixRLFYpe2xldCBZPVYud3JpdGVTdHJ1Y3QoWTAsSik7aWYoWSE9PTApcmV0dXJuIFk7Zm9yKGxldCBYIG9mIFEpVi53cml0ZVZhckludChYKTtyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKCQsWixKKXtsZXR7Y2xvY2s6USxjcnlwdG86VixzdG9yYWdlOll9PSQsW1gsV109Wi5yZWFkU3RydWN0KFkwKTtpZihXIT09MClyZXR1cm4gVztsZXQgej1hd2FpdCBEMChYLFYsUSk7aWYoeiE9PTApcmV0dXJuIHo7bGV0e3B1YktleTpLfT1YLFtGLE5dPWF3YWl0IFkuaGFzVXNlcihLKTtpZihOIT09MClyZXR1cm4gTjtpZighRilyZXR1cm4gNTtsZXRbVSxPXT1aLnJlYWRWYXJJbnQoKTtpZihPIT09MClyZXR1cm4gTztpZighWi5kb25lKCkpcmV0dXJuIDg7bGV0W3EsSV09YXdhaXQgWS5saXN0SGVhZHMoSyxVKTtpZihJIT09MClyZXR1cm4gSTtyZXR1cm4gSi53cml0ZVN0cnVjdHMoR1oscSl9LGRlY29kZVJlc3AoJCl7cmV0dXJuICQucmVhZFN0cnVjdHMoR1opfX07dmFyIHpaPXtlbmNvZGUoJCxaKXskLndyaXRlVmFySW50KFouc2VxKTtsZXQgSj0kLndyaXRlVmFyQnl0ZXMoWi5ib2R5Q3BoKTtpZihKIT09MClyZXR1cm4gSjtyZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZFZhckludCgpO2lmKEohPT0wKXJldHVybiBHKEopO2xldFtRLFZdPSQucmVhZFZhckJ5dGVzKCk7aWYoViE9PTApcmV0dXJuIEcoVik7cmV0dXJuIFIoe3NlcTpaLGJvZHlDcGg6UX0pfX07dmFyIFRKPXthc3luYyBlbmNvZGVSZXEoJCxaLEosUSxWKXtsZXQgWT1WLndyaXRlU3RydWN0KFkwLEopO2lmKFkhPT0wKXJldHVybiBZO2ZvcihsZXQgWCBvZiBRKXtsZXQgVz1WLndyaXRlVmFySW50KFgpO2lmKFchPT0wKXJldHVybiBXfXJldHVybiAwfSxhc3luYyBoYW5kbGVSZXEoJCxaLEope2xldHtjbG9jazpRLGNyeXB0bzpWLHN0b3JhZ2U6WX09JCxbWCxXXT1aLnJlYWRTdHJ1Y3QoWTApO2lmKFchPT0wKXJldHVybiBXO2xldCB6PWF3YWl0IEQwKFgsVixRKTtpZih6IT09MClyZXR1cm4gejtsZXR7cHViS2V5Okt9PVgsW0YsTl09YXdhaXQgWS5oYXNVc2VyKEspO2lmKE4hPT0wKXJldHVybiBOO2lmKCFGKXJldHVybiA1O2xldCBVPVtdO3doaWxlKCFaLmRvbmUoKSl7bGV0W0ksSF09Wi5yZWFkVmFySW50KCk7aWYoSCE9PTApcmV0dXJuIEg7VS5wdXNoKEkpfWNvbnNvbGUuaW5mbyhgUFVMTDogJHtVLmxlbmd0aH0gYmFnc2ApO2xldFtPLHFdPWF3YWl0IFkuZ2V0Qm9kaWVzKEssVSk7aWYocSE9PTApcmV0dXJuIHE7aWYoIU8pcmV0dXJuIDE3O2ZvcihsZXR7c2VxOkksYm9keUNwaDpIfW9mIE8pe2xldCBQPXtzZXE6SSxib2R5Q3BoOkh9LEM9Si53cml0ZVN0cnVjdCh6WixQKTtpZihDIT09MClyZXR1cm4gQ31yZXR1cm4gMH0sZGVjb2RlUmVzcCgkKXtyZXR1cm4gJC5yZWFkU3RydWN0cyh6Wil9fTt2YXIgS1o9e2VuY29kZSgkLFopeyQud3JpdGVCeXRlcyhaLnNpZyksJC53cml0ZUJ5dGVzKFoua2RtKTtsZXQgSj0kLndyaXRlVmFyQnl0ZXMoWi5oZWFkQ3BoKTtpZihKIT09MClyZXR1cm4gSjtsZXQgUT0kLndyaXRlVmFyQnl0ZXMoWi5ib2R5Q3BoKTtpZihRIT09MClyZXR1cm4gUTtyZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZEJ5dGVzKHcwKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWRCeXRlcyhUMCk7aWYoViE9PTApcmV0dXJuIEcoVik7bGV0W1ksWF09JC5yZWFkVmFyQnl0ZXMoKTtpZihYIT09MClyZXR1cm4gRyhYKTtsZXRbVyx6XT0kLnJlYWRWYXJCeXRlcygpO2lmKHohPT0wKXJldHVybiBHKHopO3JldHVybiBSKHtzaWc6WixrZG06USxoZWFkQ3BoOlksYm9keUNwaDpXfSl9fTt2YXIgaiQ9e2VuY29kZSgkLFope2xldCBKPSQud3JpdGVWYXJJbnQoWi5zZXEpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVWYXJCeXRlcyhaLmhlYWRDcGgpO2lmKFEhPT0wKXJldHVybiBRO2xldCBWPVouYm9keUNwaD9aLmJvZHlDcGgubGVuZ3RoOjAsWT0kLndyaXRlVmFySW50KFYpO2lmKFkhPT0wKXJldHVybiBZO2lmKFY+MCl7aWYoIVouYm9keUNwaClyZXR1cm4gMTA7JC53cml0ZUJ5dGVzKFouYm9keUNwaCl9cmV0dXJuIDB9LGRlY29kZSgkKXtsZXRbWixKXT0kLnJlYWRWYXJJbnQoKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWRWYXJCeXRlcygpO2lmKFYhPT0wKXJldHVybiBHKFYpO2xldFtZLFhdPSQucmVhZFZhckludCgpO2lmKFghPT0wKXJldHVybiBHKFgpO2xldCBXO2lmKFk+MCl7bGV0W3osS109JC5yZWFkQnl0ZXMoWSk7aWYoSyE9PTApcmV0dXJuIEcoSyk7Vz16fXJldHVybiBSKHtzZXE6WixoZWFkQ3BoOlEsYm9keUNwaDpXfSl9fTt2YXIgQSQ9e2VuY29kZSgkLFopeyQud3JpdGVCeXRlcyhaLnNpZyksJC53cml0ZUJ5dGVzKFoua2RtKTtsZXQgSj0kLndyaXRlVmFyQnl0ZXMoWi5oZWFkQ3BoKTtpZihKIT09MClyZXR1cm4gSjtyZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZEJ5dGVzKHcwKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWRCeXRlcyhUMCk7aWYoViE9PTApcmV0dXJuIEcoVik7bGV0W1ksWF09JC5yZWFkVmFyQnl0ZXMoKTtpZihYIT09MClyZXR1cm4gRyhYKTtyZXR1cm4gUih7c2lnOlosa2RtOlEsaGVhZENwaDpZfSl9fTt2YXIgXyQ9e2VuY29kZSgkLFope2lmKCQud3JpdGVWYXJJbnQoWi5pZHgpLCQud3JpdGVCeXRlcyhuZXcgVWludDhBcnJheShbWi5zdGF0dXNdKSksWi5zdGF0dXM9PT0wKSQud3JpdGVWYXJJbnQoWi5zZXEpO3JldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkVmFySW50KCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0W1EsVl09JC5yZWFkQnl0ZXMoMSk7aWYoViE9PTApcmV0dXJuIEcoVik7bGV0IFk9UVswXTtpZihZIT09MClyZXR1cm4gUih7aWR4Olosc3RhdHVzOll9KTtsZXRbWCxXXT0kLnJlYWRWYXJJbnQoKTtpZihXIT09MClyZXR1cm4gRyhXKTtyZXR1cm4gUih7aWR4Olosc3RhdHVzOlksc2VxOlh9KX19O3ZhciBESj17YXN5bmMgZW5jb2RlUmVxKCQsWixKLFEsVil7bGV0IFk9Vi53cml0ZVN0cnVjdChZMCxKKTtpZihZIT09MClyZXR1cm4gWTtsZXQgWD1WLndyaXRlU3RydWN0cyhLWixRKTtpZihYIT09MClyZXR1cm4gWDtyZXR1cm4gMH0sYXN5bmMgaGFuZGxlUmVxKCQsWixKKXtsZXR7Y2xvY2s6USxjcnlwdG86VixzdG9yYWdlOlksbm90aWZpZXI6WH09JCxbVyx6XT1aLnJlYWRTdHJ1Y3QoWTApO2lmKHohPT0wKXJldHVybiB6O2xldCBLPWF3YWl0IEQwKFcsVixRKTtpZihLIT09MClyZXR1cm4gSztsZXR7cHViS2V5OkZ9PVcsW04sVV09YXdhaXQgWS5oYXNVc2VyKEYpO2lmKFUhPT0wKXJldHVybiBVO2lmKCFOKXJldHVybiA1O2xldFtPLHFdPVoucmVhZFN0cnVjdHMoS1opO2lmKHEhPT0wKXJldHVybiBxO2NvbnNvbGUuaW5mbyhgUFVTSDogJHtPLmxlbmd0aH0gYmFnc2ApO2xldCBJPVtdLEg9W107Zm9yKGxldCBNPTA7TTxPLmxlbmd0aDtNKyspe2xldCBBPU9bTV07aWYoIWF3YWl0IE1KKEEsRixWKSl7bGV0IG09e2lkeDpNLHN0YXR1czozfSxFPUoud3JpdGVTdHJ1Y3QoXyQsbSk7aWYoRSE9PTApcmV0dXJuIEU7Y29udGludWV9SS5wdXNoKE0pLEgucHVzaChBKX1sZXRbUCxDXT1hd2FpdCBZLnNldEJhZ3MoRixIKTtpZihDIT09MClyZXR1cm4gQztpZighUHx8UC5sZW5ndGghPT1ILmxlbmd0aClyZXR1cm4gMTc7bGV0IFQ9W107Zm9yKGxldCBNPTA7TTxILmxlbmd0aDtNKyspe2xldCBBPUhbTV0seD1JW01dLG09UFtNXSxFPW5ldyBTLGs9RS53cml0ZVN0cnVjdChBJCxBKTtpZihrIT09MClyZXR1cm4gaztsZXQgYj1FLnJlc3VsdCgpLHc9e3NlcTptLGhlYWRDcGg6Yn07aWYoTy5sZW5ndGg9PT0xJiZBLmJvZHlDcGgubGVuZ3RoPD1HSil3LmJvZHlDcGg9QS5ib2R5Q3BoO1QucHVzaCh3KTtsZXQgaD17aWR4Ongsc3RhdHVzOjAsc2VxOm19LGw9Si53cml0ZVN0cnVjdChfJCxoKTtpZihsIT09MClyZXR1cm4gbH1pZihULmxlbmd0aD4wKXtsZXQgTT1uZXcgUyxBPU0ud3JpdGVTdHJ1Y3RzKGokLFQpO2lmKEEhPT0wKXJldHVybiBBO2xldCB4PU0ucmVzdWx0KCk7YXdhaXQgUHJvbWlzZS5yZXNvbHZlKFgucHVzaChGLHgpKX1yZXR1cm4gMH0sZGVjb2RlUmVzcCgkKXtyZXR1cm4gJC5yZWFkU3RydWN0cyhfJCl9fTt2YXIgako9e2FzeW5jIGVuY29kZVJlcSgkLFosSixRLFYpe3JldHVybiBWLndyaXRlU3RydWN0KFkwLEopfSxhc3luYyBoYW5kbGVSZXEoJCxaLEope2xldHtjbG9jazpRLGNyeXB0bzpWLHN0b3JhZ2U6WX09JCxbWCxXXT1aLnJlYWRTdHJ1Y3QoWTApO2lmKFchPT0wKXJldHVybiBXO2xldCB6PWF3YWl0IEQwKFgsVixRKTtpZih6IT09MClyZXR1cm4gejtsZXR7cHViS2V5Okt9PVg7aWYoIVouZG9uZSgpKXJldHVybiA4O2xldFtGLE5dPWF3YWl0IFkuYWRkVXNlcihLKTtpZihOIT09MClyZXR1cm4gTjtyZXR1cm4gMH0sZGVjb2RlUmVzcCgkKXtyZXR1cm4gUih2b2lkIDApfX07Y2xhc3MgRlp7dXJsO3dlYnNvY2tldDtjb25zdHJ1Y3RvcigkKXt0aGlzLnVybD0kfWNvbm5lY3RlZCgpe3JldHVybiB0aGlzLndlYnNvY2tldCE9PXZvaWQgMCYmdGhpcy53ZWJzb2NrZXQucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOfWFzeW5jIGNvbm5lY3QoJCxaLEo9KCk9Pnt9LFE9KCk9Pnt9KXtsZXR7dXJsOlZ9PXRoaXM7aWYodGhpcy53ZWJzb2NrZXQpdGhpcy53ZWJzb2NrZXQuY2xvc2UoKSx0aGlzLndlYnNvY2tldD12b2lkIDA7bGV0IFk9bmV3IFM7WS53cml0ZVN0cnVjdChZMCwkKTtsZXQgWD1ZLnJlc3VsdCgpLFc9TjAoWCk7cmV0dXJuIFYuc2VhcmNoUGFyYW1zLnNldCgidCIsVyksdGhpcy53ZWJzb2NrZXQ9bmV3IFdlYlNvY2tldChWKSx0aGlzLndlYnNvY2tldC5iaW5hcnlUeXBlPSJhcnJheWJ1ZmZlciIsdGhpcy53ZWJzb2NrZXQub25vcGVuPSgpPT57Y29uc29sZS5sb2coIkNPTk5FQ1RFRCIpLFEoKX0sdGhpcy53ZWJzb2NrZXQub25jbG9zZT0oKT0+e2NvbnNvbGUubG9nKCJESVNDT05ORUNURUQiKSx0aGlzLndlYnNvY2tldD12b2lkIDAsSigpfSx0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2U9KHopPT57bGV0IEs9bmV3IFVpbnQ4QXJyYXkoei5kYXRhKTtaKEspfSx0aGlzLndlYnNvY2tldC5vbmVycm9yPSh6KT0+e2NvbnNvbGUubG9nKGBFUlJPUjogJHtKU09OLnN0cmluZ2lmeSh6KX1gKSx0aGlzLndlYnNvY2tldD12b2lkIDAsSigpfSxQcm9taXNlLnJlc29sdmUoMCl9ZGlzY29ubmVjdCgpe3RoaXMud2Vic29ja2V0Py5jbG9zZSgpLHRoaXMud2Vic29ja2V0PXZvaWQgMH19dmFyIHI9e3VzZXI6e3BhdGg6Ii91c2VyIixlbmRwb2ludDpqSixuYW1lOjB9LHB1c2g6e3BhdGg6Ii9wdXNoIixlbmRwb2ludDpESixuYW1lOjJ9LHBlZWs6e3BhdGg6Ii9wZWVrIixlbmRwb2ludDp3SixuYW1lOjF9LHB1bGw6e3BhdGg6Ii9wdWxsIixlbmRwb2ludDpUSixuYW1lOjN9fSwkVj17MDpyLnVzZXIsMjpyLnB1c2gsMTpyLnBlZWssMzpyLnB1bGx9LFZXPXtbci51c2VyLnBhdGhdOnIudXNlcixbci5wdXNoLnBhdGhdOnIucHVzaCxbci5wZWVrLnBhdGhdOnIucGVlayxbci5wdWxsLnBhdGhdOnIucHVsbH07Y2xhc3MgQUp7dXJsO2xpc3RlbmVyO2NvbnN0cnVjdG9yKCQpe3RoaXMudXJsPSQ7dGhpcy5saXN0ZW5lcj1uZXcgRlooJCl9YXN5bmMgY2FsbCgkLFope2xldHtwYXRoOkp9PSRWWyRdLFE9bmV3IFVSTChKLHRoaXMudXJsKTt0cnl7cmV0dXJuIGF3YWl0IFpWKFEsWil9Y2F0Y2h7cmV0dXJuIEcoMjUpfX19dmFyIF9KPSgkKT0+e3JldHVybiBuZXcgQUooJC5oYW5kbGUpfTthc3luYyBmdW5jdGlvbiBaVigkLFope2xldCBKPWF3YWl0IGZldGNoKCQse21ldGhvZDoiUE9TVCIsYm9keTpaLnJlc3VsdCgpLnNsaWNlKCl9KTtpZighSi5vaylyZXR1cm4gRygyNCk7bGV0IFE9YXdhaXQgZy5mcm9tUmVzcG9uc2UoSik7cmV0dXJuIFIoUSl9Y2xhc3MgTCR7ZW5jbGF2ZTtjcnlwdG87aG9zdDtjbG9jazt0cmFuc3BvcnQ7dXBkYXRlSG9zdE1ldGE7Y29uc3RydWN0b3IoJCxaLEosUSxWLFkpe3RoaXMuZW5jbGF2ZT0kO3RoaXMuY3J5cHRvPVo7dGhpcy5ob3N0PUo7dGhpcy5jbG9jaz1RO3RoaXMudHJhbnNwb3J0PVY7dGhpcy51cGRhdGVIb3N0TWV0YT1ZfWFzeW5jIGNhbGwoJCxaKXtsZXR7Y2xvY2s6Six0cmFuc3BvcnQ6UX09dGhpcyx7ZW5kcG9pbnQ6VixuYW1lOll9PSQsWD1hd2FpdCB0aGlzLmlkZW50aXR5KCksVz1KLm5vdygpLFt6LEtdPWF3YWl0IFZaKFgsVyk7aWYoSyE9PTApcmV0dXJuIEcoSyk7bGV0IEY9bmV3IFMsTj1hd2FpdCBWLmVuY29kZVJlcSh0aGlzLFgseixaLEYpO2lmKE4hPT0wKXJldHVybiBHKE4pO2xldCBVPUoubm93KCksW08scV09YXdhaXQgUS5jYWxsKFksRiksST1KLm5vdygpO2lmKHEhPT0wKXJldHVybiBHKHEpO2xldFtILFBdPU8ucmVhZFN0cnVjdChXWik7aWYoUCE9PTApcmV0dXJuIEcoUCk7aWYoSC5zdGF0dXMhPT0wKXJldHVybiBHKEguc3RhdHVzKTtsZXQgVD17Y2xvY2tPZmZzZXQ6UEooVSxILnRpbWVSY3ZkLEgudGltZVNlbnQsSSksc3Vic2NyaXB0aW9uOkguc3Vic2NyaXB0aW9ufSxNPWF3YWl0IHRoaXMudXBkYXRlSG9zdE1ldGEoVCk7aWYoTSE9PTApcmV0dXJuIEcoTSk7cmV0dXJuIFYuZGVjb2RlUmVzcChPKX1pZGVudGl0eT0oKT0+e2xldHtob3N0OiQsZW5jbGF2ZTpafT10aGlzO3JldHVybiBaLmRlcml2ZUlkZW50aXR5KCQubGFiZWwsJC5pZHg/PzApfTtzZWFsPWFzeW5jKCQpPT57bGV0e2NyeXB0bzpaLGVuY2xhdmU6Sn09dGhpcyxRPWF3YWl0IHRoaXMuaWRlbnRpdHkoKTtyZXR1cm4gQ0ooJCxRLFosSil9O3JlZ2lzdGVyPSgpPT50aGlzLmNhbGwoci51c2VyLFtdKTtwZWVrPSgkKT0+dGhpcy5jYWxsKHIucGVlayxbJF0pO3B1c2g9KCQpPT50aGlzLmNhbGwoci5wdXNoLCQpO3B1bGw9KCQpPT50aGlzLmNhbGwoci5wdWxsLCQpO2xpc3Rlbj1hc3luYygkLFosSik9PntsZXR7Y2xvY2s6USx0cmFuc3BvcnQ6Vn09dGhpcyx7bGlzdGVuZXI6WX09VixYPWF3YWl0IHRoaXMuaWRlbnRpdHkoKSxXPVEubm93KCksW3osS109YXdhaXQgVlooWCxXKTtpZihLIT09MClyZXR1cm4gSztyZXR1cm4gYXdhaXQgWS5jb25uZWN0KHosJCxaLEopfTtpc0Nvbm5lY3RlZCgpe2xldCAkPXRoaXMudHJhbnNwb3J0Py5saXN0ZW5lcjtpZigkJiZ0eXBlb2YgJC5jb25uZWN0ZWQ9PT0iZnVuY3Rpb24iKXJldHVybiAkLmNvbm5lY3RlZCgpO3JldHVybiEwfWNsb3NlTGlzdGVuZXIoKXt0aGlzLnRyYW5zcG9ydD8ubGlzdGVuZXI/LmRpc2Nvbm5lY3QoKX19dmFyIE5aPXtlbmNvZGUoJCxaKXtsZXQgSj0kLndyaXRlVmFyU3RyaW5nKFoubGJsKTtpZihKIT09MClyZXR1cm4gSjtsZXQgUT0kLndyaXRlVmFySW50KFouaWR4KTtpZihRIT09MClyZXR1cm4gUTtsZXQgVj0kLndyaXRlVmFySW50KFoubnVtKTtpZihWIT09MClyZXR1cm4gVjtyZXR1cm4gJC53cml0ZUJ5dGVzKFouaHNoKSwkLndyaXRlQnl0ZXMoWi5zaWcpLDB9LGRlY29kZSgkKXtsZXRbWixKXT0kLnJlYWRWYXJTdHJpbmcoKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWRWYXJJbnQoKTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXRbWSxYXT0kLnJlYWRWYXJJbnQoKTtpZihYIT09MClyZXR1cm4gRyhYKTtsZXRbVyx6XT0kLnJlYWRCeXRlcyhJJCk7aWYoeiE9PTApcmV0dXJuIEcoeik7bGV0W0ssRl09JC5yZWFkQnl0ZXModzApO2lmKEYhPT0wKXJldHVybiBHKEYpO3JldHVybiBSKHtsYmw6WixpZHg6USxudW06WSxoc2g6VyxzaWc6S30pfX07dmFyIFJaPXtlbmNvZGUoJCxaKXtsZXQgSj0kLndyaXRlU3RydWN0KE5aLFouaGVhZCk7aWYoSiE9PTApcmV0dXJuIEo7bGV0IFE9JC53cml0ZVZhckJ5dGVzKFouaW5kZXhFbmMpO2lmKFEhPT0wKXJldHVybiBRO2xldCBWPSQud3JpdGVWYXJCeXRlcyhaLmJvZHlFbmMpO2lmKFYhPT0wKXJldHVybiBWO3JldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkU3RydWN0KE5aKTtpZihKIT09MClyZXR1cm4gRyhKKTtsZXRbUSxWXT0kLnJlYWRWYXJCeXRlcygpO2lmKFYhPT0wKXJldHVybiBHKFYpO2xldFtZLFhdPSQucmVhZFZhckJ5dGVzKCk7aWYoWCE9PTApcmV0dXJuIEcoWCk7cmV0dXJuIFIoe2hlYWQ6WixpbmRleEVuYzpRLGJvZHlFbmM6WX0pfX07dmFyIFVaPXtlbmNvZGUoJCxaKXskLndyaXRlQnl0ZXMoWi5rZG0pO2xldCBKPSQud3JpdGVWYXJCeXRlcyhaLmhlYWRDcGgpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVWYXJJbnQoWi5sZW5Cb2R5KTtpZihRIT09MClyZXR1cm4gUTtpZihaLmxlbkJvZHk+MCYmWi5vZmZCb2R5IT09dm9pZCAwKXtsZXQgVj0kLndyaXRlVmFySW50KFoub2ZmQm9keSk7aWYoViE9PTApcmV0dXJuIFZ9cmV0dXJuIDB9LGRlY29kZSgkKXtsZXRbWixKXT0kLnJlYWRCeXRlcyhUMCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0W1EsVl09JC5yZWFkVmFyQnl0ZXMoKTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXRbWSxYXT0kLnJlYWRWYXJJbnQoKTtpZihYIT09MClyZXR1cm4gRyhYKTtsZXQgVztpZihZPjApe2xldFt6LEtdPSQucmVhZFZhckludCgpO2lmKEshPT0wKXJldHVybiBHKEspO1c9en1yZXR1cm4gUih7a2RtOlosaGVhZENwaDpRLGxlbkJvZHk6WSxvZmZCb2R5Old9KX19O2FzeW5jIGZ1bmN0aW9uIExKKCQsWixKLFEsVil7bGV0IFk9YXdhaXQgVi5kZXJpdmVJZGVudGl0eSgkLFopLFg9bmV3IFMsVz1uZXcgUyx6PTAsSz0wO2ZvcihsZXQgUCBvZiBKKXtsZXQgQz1uZXcgUyxUPUMud3JpdGVTdHJ1Y3QoWDAsUC5oZWFkKTtpZihUIT09MClyZXR1cm4gRyhUKTtsZXQgTT1DLnJlc3VsdCgpLEE9YXdhaXQgWS5rZG1Gb3IoTSkseD1WLmRlcml2ZUNpcGhlcihBLCJlbmNyeXB0IiksbT1hd2FpdCB4LmVuY3J5cHQoTSksRT1QLmJvZHk/YXdhaXQgeC5lbmNyeXB0KFAuYm9keSk6bmV3IFVpbnQ4QXJyYXkoMCksaz1QLmhlYWQubGVuPjAmJlAuaGVhZC5oc2ghPT12b2lkIDA/RS5sZW5ndGg6MCxiPXtrZG06QSxoZWFkQ3BoOm0sbGVuQm9keTprLG9mZkJvZHk6az4wP0s6dm9pZCAwfSx3PVgud3JpdGVTdHJ1Y3QoVVosYik7aWYodyE9PTApcmV0dXJuIEcodyk7aWYoUC5ib2R5KVcud3JpdGVCeXRlcyhFKSxLKz1FLmxlbmd0aDt6Kyt9bGV0IEY9Vy5yZXN1bHQoKSxOPVgucmVzdWx0KCksVT1hd2FpdCBRLmJsYWtlMyhOKSxPPWF3YWl0IFkuc2lnbihVKSxxPXtsYmw6JCxpZHg6WixudW06eixoc2g6VSxzaWc6T30sST1uZXcgUztJLndyaXRlU3RydWN0KFJaLHtoZWFkOnEsaW5kZXhFbmM6Tixib2R5RW5jOkZ9KTtsZXQgSD1JLnJlc3VsdCgpO3JldHVybiBSKEgpfWFzeW5jIGZ1bmN0aW9uIHhKKCQsWixKKXtsZXRbUSxWXT1SWi5kZWNvZGUobmV3IGcoJCkpO2lmKFYhPT0wKXJldHVybiBHKFYpO2xldHtoZWFkOlksaW5kZXhFbmM6WCxib2R5RW5jOld9PVEsej1hd2FpdCBKLmRlcml2ZUlkZW50aXR5KFkubGJsLFkuaWR4KTtpZighYXdhaXQgWi5jaGVja1NpZ0VkMjU1MTkoWS5zaWcsWS5oc2gsei5wdWJsaWNLZXkpKXJldHVybiBHKDMpO2xldCBGPWF3YWl0IFouYmxha2UzKFgpO2lmKCFWMChGLFkuaHNoKSlyZXR1cm4gRygxOSk7bGV0IE49bmV3IGcoWCksVT1bXTtmb3IobGV0IHE9MDtxPFkubnVtO3ErKyl7bGV0W0ksSF09Ti5yZWFkU3RydWN0KFVaKTtpZihIIT09MClyZXR1cm4gRyhIKTtVLnB1c2goSSl9aWYoVS5sZW5ndGghPT1ZLm51bSlyZXR1cm4gRygxNCk7bGV0IE89W107Zm9yKGxldCBxIG9mIFUpe2xldCBJPUouZGVyaXZlQ2lwaGVyKHEua2RtLCJkZWNyeXB0IiksSDt0cnl7SD1hd2FpdCBJLmRlY3J5cHQocS5oZWFkQ3BoKX1jYXRjaHtyZXR1cm4gRygyMCl9bGV0W1AsQ109WDAuZGVjb2RlKG5ldyBnKEgpKTtpZihDIT09MClyZXR1cm4gRyhDKTtsZXQgVDtpZihxLmxlbkJvZHk+MCYmcS5vZmZCb2R5IT09dm9pZCAwKXtpZihQLmhzaD09PXZvaWQgMClyZXR1cm4gRygxNCk7bGV0IE09Vy5zbGljZShxLm9mZkJvZHkscS5vZmZCb2R5K3EubGVuQm9keSk7dHJ5e1Q9YXdhaXQgSS5kZWNyeXB0KE0pfWNhdGNoe3JldHVybiBHKDIwKX1sZXQgQT1hd2FpdCBaLmJsYWtlMyhUKTtpZighVjAoQSxQLmhzaCkpcmV0dXJuIEcoMTkpfU8ucHVzaCh7aGVhZDpQLGJvZHk6VH0pfXJldHVybiBSKE8pfWFzeW5jIGZ1bmN0aW9uIGZKKHtub3c6JCxib2Q6WixjcnlwdG86Sn0pe2xldCBRPWF3YWl0IEouZ2VuUmFuZG9tQnl0ZXMoOCksVj1uZXcgUyxZPVYud3JpdGVTdHJ1Y3QoUTAse2lkOlEsdHM6JH0pO2lmKFkhPT0wKXJldHVybiBHKFkpO2xldCBYPVYucmVzdWx0KCk7cmV0dXJuIHgkKHtub3c6JCxlaWQ6WCxjdHI6MCxib2Q6WixjcnlwdG86Sn0pfWFzeW5jIGZ1bmN0aW9uIHgkKHtub3c6JCxlaWQ6WixjdHI6Sixib2Q6USxjcnlwdG86Vn0pe2xldCBZPW5ldyBnKFopLFtYLFddPVEwLmRlY29kZShZKTtpZihXIT09MClyZXR1cm4gRyhXKTtsZXQgej0kLmdldFRpbWUoKS1YLnRzLmdldFRpbWUoKSxLLEY9UT8ubGVuZ3RoPz8wO2lmKFEmJkY+MClLPWF3YWl0IFYuYmxha2UzKFEpO3JldHVybiBSKHtlaWQ6WixvZmY6eixjdHI6SixsZW46Rixoc2g6S30pfWZ1bmN0aW9uIEpWKCQsWil7bGV0IEo9JC5sZW5ndGg8Wi5sZW5ndGg/JC5sZW5ndGg6Wi5sZW5ndGg7Zm9yKGxldCBRPTA7UTxKO1ErKylpZigkW1FdIT09WltRXSlyZXR1cm4gJFtRXS1aW1FdO3JldHVybiAkLmxlbmd0aC1aLmxlbmd0aH1hc3luYyBmdW5jdGlvbiB6JCgkLFope2xldCBKPUFycmF5LmZyb20oJCk7Si5zb3J0KEpWKTtsZXQgUT0wO2ZvcihsZXQgWCBvZiBKKVErPVgubGVuZ3RoO2xldCBWPW5ldyBVaW50OEFycmF5KFEpLFk9MDtmb3IobGV0IFggb2YgSilWLnNldChYLFkpLFkrPVgubGVuZ3RoO3JldHVybiBaLmJsYWtlMyhWKX1mdW5jdGlvbiBRVigkKXtsZXQgWj1uZXcgUyxKPVoud3JpdGVWYXJCeXRlcygkLmVpZCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0IFE9Wi53cml0ZURhdGUoJC51cGRhdGVkQXQpO2lmKFEhPT0wKXJldHVybiBHKFEpO2xldCBWPVoud3JpdGVWYXJJbnQoJC5jdHIpO2lmKFYhPT0wKXJldHVybiBHKFYpO3JldHVybiBSKFoucmVzdWx0KCkpfWFzeW5jIGZ1bmN0aW9uIGYkKCQsWil7bGV0IEo9W107Zm9yKGxldCBRIG9mICQpe2xldFtWLFldPVFWKFEpO2lmKFkhPT0wfHwhVilyZXR1cm4gRyhZKTtKLnB1c2goVil9cmV0dXJuIFIoYXdhaXQgeiQoSixaKSl9dmFyIHNXPVN5bWJvbCgiTWFzdGVyU2VlZCIpLHRXPVN5bWJvbCgiU2VhbGVkTWFzdGVyS2V5IiksUjA9MzIsa0o9MjQrUjArMTY7ZnVuY3Rpb24gdCgkKXtpZigkLmJ5dGVMZW5ndGghPT1SMClyZXR1cm4gRygxMCk7cmV0dXJuIFIoJCl9ZnVuY3Rpb24gajAoJCl7aWYoJC5ieXRlTGVuZ3RoIT09a0opcmV0dXJuIEcoMTApO3JldHVybiBSKCQpfXZhciAkRz1TeW1ib2woIkVudGl0eUlEIik7ZnVuY3Rpb24gQkooJCl7cmV0dXJuInR5cGUiaW4gJH12YXIgWkc9U3ltYm9sKCJEZXJpdmF0aW9uU2VlZCIpLEpHPVN5bWJvbCgiUHVibGljS2V5IiksUUc9U3ltYm9sKCJQcml2YXRlS2V5IiksVkc9U3ltYm9sKCJIb3N0U3BlY2lmaWNLZXlQYWlyIiksWUc9U3ltYm9sKCJIYXNoIik7ZnVuY3Rpb24gVlYoJCl7aWYoISQpcmV0dXJuITE7aWYodHlwZW9mICQhPT0ib2JqZWN0IilyZXR1cm4hMTtpZigiYm9keSJpbiAkPT09ITEpcmV0dXJuITE7aWYoInR5cGUiaW4gJD09PSExKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFlWKCQpe2lmKCEkLmJvZHx8JC5ib2QubGVuZ3RoPT09MCl7bGV0IFE9e29mZjokLm9mZixjdHI6JC5jdHIsZWlkOiQuZWlkfTtyZXR1cm4gUihRKX1sZXQgWj1RWigkLmJvZCk7aWYoVlYoWik9PT0hMSlyZXR1cm4gY29uc29sZS53YXJuKCJtc2cgYm9keSBpbnZhbGlkIixaKSxHKDE0KTtsZXQgSj17b2ZmOiQub2ZmLGN0cjokLmN0cixlaWQ6JC5laWQsZ2lkOlouZ2lkLHBpZDpaLnBpZCx0YWdzOloudGFncyx0eXBlOloudHlwZSxib2R5OlouYm9keX07cmV0dXJuIFIoSil9Y2xhc3MgayR7YXBwbGllcjtlbWl0dGVyPW5ldyBYJDtjbGVhcmVyO29uRGlydHlFaWRzO2NhY2hlRHJpdmVuO3BlZXJJbmdlc3Q7Y29uc3RydWN0b3IoJCxaLEosUSl7dGhpcy5hcHBsaWVyPSQ7dGhpcy5jbGVhcmVyPVosdGhpcy5vbkRpcnR5RWlkcz1KLHRoaXMuY2FjaGVEcml2ZW49UT8uY2FjaGVEcml2ZW4/PyExLHRoaXMucGVlckluZ2VzdD1RPy5wZWVySW5nZXN0fWFwcGx5PWFzeW5jKCQpPT57bGV0IFo9W10sSj1bXTtmb3IobGV0IFcgb2YgJCl7bGV0W3osS109WVYoVyk7aWYoSi5wdXNoKEspLEshPT0wKWNvbnRpbnVlO1oucHVzaCh6KX1sZXR7c3RhdHM6USx0eXBlczpWLGVpZHM6WX09YXdhaXQgdGhpcy5hcHBsaWVyKFopLFg9W107Zm9yKGxldCBXPTA7VzwkLmxlbmd0aDtXKyspe2xldCB6PUpbV10sSz1RW1ddO2lmKHohPT0wKXtYLnB1c2goeik7Y29udGludWV9aWYoSyE9PTApe1gucHVzaChLKTtjb250aW51ZX1YLnB1c2goMCl9aWYoIXRoaXMuY2FjaGVEcml2ZW4pZm9yKGxldCBXIG9mIFYpdGhpcy5lbWl0dGVyLmVtaXQoVyxudWxsKTtpZihZLmxlbmd0aD4wKXRoaXMub25EaXJ0eUVpZHM/LihZKTtyZXR1cm4gWH07Y2xlYXI9YXN5bmMoKT0+e2xldCAkPWF3YWl0IHRoaXMuY2xlYXJlcigpO2lmKCQhPT0wKXJldHVybiAkO3JldHVybiB0aGlzLmVtaXR0ZXIuZW1pdEFsbChudWxsKSwkfTtub3RpZnk9KCQpPT57Zm9yKGxldCBaIG9mICQpdGhpcy5lbWl0dGVyLmVtaXQoWixudWxsKX07cmVmcmVzaD1hc3luYygkKT0+e2lmKHRoaXMucGVlckluZ2VzdCl7YXdhaXQgdGhpcy5wZWVySW5nZXN0KCQpO3JldHVybn19O29uPSgkLFopPT57dGhpcy5lbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJCxaKX07b2ZmPSgkLFopPT57dGhpcy5lbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJCxaKX19dmFyIG49ImVudGl0aWVzIixCJD0iZW50aXR5X3R5cGVfY3JlYXRlZF9hdCIscVo9ImVudGl0eV90eXBlX3VwZGF0ZWRfYXQiLElaPSJlbnRpdHlfdHlwZV9ncm91cF9pZCIsSFo9ImVudGl0eV90eXBlX3BhcmVudF9pZCIsbjA9ImVudGl0eV90YWdzIixFSj0iZGIiLG1KPTEzO2Z1bmN0aW9uIFhWKCQpe3JldHVybiJ0eXAiaW4gJH1mdW5jdGlvbiBXVigkKXtsZXQgWj17Ym9kOiQuYm9keSxjcmQ6JC5jcmVhdGVkQXQsLi4uJC5jdHIhPT0wP3tjdHI6JC5jdHJ9Ont9LGVpZDpmKCQuZWlkKSxnaWQ6JC5naWQscGlkOiQucGlkP2YoJC5waWQpOnZvaWQgMCx0Z3M6JC50YWdzLHR5cDokLnR5cGUsdXBkOiQudXBkYXRlZEF0fTtpZihaLmdpZD09PXZvaWQgMClkZWxldGUgWi5naWQ7aWYoWi5waWQ9PT12b2lkIDApZGVsZXRlIFoucGlkO2lmKFoudGdzPT09dm9pZCAwKWRlbGV0ZSBaLnRncztpZihaLmN0cj09PXZvaWQgMClkZWxldGUgWi5jdHI7cmV0dXJuIFp9ZnVuY3Rpb24gR1YoJCl7aWYoIWkoJCkpcmV0dXJue2VpZDpmKCQuZWlkKSx1cGQ6JC51cGRhdGVkQXQsLi4uJC5jdHIhPT0wP3tjdHI6JC5jdHJ9Ont9fTtyZXR1cm4gV1YoJCl9ZnVuY3Rpb24gYzAoJCl7cmV0dXJue2JvZHk6JC5ib2QsY3JlYXRlZEF0OiQuY3JkLHVwZGF0ZWRBdDokLnVwZCxjdHI6JC5jdHI/PzAsdHlwZTokLnR5cCxlaWQ6RjAoJC5laWQpLGdpZDokLmdpZCxwaWQ6JC5waWQ/RjAoJC5waWQpOnZvaWQgMCwuLi4kLnRncyE9PXZvaWQgMD97dGFnczokLnRnc306e319fWZ1bmN0aW9uIE9aKCQpe2lmKFhWKCQpKXJldHVybiBjMCgkKTtyZXR1cm57ZWlkOkYwKCQuZWlkKSx1cGRhdGVkQXQ6JC51cGQsY3RyOiQuY3RyPz8wfX1jbGFzcyBnSntkYjtvcGVuaW5nO2FzeW5jIGluaXQoKXthd2FpdCB0aGlzLmVuc3VyZURiKCl9YXN5bmMgZW5zdXJlRGIoKXtpZih0aGlzLmRiKXJldHVybiB0aGlzLmRiO2lmKHRoaXMub3BlbmluZylyZXR1cm4gdGhpcy5vcGVuaW5nO3JldHVybiB0aGlzLm9wZW5pbmc9S1YoKS50aGVuKCgkKT0+e3JldHVybiAkLm9udmVyc2lvbmNoYW5nZT0oKT0+e2lmKCQuY2xvc2UoKSx0aGlzLmRiPT09JCl0aGlzLmRiPXZvaWQgMH0sdGhpcy5kYj0kLHRoaXMub3BlbmluZz12b2lkIDAsJH0sKCQpPT57dGhyb3cgdGhpcy5vcGVuaW5nPXZvaWQgMCwkfSksdGhpcy5vcGVuaW5nfWFwcGx5PWFzeW5jKCQpPT57bGV0IFo9bmV3IFNldCxKPVtdLFE7dHJ5e1E9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybntzdGF0czokLm1hcCgoKT0+MTYpLHR5cGVzOlosZWlkczpKfX1sZXQgVj1RLnRyYW5zYWN0aW9uKG4sInJlYWR3cml0ZSIpLFk9Vi5vYmplY3RTdG9yZShuKTtyZXR1cm4gbmV3IFByb21pc2UoKFgpPT57bGV0IFc9QXJyYXkoJC5sZW5ndGgpLmZpbGwoMCk7aWYoJC5sZW5ndGg8MSl7WCh7c3RhdHM6W10sdHlwZXM6WixlaWRzOkp9KTtyZXR1cm59Vi5vbmNvbXBsZXRlPSgpPT57WCh7c3RhdHM6Vyx0eXBlczpaLGVpZHM6Sn0pfSxWLm9uZXJyb3I9KCk9Pntmb3IobGV0IEs9MDtLPFcubGVuZ3RoO0srKylpZihXW0tdPT09dm9pZCAwKVdbS109MTg7WCh7c3RhdHM6Vyx0eXBlczpaLGVpZHM6Sn0pfTtsZXQgej1uZXcgTWFwO2ZvcihsZXQgSz0wO0s8JC5sZW5ndGg7SysrKXtsZXQgRj0kW0tdLE49ZihGLmVpZCksVT17b3A6RixpbmRleDpLfSxPPXouZ2V0KE4pO2lmKE8pTy5wdXNoKFUpO2Vsc2Ugei5zZXQoTixbVV0pfWZvcihsZXRbSyxGXW9mIHope2lmKEYubGVuZ3RoPDEpY29udGludWU7bGV0IE49WS5nZXQoSyk7Ti5vbnN1Y2Nlc3M9KCk9PntsZXQgVT1OLnJlc3VsdCxPPVU/T1ooVSk6dm9pZCAwLHE9ITE7Zm9yKGxldHtvcDpJLGluZGV4Okh9b2YgRil7bGV0W1AsQ109ZDAoTyxJKTtpZihDIT09MCl7V1tIXT1DO2NvbnRpbnVlfWlmKFA9PT12b2lkIDApe1dbSF09MTI7Y29udGludWV9cT0hMDtmb3IobGV0IFQgb2YgcjAoTyxQKSlaLmFkZChUKTtPPVB9aWYocSlKLnB1c2goRlswXS5vcC5laWQpO2lmKE8pe2xldCBJPVkucHV0KEdWKE8pKTtJLm9uZXJyb3I9KEgpPT57SC5wcmV2ZW50RGVmYXVsdCgpO2ZvcihsZXR7aW5kZXg6UH1vZiBGKVdbUF09MTh9fX0sTi5vbmVycm9yPSgpPT57Zm9yKGxldHtpbmRleDpVfW9mIEYpV1tVXT0xOH19fSl9O2FzeW5jIGNsZWFyKCl7bGV0ICQ7dHJ5eyQ9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiAxNn1sZXQgWj0kLnRyYW5zYWN0aW9uKG4sInJlYWR3cml0ZSIpLEo9Wi5vYmplY3RTdG9yZShuKTtyZXR1cm4gbmV3IFByb21pc2UoKFEpPT57Wi5vbmNvbXBsZXRlPSgpPT5RKDApLFoub25lcnJvcj0oKT0+USgxOCksSi5jbGVhcigpfSl9YXN5bmMgZ2V0Um93KCQpe2xldCBaO3RyeXtaPWF3YWl0IHRoaXMuZW5zdXJlRGIoKX1jYXRjaHtyZXR1cm4gRygxNil9bGV0IEo9ZigkKSxWPVoudHJhbnNhY3Rpb24obiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuKTtyZXR1cm4gbmV3IFByb21pc2UoKFkpPT57bGV0IFg9Vi5nZXQoSik7WC5vbnN1Y2Nlc3M9KCk9PntsZXQgVz1YLnJlc3VsdDtpZighVylZKFIodm9pZCAwKSk7ZWxzZSBZKFIoT1ooVykpKX0sWC5vbmVycm9yPSgpPT5ZKEcoMTgpKX0pfWFzeW5jIGdldEVudCgkKXtsZXRbWixKXT1hd2FpdCB0aGlzLmdldFJvdygkKTtpZihKIT09MClyZXR1cm4gRyhKKTtpZihaPT09dm9pZCAwfHwhaShaKSlyZXR1cm4gUih2b2lkIDApO3JldHVybiBSKFopfWFzeW5jIGdldEFsbE9mVHlwZVVwZGF0ZWRCZXR3ZWVuKCQsWixKKXtsZXQgUTt0cnl7UT1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIEcoMTYpfWxldCBZPVEudHJhbnNhY3Rpb24obiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuKS5pbmRleChxWik7cmV0dXJuIG5ldyBQcm9taXNlKChYKT0+e2xldCBXPVkuZ2V0QWxsKElEQktleVJhbmdlLmJvdW5kKFskLFpdLFskLEpdKSk7Vy5vbnN1Y2Nlc3M9KCk9PntsZXQgej1XLnJlc3VsdDtYKFIoei5tYXAoYzApKSl9LFcub25lcnJvcj0oKT0+WChHKDE4KSl9KX1hc3luYyBnZXRHcm91cE1lbWJlcnMoJCxaKXtsZXQgSjt0cnl7Sj1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIEcoMTYpfWxldCBWPUoudHJhbnNhY3Rpb24obiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuKS5pbmRleChJWik7cmV0dXJuIG5ldyBQcm9taXNlKChZKT0+e2xldCBYPVYuZ2V0QWxsKElEQktleVJhbmdlLm9ubHkoWyQsWl0pKTtYLm9uc3VjY2Vzcz0oKT0+e2xldCBXPVgucmVzdWx0O1koUihXLm1hcChjMCkpKX0sWC5vbmVycm9yPSgpPT5ZKEcoMTgpKX0pfWFzeW5jIGdldEFsbE9mVHlwZSgkKXtsZXQgWjt0cnl7Wj1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIEcoMTYpfWxldCBRPVoudHJhbnNhY3Rpb24obiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuKS5pbmRleChCJCk7cmV0dXJuIG5ldyBQcm9taXNlKChWKT0+e2xldCBZPVEuZ2V0QWxsKElEQktleVJhbmdlLmJvdW5kKFskXSxbJCxbXV0pKTtZLm9uc3VjY2Vzcz0oKT0+e2xldCBYPVkucmVzdWx0O1YoUihYLm1hcChjMCkpKX0sWS5vbmVycm9yPSgpPT5WKEcoMTgpKX0pfWFzeW5jIGdldEJ5VGFnKCQsWil7bGV0IEo7dHJ5e0o9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBHKDE2KX1sZXQgVj1KLnRyYW5zYWN0aW9uKG4sInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobikuaW5kZXgobjApO3JldHVybiBuZXcgUHJvbWlzZSgoWSk9PntsZXQgWD1WLmdldEFsbChJREJLZXlSYW5nZS5vbmx5KFopKTtYLm9uc3VjY2Vzcz0oKT0+e2xldCB6PVgucmVzdWx0LmZpbHRlcigoSyk9PksudHlwPT09JCkubWFwKGMwKTtZKFIoeikpfSxYLm9uZXJyb3I9KCk9PlkoRygxOCkpfSl9YXN5bmMgZ2V0QWxsRW50aXRpZXMoJCl7aWYoInBpZCJpbiAkKXtsZXQgWjt0cnl7Wj1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIEcoMTYpfWxldCBKPWYoJC5waWQpLFY9Wi50cmFuc2FjdGlvbihuLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKG4pLmluZGV4KEhaKTtyZXR1cm4gbmV3IFByb21pc2UoKFkpPT57bGV0IFg9Vi5nZXRBbGwoSURCS2V5UmFuZ2Uub25seShbJC50eXBlLEpdKSk7WC5vbnN1Y2Nlc3M9KCk9PntsZXQgej1YLnJlc3VsdC5tYXAoYzApO1koUih6KSl9LFgub25lcnJvcj0oKT0+WShHKDE4KSl9KX1lbHNlIGlmKCJnaWQiaW4gJClyZXR1cm4gYXdhaXQgdGhpcy5nZXRHcm91cE1lbWJlcnMoJC50eXBlLCQuZ2lkKTtlbHNlIGlmKCJ0YWciaW4gJClyZXR1cm4gYXdhaXQgdGhpcy5nZXRCeVRhZygkLnR5cGUsJC50YWcpO2Vsc2UgaWYoInVwZGF0ZWRCZXR3ZWVuImluICQpcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QWxsT2ZUeXBlVXBkYXRlZEJldHdlZW4oJC50eXBlLCQudXBkYXRlZEJldHdlZW4uc3RhcnQsJC51cGRhdGVkQmV0d2Vlbi5lbmQpO3JldHVybiBhd2FpdCB0aGlzLmdldEFsbE9mVHlwZSgkLnR5cGUpfWFzeW5jIGdldEVudGl0aWVzKCQpe2xldFtaLEpdPWF3YWl0IHRoaXMuZ2V0QWxsRW50aXRpZXMoJCk7aWYoSiE9PTApcmV0dXJuIEcoSik7cmV0dXJuIFIoWil9YXN5bmMgY291bnRFbnRpdGllcyh7dHlwZTokfSl7bGV0IFo7dHJ5e1o9YXdhaXQgdGhpcy5lbnN1cmVEYigpfWNhdGNoe3JldHVybiBHKDE2KX1sZXQgUT1aLnRyYW5zYWN0aW9uKG4sInJlYWRvbmx5Iikub2JqZWN0U3RvcmUobikuaW5kZXgoQiQpO3JldHVybiBuZXcgUHJvbWlzZSgoVik9PntsZXQgWT1JREJLZXlSYW5nZS5ib3VuZChbJF0sWyQsW11dKSxYPVEuY291bnQoWSk7WC5vbnN1Y2Nlc3M9KCk9PlYoUihYLnJlc3VsdCkpLFgub25lcnJvcj0oKT0+VihHKDE4KSl9KX1hc3luYyBjaGVja3N1bSgkKXtsZXQgWjt0cnl7Wj1hd2FpdCB0aGlzLmVuc3VyZURiKCl9Y2F0Y2h7cmV0dXJuIEcoMTYpfWxldCBRPVoudHJhbnNhY3Rpb24obiwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShuKSxWPVtdO3JldHVybiBuZXcgUHJvbWlzZSgoWSk9PntsZXQgWD1RLm9wZW5DdXJzb3IoKTtYLm9uc3VjY2Vzcz0oKT0+e2xldCBXPVgucmVzdWx0O2lmKFcpe2xldCB6PVcudmFsdWU7Vi5wdXNoKEUkKE9aKHopKSksVy5jb250aW51ZSgpfWVsc2UgZiQoViwkKS50aGVuKFkpfSxYLm9uZXJyb3I9KCk9PlkoRygxOCkpfSl9fWZ1bmN0aW9uIHpWKCQsWil7aWYoISQub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhuKSkkLmNyZWF0ZU9iamVjdFN0b3JlKG4se2tleVBhdGg6ImVpZCIsYXV0b0luY3JlbWVudDohMX0pO2xldCBKPVoub2JqZWN0U3RvcmUobik7aWYoIUouaW5kZXhOYW1lcy5jb250YWlucyhCJCkpSi5jcmVhdGVJbmRleChCJCxbInR5cCIsImNyZCJdLHt1bmlxdWU6ITF9KTtpZighSi5pbmRleE5hbWVzLmNvbnRhaW5zKHFaKSlKLmNyZWF0ZUluZGV4KHFaLFsidHlwIiwidXBkIl0se3VuaXF1ZTohMX0pO2lmKCFKLmluZGV4TmFtZXMuY29udGFpbnMoSVopKUouY3JlYXRlSW5kZXgoSVosWyJ0eXAiLCJnaWQiXSx7dW5pcXVlOiExfSk7aWYoIUouaW5kZXhOYW1lcy5jb250YWlucyhIWikpSi5jcmVhdGVJbmRleChIWixbInR5cCIsInBpZCJdLHt1bmlxdWU6ITF9KTtpZihKLmluZGV4TmFtZXMuY29udGFpbnMobjApKXtpZihKLmluZGV4KG4wKS5rZXlQYXRoIT09InRncyIpSi5kZWxldGVJbmRleChuMCl9aWYoIUouaW5kZXhOYW1lcy5jb250YWlucyhuMCkpSi5jcmVhdGVJbmRleChuMCwidGdzIix7dW5pcXVlOiExLG11bHRpRW50cnk6ITB9KX1mdW5jdGlvbiBLVigpe3JldHVybiBuZXcgUHJvbWlzZSgoJCxaKT0+e2xldCBKPWluZGV4ZWREQi5vcGVuKEVKLG1KKTtKLm9udXBncmFkZW5lZWRlZD0oKT0+e2xldHtyZXN1bHQ6USx0cmFuc2FjdGlvbjpWfT1KO2lmKCFWKXtaKEVycm9yKCJUcmFuc2FjdGlvbiBpcyBudWxsIGR1cmluZyBFbnREQiB1cGdyYWRlIikpO3JldHVybn10cnl7elYoUSxWKX1jYXRjaChZKXtaKFkgaW5zdGFuY2VvZiBFcnJvcj9ZOkVycm9yKFN0cmluZyhZKSkpfX0sSi5vbmJsb2NrZWQ9KCk9Pntjb25zb2xlLndhcm4oYFtESVBMT01BVElDXSBFbnREQiBJREIgdXBncmFkZSBibG9ja2VkICgke0VKfSDihpIgdiR7bUp9KTsgd2FpdGluZyBmb3Igb3RoZXIgY29ubmVjdGlvbnMgdG8gY2xvc2VgKX0sSi5vbnN1Y2Nlc3M9KCk9PiQoSi5yZXN1bHQpLEoub25lcnJvcj0oKT0+WihKLmVycm9yPz9FcnJvcigiRW50REIgSW5kZXhlZERCIG9wZW4gZmFpbGVkIikpfSl9YXN5bmMgZnVuY3Rpb24gU0ooKXtsZXQgJD1uZXcgZ0o7cmV0dXJuIGF3YWl0ICQuaW5pdCgpLCR9Y2xhc3MgTVp7ZW50cz1uZXcgTWFwO3VzZUluZGV4O2J5VHlwZT1uZXcgTWFwO2J5VHlwZVBpZD1uZXcgTWFwO2J5VHlwZUdpZD1uZXcgTWFwO2J5VHlwZVRhZz1uZXcgTWFwO2NvbnN0cnVjdG9yKCQ9W10sWil7dGhpcy51c2VJbmRleD1aPy5pbmRleGVzIT09ITE7Zm9yKGxldCBKIG9mICQpdGhpcy5wdXQoSil9cHV0KCQpe2xldCBaPWYoJC5laWQpLEo9dGhpcy5lbnRzLmdldChaKTtpZihKIT09dm9pZCAwJiZpKEopKXRoaXMudW5pbmRleChaLEopO2lmKHRoaXMuZW50cy5zZXQoWiwkKSxpKCQpKXRoaXMuaW5kZXgoWiwkKX1kZWwoJCl7bGV0IFo9dGhpcy5lbnRzLmdldCgkKTtpZihaPT09dm9pZCAwKXJldHVybjtpZihpKFopKXRoaXMudW5pbmRleCgkLFopO3RoaXMuZW50cy5kZWxldGUoJCl9aW5kZXgoJCxaKXtpZighdGhpcy51c2VJbmRleClyZXR1cm47bGV0IEo9dGhpcy5ieVR5cGUuZ2V0KFoudHlwZSk7aWYoIUopSj1uZXcgTWFwLHRoaXMuYnlUeXBlLnNldChaLnR5cGUsSik7aWYoSi5zZXQoJCxaKSxaLnBpZCl7bGV0IFE9ZihaLnBpZCksVj10aGlzLmJ5VHlwZVBpZC5nZXQoWi50eXBlKTtpZighVilWPW5ldyBNYXAsdGhpcy5ieVR5cGVQaWQuc2V0KFoudHlwZSxWKTtsZXQgWT1WLmdldChRKTtpZighWSlZPW5ldyBNYXAsVi5zZXQoUSxZKTtZLnNldCgkLFopfWlmKHR5cGVvZiBaLmdpZD09PSJzdHJpbmciKXtsZXQgUT10aGlzLmJ5VHlwZUdpZC5nZXQoWi50eXBlKTtpZighUSlRPW5ldyBNYXAsdGhpcy5ieVR5cGVHaWQuc2V0KFoudHlwZSxRKTtsZXQgVj1RLmdldChaLmdpZCk7aWYoIVYpVj1uZXcgTWFwLFEuc2V0KFouZ2lkLFYpO1Yuc2V0KCQsWil9aWYoWi50YWdzKXtsZXQgUT10aGlzLmJ5VHlwZVRhZy5nZXQoWi50eXBlKTtpZighUSlRPW5ldyBNYXAsdGhpcy5ieVR5cGVUYWcuc2V0KFoudHlwZSxRKTtmb3IobGV0IFYgb2YgWi50YWdzKXtsZXQgWT1RLmdldChWKTtpZighWSlZPW5ldyBNYXAsUS5zZXQoVixZKTtZLnNldCgkLFopfX19dW5pbmRleCgkLFope2lmKCF0aGlzLnVzZUluZGV4KXJldHVybjtsZXQgSj10aGlzLmJ5VHlwZS5nZXQoWi50eXBlKTtpZihKKXtpZihKLmRlbGV0ZSgkKSxKLnNpemU9PT0wKXRoaXMuYnlUeXBlLmRlbGV0ZShaLnR5cGUpfWlmKFoucGlkKXtsZXQgUT1mKFoucGlkKSxWPXRoaXMuYnlUeXBlUGlkLmdldChaLnR5cGUpLFk9Vj8uZ2V0KFEpO2lmKFkpe2lmKFkuZGVsZXRlKCQpLFkuc2l6ZT09PTApVj8uZGVsZXRlKFEpfWlmKFYmJlYuc2l6ZT09PTApdGhpcy5ieVR5cGVQaWQuZGVsZXRlKFoudHlwZSl9aWYodHlwZW9mIFouZ2lkPT09InN0cmluZyIpe2xldCBRPXRoaXMuYnlUeXBlR2lkLmdldChaLnR5cGUpLFY9UT8uZ2V0KFouZ2lkKTtpZihWKXtpZihWLmRlbGV0ZSgkKSxWLnNpemU9PT0wKVE/LmRlbGV0ZShaLmdpZCl9aWYoUSYmUS5zaXplPT09MCl0aGlzLmJ5VHlwZUdpZC5kZWxldGUoWi50eXBlKX1pZihaLnRhZ3Mpe2xldCBRPXRoaXMuYnlUeXBlVGFnLmdldChaLnR5cGUpO2lmKFEpe2ZvcihsZXQgViBvZiBaLnRhZ3Mpe2xldCBZPVEuZ2V0KFYpO2lmKFkpe2lmKFkuZGVsZXRlKCQpLFkuc2l6ZT09PTApUS5kZWxldGUoVil9fWlmKFEuc2l6ZT09PTApdGhpcy5ieVR5cGVUYWcuZGVsZXRlKFoudHlwZSl9fX1jbGVhckluZGV4ZXMoKXt0aGlzLmJ5VHlwZS5jbGVhcigpLHRoaXMuYnlUeXBlUGlkLmNsZWFyKCksdGhpcy5ieVR5cGVHaWQuY2xlYXIoKSx0aGlzLmJ5VHlwZVRhZy5jbGVhcigpfWJ1Y2tldExpc3QoJCl7aWYoISR8fCQuc2l6ZT09PTApcmV0dXJuW107bGV0IFo9W107Zm9yKGxldCBKIG9mICQudmFsdWVzKCkpWi5wdXNoKEopO3JldHVybiBafWFzeW5jIGFwcGx5KCQpe2xldCBaPW5ldyBTZXQsSj1bXSxRPVtdO2ZvcihsZXQgViBvZiAkKXtsZXQgWT1mKFYuZWlkKSxYPXRoaXMuZW50cy5nZXQoWSksW1csel09ZDAoWCxWKTtpZih6IT09MCl7US5wdXNoKHopO2NvbnRpbnVlfWlmKFc9PT12b2lkIDApe1EucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCBLIG9mIHIwKFgsVykpWi5hZGQoSyk7dGhpcy5wdXQoVyksSi5wdXNoKFYuZWlkKSxRLnB1c2goMCl9cmV0dXJue3N0YXRzOlEsdHlwZXM6WixlaWRzOkp9fWFzeW5jIGNsZWFyKCl7cmV0dXJuIHRoaXMuZW50cy5jbGVhcigpLHRoaXMuY2xlYXJJbmRleGVzKCksMH1hc3luYyBnZXRSb3coJCl7bGV0IFo9ZigkKSxKPXRoaXMuZW50cy5nZXQoWik7cmV0dXJuIFIoSil9YXN5bmMgZ2V0RW50KCQpe2xldFtaLEpdPWF3YWl0IHRoaXMuZ2V0Um93KCQpO2lmKEohPT0wKXJldHVybiBHKEopO2lmKFo9PT12b2lkIDB8fCFpKFopKXJldHVybiBSKHZvaWQgMCk7cmV0dXJuIFIoWil9YXN5bmMgZ2V0QWxsRW50aXRpZXMoe3R5cGU6JCxnaWQ6WixwaWQ6Six0YWc6USx1cGRhdGVkQmV0d2VlbjpWfSl7aWYodGhpcy51c2VJbmRleCl7aWYoSiE9PXZvaWQgMCl7bGV0IFg9ZihKKTtyZXR1cm4gUih0aGlzLmJ1Y2tldExpc3QodGhpcy5ieVR5cGVQaWQuZ2V0KCQpPy5nZXQoWCkpKX1pZihaIT09dm9pZCAwKXJldHVybiBSKHRoaXMuYnVja2V0TGlzdCh0aGlzLmJ5VHlwZUdpZC5nZXQoJCk/LmdldChaKSkpO2lmKFEhPT12b2lkIDApcmV0dXJuIFIodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlVGFnLmdldCgkKT8uZ2V0KFEpKSk7aWYoViE9PXZvaWQgMCl7bGV0IFg9W10sVz10aGlzLmJ5VHlwZS5nZXQoJCk7aWYoVyl7Zm9yKGxldCB6IG9mIFcudmFsdWVzKCkpaWYoei51cGRhdGVkQXQ+PVYuc3RhcnQmJnoudXBkYXRlZEF0PD1WLmVuZClYLnB1c2goeil9cmV0dXJuIFIoWCl9cmV0dXJuIFIodGhpcy5idWNrZXRMaXN0KHRoaXMuYnlUeXBlLmdldCgkKSkpfWxldCBZPVtdO2lmKEohPT12b2lkIDApe2ZvcihsZXQgWCBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoaShYKSYmWC50eXBlPT09JCYmWC5waWQmJlYwKFgucGlkLEopKVkucHVzaChYKX1lbHNlIGlmKFohPT12b2lkIDApe2ZvcihsZXQgWCBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoaShYKSYmWC50eXBlPT09JCYmKHR5cGVvZiBYLmdpZD09PSJzdHJpbmciJiZYLmdpZD09PVopKVkucHVzaChYKX1lbHNlIGlmKFEhPT12b2lkIDApe2ZvcihsZXQgWCBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoaShYKSYmWC50eXBlPT09JCYmWC50YWdzJiZYLnRhZ3MuaW5jbHVkZXMoUSkpWS5wdXNoKFgpfWVsc2UgaWYoViE9PXZvaWQgMCl7Zm9yKGxldCBYIG9mIHRoaXMuZW50cy52YWx1ZXMoKSlpZihpKFgpJiZYLnR5cGU9PT0kJiZYLnVwZGF0ZWRBdD49Vi5zdGFydCYmWC51cGRhdGVkQXQ8PVYuZW5kKVkucHVzaChYKX1lbHNlIGZvcihsZXQgWCBvZiB0aGlzLmVudHMudmFsdWVzKCkpaWYoaShYKSYmWC50eXBlPT09JClZLnB1c2goWCk7cmV0dXJuIFIoWSl9YXN5bmMgZ2V0RW50aXRpZXMoJCl7bGV0W1osSl09YXdhaXQgdGhpcy5nZXRBbGxFbnRpdGllcygkKTtpZihKIT09MClyZXR1cm4gRyhKKTtyZXR1cm4gUihaKX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOiR9KXtpZih0aGlzLnVzZUluZGV4KXJldHVybiBSKHRoaXMuYnlUeXBlLmdldCgkKT8uc2l6ZT8/MCk7bGV0IFo9MDtmb3IobGV0IEogb2YgdGhpcy5lbnRzLnZhbHVlcygpKWlmKGkoSikmJkoudHlwZT09PSQpWis9MTtyZXR1cm4gUihaKX1hc3luYyBjaGVja3N1bSgkKXtsZXQgWj1bXTtmb3IobGV0IEogb2YgdGhpcy5lbnRzLnZhbHVlcygpKVoucHVzaChFJChKKSk7cmV0dXJuIGYkKFosJCl9fWFzeW5jIGZ1bmN0aW9uIHZKKCQpe2xldCBaPWF3YWl0IFNKKCk7aWYoJD8uY2FjaGU9PT0hMSlyZXR1cm4gWjtyZXR1cm4gbmV3IENaKFosdm9pZCAwLHtpbmRleGVzOiQ/LmluZGV4ZXN9KX1jbGFzcyBDWnttZW07ZHVyYWJsZTt3YXJtZWQ9bmV3IFNldDtsaXN0ZW5lcnM9bmV3IFNldDtjaGFpbj1Qcm9taXNlLnJlc29sdmUoKTtjb25zdHJ1Y3RvcigkLFosSil7aWYodGhpcy5kdXJhYmxlPSQsdGhpcy5tZW09bmV3IE1aKFo/P1tdLHtpbmRleGVzOko/LmluZGV4ZXN9KSxaKWZvcihsZXQgUSBvZiBaKXRoaXMud2FybWVkLmFkZChRLnR5cGUpfXN1YnNjcmliZSgkKXtyZXR1cm4gdGhpcy5saXN0ZW5lcnMuYWRkKCQpLCgpPT57dGhpcy5saXN0ZW5lcnMuZGVsZXRlKCQpfX1lbWl0KCQpe2lmKCQuc2l6ZTwxKXJldHVybjtmb3IobGV0IFogb2YgdGhpcy5saXN0ZW5lcnMpWigkKX1ydW4oJCl7bGV0IFo9dGhpcy5jaGFpbi50aGVuKCQsJCk7cmV0dXJuIHRoaXMuY2hhaW49Wi50aGVuKCgpPT57cmV0dXJufSwoKT0+e3JldHVybn0pLFp9YXBwbHkoJCl7cmV0dXJuIHRoaXMucnVuKGFzeW5jKCk9Pnthd2FpdCB0aGlzLnB1bGxFaWRzKCQubWFwKChZKT0+WS5laWQpKTtsZXQgWj1xVih0aGlzLm1lbSwkKTt0aGlzLmVtaXQoWi50eXBlcyk7bGV0IEo9YXdhaXQgdGhpcy5kdXJhYmxlLmFwcGx5KCQpLHtjaGFuZ2VkOlEsc3RhdHVzOlZ9PWF3YWl0IHRoaXMucHVsbEVpZHMoJC5tYXAoKFkpPT5ZLmVpZCkpO2lmKHRoaXMuZW1pdChRKSxWIT09MClyZXR1cm57c3RhdHM6JC5tYXAoKCk9PlYpLHR5cGVzOkoudHlwZXMsZWlkczpKLmVpZHN9O3JldHVybiBKfSl9Y2xlYXIoKXtyZXR1cm4gdGhpcy5ydW4oYXN5bmMoKT0+e2xldCAkPWF3YWl0IHRoaXMuZHVyYWJsZS5jbGVhcigpO2lmKCQhPT0wKXJldHVybiAkO2xldCBaPXRoaXMubWVtLmVudHMuc2l6ZT4wO3JldHVybiBhd2FpdCB0aGlzLm1lbS5jbGVhcigpLHRoaXMud2FybWVkLmNsZWFyKCksMH0pfWluZ2VzdEZyb21EdXJhYmxlKCQpe3JldHVybiB0aGlzLnJ1bihhc3luYygpPT57bGV0e2NoYW5nZWQ6WixzdGF0dXM6Sn09YXdhaXQgdGhpcy5wdWxsRWlkcygkKTtyZXR1cm4gdGhpcy5lbWl0KFopLEp9KX1hc3luYyBwdWxsRWlkcygkKXtsZXQgWj1uZXcgU2V0LEo9bmV3IFNldDtmb3IobGV0IFEgb2YgJCl7bGV0IFY9ZihRKTtpZihKLmhhcyhWKSljb250aW51ZTtKLmFkZChWKTtsZXQgWT10aGlzLm1lbS5lbnRzLmdldChWKSxbWCxXXT1hd2FpdCB0aGlzLmR1cmFibGUuZ2V0Um93KFEpO2lmKFchPT0wKXJldHVybntjaGFuZ2VkOlosc3RhdHVzOld9O2lmKFgpe2lmKHRoaXMubWVtLnB1dChYKSwhWXx8IUZWKFksWCkpe2lmKGkoWCkpWi5hZGQoWC50eXBlKTtpZihZIT09dm9pZCAwJiZpKFkpKVouYWRkKFkudHlwZSl9fWVsc2UgaWYoWSE9PXZvaWQgMCl7aWYodGhpcy5tZW0uZGVsKFYpLGkoWSkpWi5hZGQoWS50eXBlKX19cmV0dXJue2NoYW5nZWQ6WixzdGF0dXM6MH19YXN5bmMgd2FybVR5cGUoJCl7aWYodGhpcy53YXJtZWQuaGFzKCQpKXJldHVybiAwO2xldFtaLEpdPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRFbnRpdGllcyh7dHlwZTokfSk7aWYoSiE9PTApcmV0dXJuIEo7aWYoWilmb3IobGV0IFEgb2YgWil7bGV0IFY9ZihRLmVpZCksWT10aGlzLm1lbS5lbnRzLmdldChWKTtpZighWXx8T1YoUSxZKSl0aGlzLm1lbS5wdXQoUSl9cmV0dXJuIHRoaXMud2FybWVkLmFkZCgkKSwwfWFzeW5jIGdldFJvdygkKXtsZXQgWj1mKCQpO2lmKHRoaXMubWVtLmVudHMuaGFzKFopKXJldHVybiB0aGlzLm1lbS5nZXRSb3coJCk7cmV0dXJuIHRoaXMucnVuKGFzeW5jKCk9PntpZih0aGlzLm1lbS5lbnRzLmhhcyhaKSlyZXR1cm4gdGhpcy5tZW0uZ2V0Um93KCQpO2xldFtKLFFdPWF3YWl0IHRoaXMuZHVyYWJsZS5nZXRSb3coJCk7aWYoUSE9PTApcmV0dXJuIEcoUSk7aWYoSil0aGlzLm1lbS5wdXQoSik7cmV0dXJuIFIoSil9KX1hc3luYyBnZXRFbnQoJCl7bGV0W1osSl09YXdhaXQgdGhpcy5nZXRSb3coJCk7aWYoSiE9PTApcmV0dXJuIEcoSik7aWYoWj09PXZvaWQgMHx8IWkoWikpcmV0dXJuIFIodm9pZCAwKTtyZXR1cm4gUihaKX1hc3luYyBnZXRFbnRpdGllcygkKXtpZighdGhpcy53YXJtZWQuaGFzKCQudHlwZSkpe2xldCBaPWF3YWl0IHRoaXMucnVuKCgpPT50aGlzLndhcm1UeXBlKCQudHlwZSkpO2lmKFohPT0wKXJldHVybiBHKFopfXJldHVybiB0aGlzLm1lbS5nZXRFbnRpdGllcygkKX1hc3luYyBjb3VudEVudGl0aWVzKHt0eXBlOiR9KXtpZighdGhpcy53YXJtZWQuaGFzKCQpKXtsZXQgWj1hd2FpdCB0aGlzLnJ1bigoKT0+dGhpcy53YXJtVHlwZSgkKSk7aWYoWiE9PTApcmV0dXJuIEcoWil9cmV0dXJuIHRoaXMubWVtLmNvdW50RW50aXRpZXMoe3R5cGU6JH0pfWFzeW5jIGNoZWNrc3VtKCQpe3JldHVybiB0aGlzLmR1cmFibGUuY2hlY2tzdW0oJCl9fWZ1bmN0aW9uIEZWKCQsWil7aWYoaSgkKSE9PWkoWikpcmV0dXJuITE7aWYoJC5jdHIhPT1aLmN0cilyZXR1cm4hMTtpZigkLnVwZGF0ZWRBdC5nZXRUaW1lKCkhPT1aLnVwZGF0ZWRBdC5nZXRUaW1lKCkpcmV0dXJuITE7aWYoIVYwKCQuZWlkLFouZWlkKSlyZXR1cm4hMTtpZighaSgkKXx8IWkoWikpcmV0dXJuITA7aWYoJC5jcmVhdGVkQXQuZ2V0VGltZSgpIT09Wi5jcmVhdGVkQXQuZ2V0VGltZSgpKXJldHVybiExO2lmKCQudHlwZSE9PVoudHlwZSlyZXR1cm4hMTtpZigkLmdpZCE9PVouZ2lkKXJldHVybiExO2lmKCFSVigkLnBpZCxaLnBpZCkpcmV0dXJuITE7aWYoIU5WKCQudGFncyxaLnRhZ3MpKXJldHVybiExO3JldHVybiBVVigkLmJvZHksWi5ib2R5KX1mdW5jdGlvbiBOVigkLFope2lmKCQ9PT1aKXJldHVybiEwO2lmKCQ9PT12b2lkIDB8fFo9PT12b2lkIDApcmV0dXJuITE7aWYoJC5sZW5ndGghPT1aLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IEo9MDtKPCQubGVuZ3RoO0orKylpZigkW0pdIT09WltKXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBSVigkLFope2lmKCQ9PT12b2lkIDAmJlo9PT12b2lkIDApcmV0dXJuITA7aWYoJD09PXZvaWQgMHx8Wj09PXZvaWQgMClyZXR1cm4hMTtyZXR1cm4gVjAoJCxaKX1mdW5jdGlvbiBVVigkLFope2lmKE9iamVjdC5pcygkLFopKXJldHVybiEwO2lmKCQgaW5zdGFuY2VvZiBVaW50OEFycmF5JiZaIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gVjAoJCxaKTtpZigkIGluc3RhbmNlb2YgRGF0ZSYmWiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuICQuZ2V0VGltZSgpPT09Wi5nZXRUaW1lKCk7dHJ5e3JldHVybiBWMChfMCgkKSxfMChaKSl9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIE9WKCQsWil7bGV0IEo9JC51cGRhdGVkQXQuZ2V0VGltZSgpLFE9Wi51cGRhdGVkQXQuZ2V0VGltZSgpO2lmKEohPT1RKXJldHVybiBKPlE7cmV0dXJuICQuY3RyPlouY3RyfWZ1bmN0aW9uIHFWKCQsWil7bGV0IEo9bmV3IFNldCxRPVtdO2ZvcihsZXQgViBvZiBaKXtsZXQgWT1mKFYuZWlkKSxYPSQuZW50cy5nZXQoWSksW1csel09ZDAoWCxWKTtpZih6IT09MCl7US5wdXNoKHopO2NvbnRpbnVlfWlmKFc9PT12b2lkIDApe1EucHVzaCgxMik7Y29udGludWV9Zm9yKGxldCBLIG9mIHIwKFgsVykpSi5hZGQoSyk7JC5wdXQoVyksUS5wdXNoKDApfXJldHVybntzdGF0czpRLHR5cGVzOkp9fWZ1bmN0aW9uIGkoJCl7cmV0dXJuInR5cGUiaW4gJH1mdW5jdGlvbiBJVigkKXtpZighQXJyYXkuaXNBcnJheSgkKXx8JC5sZW5ndGg9PT0wKXJldHVybjtsZXQgWj1uZXcgU2V0LEo9W107Zm9yKGxldCBRIG9mICQpe2lmKHR5cGVvZiBRIT09InN0cmluZyJ8fFEubGVuZ3RoPT09MCljb250aW51ZTtpZihaLmhhcyhRKSljb250aW51ZTtaLmFkZChRKSxKLnB1c2goUSl9cmV0dXJuIEoubGVuZ3RoPjA/Sjp2b2lkIDB9ZnVuY3Rpb24gRSQoJCl7cmV0dXJue2VpZDokLmVpZCxjdHI6JC5jdHIsdXBkYXRlZEF0OiQudXBkYXRlZEF0fX1mdW5jdGlvbiBiSigkKXtsZXQgWj1uZXcgZygkLmVpZCksW0osUV09Wi5yZWFkU3RydWN0KFEwKTtpZihRIT09MClyZXR1cm4gRyhRKTtyZXR1cm4gUih7ZWlkOiQuZWlkLGN0cjokLmN0cix1cGRhdGVkQXQ6bmV3IERhdGUoSi50cy5nZXRUaW1lKCkrJC5vZmYpfSl9ZnVuY3Rpb24gZDAoJCxaKXtsZXQgSj1uZXcgZyhaLmVpZCksW1EsVl09Si5yZWFkU3RydWN0KFEwKTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXQgWT1uZXcgRGF0ZShRLnRzLmdldFRpbWUoKStaLm9mZik7aWYoJCE9PXZvaWQgMCYmWTw9JC51cGRhdGVkQXQpcmV0dXJuIEcoMTUpO2lmKEJKKFopKXtsZXQgWD1JVihaLnRhZ3MpO3JldHVybiBSKHtlaWQ6Wi5laWQsZ2lkOlouZ2lkLHBpZDpaLnBpZCwuLi5YIT09dm9pZCAwP3t0YWdzOlh9Ont9LHR5cGU6Wi50eXBlLGNyZWF0ZWRBdDpRLnRzLHVwZGF0ZWRBdDpZLGN0cjpaLmN0cixib2R5OlouYm9keX0pfXJldHVybiBSKHtlaWQ6Wi5laWQsdXBkYXRlZEF0OlksY3RyOlouY3RyfSl9ZnVuY3Rpb24gcjAoJCxaKXtsZXQgSj1uZXcgU2V0O2lmKCQhPT12b2lkIDAmJmkoJCkpSi5hZGQoJC50eXBlKTtpZihpKFopKUouYWRkKFoudHlwZSk7cmV0dXJuWy4uLkpdfWNsYXNzIG0ke2luZmxpZ2h0PW51bGw7YWdhaW49ITE7cnVuKCQpe2lmKHRoaXMuYWdhaW49ITAsdGhpcy5pbmZsaWdodClyZXR1cm4gdGhpcy5pbmZsaWdodDtyZXR1cm4gdGhpcy5pbmZsaWdodD10aGlzLmRyYWluKCQpLHRoaXMuaW5mbGlnaHR9YXN5bmMgZmx1c2goKXtpZighdGhpcy5pbmZsaWdodClyZXR1cm47dHJ5e2F3YWl0IHRoaXMuaW5mbGlnaHR9Y2F0Y2h7fX1hc3luYyBkcmFpbigkKXt0cnl7dGhpcy5hZ2Fpbj0hMTtsZXQgWj1hd2FpdCAkKCk7d2hpbGUodGhpcy5hZ2Fpbil0aGlzLmFnYWluPSExLFo9YXdhaXQgJCgpO3JldHVybiBafWZpbmFsbHl7dGhpcy5pbmZsaWdodD1udWxsfX19dmFyIHlKPTEwMDtjbGFzcyBQWnt0aW1lcj1udWxsO2RlbGF5TXM7d29yazt0YWlsPW5ldyBtJDtjb25zdHJ1Y3RvcigkLFope3RoaXMuZGVsYXlNcz0kPDA/MDokLHRoaXMud29yaz1afXNjaGVkdWxlKCl7aWYodGhpcy5kZWxheU1zPD0wKXt0aGlzLmZpcmUoKTtyZXR1cm59aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMudGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMudGltZXI9bnVsbCx0aGlzLmZpcmUoKX0sdGhpcy5kZWxheU1zKX1hc3luYyBmbHVzaCgpe2lmKHRoaXMudGltZXIhPT1udWxsKWNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLnRpbWVyPW51bGwsdGhpcy5maXJlKCk7YXdhaXQgdGhpcy50YWlsLmZsdXNoKCl9Y2FuY2VsKCl7aWYodGhpcy50aW1lciE9PW51bGwpY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9bnVsbH1maXJlKCl7cmV0dXJuIHRoaXMudGFpbC5ydW4odGhpcy53b3JrKX19ZnVuY3Rpb24gaUooJCl7bGV0IFo9bmV3IGcoJC5laWQpLFtKLFFdPVEwLmRlY29kZShaKTtpZihRIT09MClyZXR1cm47cmV0dXJuIEoudHMuZ2V0VGltZSgpKyQub2ZmfWZ1bmN0aW9uIEhWKCQsWil7bGV0IEo9aUooJCksUT1pSihaKTtpZihKPT09dm9pZCAwJiZRPT09dm9pZCAwKXJldHVybiAwO2lmKEo9PT12b2lkIDApcmV0dXJuIDE7aWYoUT09PXZvaWQgMClyZXR1cm4tMTtpZihRIT09SilyZXR1cm4gUS1KO3JldHVybiBaLmN0ci0kLmN0cn1mdW5jdGlvbiBvMCgkLFope3JldHVybiAkLnNsaWNlKCkuc29ydCgoSixRKT0+SFYoWihKKSxaKFEpKSl9dmFyIHdaPXtwaGFzZToiaWRsZSJ9LEskPTUwO2Z1bmN0aW9uIFRaKCQsWixKKXtpZigkPD0wfHxaPD0wKXJldHVybiExO2lmKCQ9PT0xfHwkPT09WilyZXR1cm4hMDtyZXR1cm4gJCVKPT09MH1mdW5jdGlvbiBoSigkLFope2lmKHR5cGVvZiBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYj09PSJmdW5jdGlvbiIpe25hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKCQsWik7cmV0dXJufWxldCBKPVVSTC5jcmVhdGVPYmplY3RVUkwoJCksUT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7US5ocmVmPUosUS5kb3dubG9hZD1aLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUSksUS5jbGljaygpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoUSksVVJMLnJldm9rZU9iamVjdFVSTChKKX1mdW5jdGlvbiB1SigkLFosSil7bGV0IFE9W10sVj1bXSxZPTA7Zm9yKGxldCBYIG9mICQpe2xldCBXPVooWCk7aWYoVi5sZW5ndGg+MCYmWStXPkopUS5wdXNoKFYpLFY9W10sWT0wO2lmKFYucHVzaChYKSxZKz1XLFk+PUopUS5wdXNoKFYpLFY9W10sWT0wfWlmKFYubGVuZ3RoPjApUS5wdXNoKFYpO3JldHVybiBRfWFzeW5jIGZ1bmN0aW9uIERaKCQsWixKKXtsZXQgUT0kLmxlbmd0aDtpZihRPDEpcmV0dXJuW107bGV0IFY9QXJyYXkoUSksWT0wLFg9TWF0aC5taW4oTWF0aC5tYXgoMSxaKSxRKSxXPWFzeW5jKCk9Pnt3aGlsZSghMCl7bGV0IEs9WTtpZihZKz0xLEs+PVEpcmV0dXJuO1ZbS109YXdhaXQgSigkW0tdLEspfX0sej1bXTtmb3IobGV0IEs9MDtLPFg7SysrKXoucHVzaChXKCkpO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbCh6KSxWfWFzeW5jIGZ1bmN0aW9uIGckKCQsWixKLFEpe2xldCBWPW5ldyBnKCQuaGVhZENwaCksW1ksWF09Vi5yZWFkU3RydWN0KEEkKTtpZihYIT09MClyZXR1cm4gRyhYKTtsZXR7c2lnOlcsa2RtOnosaGVhZENwaDpLfT1ZO2lmKCFhd2FpdCBRLmNoZWNrU2lnRWQyNTUxOShXLEssWikpcmV0dXJuIEcoMyk7bGV0IE49Si5kZXJpdmVDaXBoZXIoeiwiZGVjcnlwdCIpLFU7dHJ5e1U9YXdhaXQgTi5kZWNyeXB0KEspfWNhdGNoe3JldHVybiBHKDIwKX1yZXR1cm4gUih7a2RtOnosaGVhZEVuYzpVfSl9dmFyIHMwPSJmIixTJD0idCIsYTA9ImUiO2Z1bmN0aW9uIE1WKCQpe2lmKCQ9PT0hMHx8JD09PVMkKXJldHVybiBTJDtpZigkPT09YTApcmV0dXJuIGEwO3JldHVybiBzMH1mdW5jdGlvbiBsSigkKXtyZXR1cm4gJCE9PTAmJiQhPT0xNSYmJCE9PTE4JiYkIT09MTd9ZnVuY3Rpb24galooJCxaLEope2lmKCQuYXBsZD1aLFo9PT1hMCYmSiE9PXZvaWQgMCkkLmVycj1KO2Vsc2UgZGVsZXRlICQuZXJyfWFzeW5jIGZ1bmN0aW9uIHYkKCQsWixKLFEpe2xldCBWPVE/LmJvZHkhPT0hMSxZPU1WKFouYXBsZCksWD1aLmJvZHksVz1YPy5sZW5ndGg/PzAsejtpZihWJiZYJiZXPjApej1hd2FpdCBKLmJsYWtlMyhYKTtsZXQgSz17ZWlkOlouZWlkLG9mZjpaLm9mZj8/MCxjdHI6Wi5jdHI/PzAsbGVuOlcsaHNoOnp9LEY9e2hhc2g6JCxoZWFkOkssYXBsZDpZfTtpZihWJiZYIT09dm9pZCAwKUYuYm9keT1YO2lmKFk9PT1hMCYmWi5lcnIhPT12b2lkIDApRi5lcnI9Wi5lcnI7cmV0dXJuIEZ9dmFyIEFaPTEwNDg1NzYsX1o9MTA0ODU3NixuSj02NDtmdW5jdGlvbiBDVigkKXtyZXR1cm4gJC5zaWcubGVuZ3RoKyQua2RtLmxlbmd0aCskLmhlYWRDcGgubGVuZ3RoKyQuYm9keUNwaC5sZW5ndGh9YXN5bmMgZnVuY3Rpb24gUFYoJCxaLEosUSxWKXtpZihRLmxlbmd0aDwxKXJldHVybiAwO2xldFtZLFhdPWF3YWl0ICQucHVzaChRKTtpZihYIT09MClyZXR1cm4gWDtpZighWSlyZXR1cm4gMjc7Zm9yKGxldCB6IG9mIFkpe2lmKHouc3RhdHVzIT09MCl7Y29uc29sZS5lcnJvcigicHVzaCBlcnIiLHopO2NvbnRpbnVlfWxldCBLPVZbei5pZHhdO2lmKCFLKXtjb25zb2xlLmVycm9yKCJubyBoYXNoIix6KTtjb250aW51ZX1hd2FpdCBaLnVwbG9hZHMuZGVxKEosW0tdKX1sZXQgVz1hd2FpdCBaLmhvc3RzLmdldChKKTtpZihXKXtsZXQgej1XLmxhc3RTZXEsSz16LEY9W107Zm9yKGxldCBOIG9mIFkpaWYoTi5zdGF0dXM9PT0wKUYucHVzaChOLnNlcSk7Ri5zb3J0KChOLFUpPT5OLVUpO2ZvcihsZXQgTiBvZiBGKWlmKE49PT16KzEpej1OO2lmKHo+Sylhd2FpdCBaLmhvc3RzLnRvdWNoKEoseil9cmV0dXJuIDB9YXN5bmMgZnVuY3Rpb24gcEooJCxaKXtpZihaLmxlbmd0aDwxKXJldHVybiBSKFtdKTtsZXQgSj1uZXcgTWFwLFE9W107Zm9yKGxldCBXIG9mIFopSi5zZXQoVy5zZXEsVyksUS5wdXNoKFcuc2VxKTtsZXRbVixZXT1hd2FpdCAkLnB1bGwoUSk7aWYoWSE9PTApcmV0dXJuIEcoWSk7aWYoIVYpcmV0dXJuIEcoMjcpO2xldCBYPVtdO2ZvcihsZXR7c2VxOlcsYm9keUNwaDp6fW9mIFYpe2xldCBLPUouZ2V0KFcpO2lmKCFLKWNvbnRpbnVlO1gucHVzaCh7ZGw6Syxib2R5Q3BoOnp9KX1yZXR1cm4gUihYKX1hc3luYyBmdW5jdGlvbiB3VigkLFosSixRKXtpZihRLmxlbmd0aDwxKXJldHVybiBSKHtwYXJ0czpbXSxoYXNoZXM6W119KTtsZXQgVj1bXSxZPVtdLFg9W10sVz1uZXcgTWFwO2ZvcihsZXR7ZGw6Syxib2R5Q3BoOkZ9b2YgUSl7bGV0e2hlYWQ6TixrZG06VSxzZXE6Tyxob3N0OnF9PUssW0ksSF09YXdhaXQgY0ooSyxKKTtpZihIIT09MHx8IUkpe2xldCBrPVcuZ2V0KHEpPz9bXTtrLnB1c2goTyksVy5zZXQocSxrKTtjb250aW51ZX1sZXR7aGVhZEVuYzpQLGhlYWRFbmNIYXNoOkN9PUksVD1aLmRlcml2ZUNpcGhlcihVLCJkZWNyeXB0IiksW00sQV09YXdhaXQgWVooUCxGLFQsSixDKTtpZihBIT09MHx8IU0pe2xldCBrPVcuZ2V0KHEpPz9bXTtrLnB1c2goTyksVy5zZXQocSxrKTtjb250aW51ZX1sZXQgeD17aGVhZDpOLGJvZHk6TS5ib2R9LG09TS5oZWFkSGFzaDtYLnB1c2goe2tleTptLGRhdGE6b0ooeCl9KSxWLnB1c2goeCksWS5wdXNoKG0pO2xldCBFPVcuZ2V0KHEpPz9bXTtFLnB1c2goTyksVy5zZXQocSxFKX1sZXQgej1hd2FpdCAkLm1lc3NhZ2VzLmFkZChYKTtmb3IobGV0W0ssRl1vZiBXKWF3YWl0ICQuZG93bmxvYWRzLmRlcShLLEYpO2ZvcihsZXQgSz0wO0s8ei5sZW5ndGg7SysrKXtsZXQgRj16W0tdO2lmKEYhPT0wJiZGIT09MTUpY29uc29sZS5lcnJvcigiRVJSIHN0b3JpbmciLGpbRl0sImZvciBtZXNzYWdlIixLKX1yZXR1cm4gUih7cGFydHM6VixoYXNoZXM6WX0pfWFzeW5jIGZ1bmN0aW9uIGNKKCQsWil7bGV0IEo9JC5oZWFkRW5jO2lmKCFKKXtsZXQgVj1uZXcgUyxZPVYud3JpdGVTdHJ1Y3QoWDAsJC5oZWFkKTtpZihZIT09MClyZXR1cm4gRyhZKTtKPVYucmVzdWx0KCl9aWYoJC5oZWFkRW5jSGFzaClyZXR1cm4gUih7aGVhZEVuYzpKLGhlYWRFbmNIYXNoOiQuaGVhZEVuY0hhc2h9KTtsZXQgUT1hd2FpdCBaLmJsYWtlMyhKKTtyZXR1cm4gUih7aGVhZEVuYzpKLGhlYWRFbmNIYXNoOlF9KX1hc3luYyBmdW5jdGlvbiBkSigkLFosSil7bGV0IFE9bmV3IFNldDtmb3IobGV0IFggb2YgWilRLmFkZChmKFgpKTtpZihRLnNpemU8MSlyZXR1cm47bGV0IFY9QXJyYXkuZnJvbShhd2FpdCAkLmRvd25sb2Fkcy5saXN0KCkpO2lmKFYubGVuZ3RoPDEpcmV0dXJuO2xldCBZPW5ldyBNYXA7Zm9yKGxldCBYIG9mIFYpe2xldCBXO2lmKFguaGVhZEVuY0hhc2gpVz1mKFguaGVhZEVuY0hhc2gpO2Vsc2V7bGV0W0ssRl09YXdhaXQgY0ooWCxKKTtpZihGIT09MHx8IUspY29udGludWU7Vz1mKEsuaGVhZEVuY0hhc2gpfWlmKCFRLmhhcyhXKSljb250aW51ZTtsZXQgej1ZLmdldChYLmhvc3QpPz9bXTt6LnB1c2goWC5zZXEpLFkuc2V0KFguaG9zdCx6KX1mb3IobGV0W1gsV11vZiBZKWF3YWl0ICQuZG93bmxvYWRzLmRlcShYLFcpfWFzeW5jIGZ1bmN0aW9uIExaKHtjb25uOiQsc3RvcmU6WixlbmNsYXZlOkosaG9zdDpRLGNyeXB0bzpWLG9uUHJvZ3Jlc3M6WSxwZWVrUHJvZ3Jlc3NFdmVyeTpYLHBlZWtDb25jdXJyZW5jeTpXfSl7bGV0IHo9YXdhaXQgJC5pZGVudGl0eSgpLEs9W10sW0YsTl09YXdhaXQgJC5wZWVrKFEubGFzdFNlcSk7aWYoTiE9PTApcmV0dXJuIE47bGV0IFU9Ri5sZW5ndGgsTz1YPz9LJCxxPVc/P25KO2lmKFkmJlU+MClZKHtwaGFzZToicGVlayIsaG9zdDpRLmxhYmVsLGRvbmU6MCx0b3RhbDpVfSk7bGV0IEk9MCxIPWF3YWl0IERaKEYscSxhc3luYyhDKT0+e2xldFtULE1dPWF3YWl0IGckKEMsei5wdWJsaWNLZXksSixWKSxBO2lmKE0hPT0wfHwhVClBPXtvazohMSxzZXE6Qy5zZXEsc3RhdDpNfTtlbHNle2xldCB4PWF3YWl0IFYuYmxha2UzKFQuaGVhZEVuYyk7QT17b2s6ITAsc2VxOkMuc2VxLGtkbTpULmtkbSxoZWFkRW5jOlQuaGVhZEVuYyxoZWFkRW5jSGFzaDp4fX1pZihJKz0xLFkmJlRaKEksVSxPKSlZKHtwaGFzZToicGVlayIsaG9zdDpRLmxhYmVsLGRvbmU6SSx0b3RhbDpVfSk7cmV0dXJuIEF9KSxQPW5ldyBTZXQ7Zm9yKGxldCBDIG9mIEgpe2lmKCFDLm9rKXtjb25zb2xlLmVycm9yKCJwZWVrOiBkZWNyeXB0aW5nIGl0ZW0gaGVhZCIsQy5zdGF0KTtjb250aW51ZX1sZXQgVD1mKEMuaGVhZEVuY0hhc2gpO2lmKGF3YWl0IFoubWVzc2FnZXMuaGFzKEMuaGVhZEVuY0hhc2gpKXtjb25zb2xlLmluZm8oInBlZWs6IGxvY2FsIG1zZzsgc2tpcCBkb3dubG9hZCwgZGVxIHVwbG9hZCIpLGF3YWl0IFoudXBsb2Fkcy5kZXEoUS5sYWJlbCxbQy5oZWFkRW5jSGFzaF0pLGF3YWl0IFouZG93bmxvYWRzLmRlcShRLmxhYmVsLFtDLnNlcV0pO2NvbnRpbnVlfWlmKFAuaGFzKFQpKXthd2FpdCBaLmRvd25sb2Fkcy5kZXEoUS5sYWJlbCxbQy5zZXFdKTtjb250aW51ZX1sZXQgQT1uZXcgZyhDLmhlYWRFbmMpLFt4LG1dPUEucmVhZFN0cnVjdChYMCk7aWYobSE9PTApe2NvbnNvbGUuZXJyb3IoInBlZWs6IHJlYWRpbmcgaXRlbSBoZWFkIixtKTtjb250aW51ZX1QLmFkZChUKSxLLnB1c2goe2tkbTpDLmtkbSxoZWFkOngsc2VxOkMuc2VxLGhvc3Q6US5sYWJlbCxoZWFkRW5jOkMuaGVhZEVuYyxoZWFkRW5jSGFzaDpDLmhlYWRFbmNIYXNofSl9aWYoYXdhaXQgWi5kb3dubG9hZHMuZW5xKEspLEYubGVuZ3RoPjApe2xldCBDPU1hdGgubWF4KC4uLkYubWFwKChUKT0+VC5zZXEpKTthd2FpdCBaLmhvc3RzLnJlY29yZFN0YXRzKFEubGFiZWwse2xhc3RTZXE6Q30pfWlmKFkpWSh7cGhhc2U6InBlZWsiLGhvc3Q6US5sYWJlbCxkb25lOlUsdG90YWw6VX0pO3JldHVybiAwfWFzeW5jIGZ1bmN0aW9uIHJKKHtjb25uOiQsc3RvcmU6Wixob3N0OkosbWF4UHVzaEJ5dGVzOlEsb25Qcm9ncmVzczpWfSl7bGV0IFk9UT8/QVosWD1hd2FpdCBaLnVwbG9hZHMubGlzdChKLmxhYmVsKSxXPVgubGVuZ3RoLHo9MDtpZihWJiZXPjApVih7cGhhc2U6InB1c2giLGhvc3Q6Si5sYWJlbCxkb25lOjAsdG90YWw6V30pO2xldCBLPVtdLEY9W10sTj0wLFU9YXN5bmMoKT0+e2lmKEsubGVuZ3RoPDEpcmV0dXJuIDA7bGV0IE89Sy5sZW5ndGgscT1hd2FpdCBQVigkLFosSi5sYWJlbCxLLEYpO2lmKEs9W10sRj1bXSxOPTAscT09PTApe2lmKHorPU8sVilWKHtwaGFzZToicHVzaCIsaG9zdDpKLmxhYmVsLGRvbmU6eix0b3RhbDpXfSl9cmV0dXJuIHF9O2ZvcihsZXQgTyBvZiBYKXtsZXQgcT1hd2FpdCBaLm1lc3NhZ2VzLmdldChPKTtpZighcSl7eis9MTtjb250aW51ZX1sZXQgST17Li4ucS5oZWFkLGJvZDpxLmJvZHl9LFtILFBdPWF3YWl0ICQuc2VhbChJKTtpZihQIT09MClyZXR1cm4gUDtpZighSClyZXR1cm4gMTI7bGV0IEM9Q1YoSCk7aWYoSy5sZW5ndGg+MCYmTitDPlkpe2xldCBUPWF3YWl0IFUoKTtpZihUIT09MClyZXR1cm4gVH1pZihLLnB1c2goSCksRi5wdXNoKE8pLE4rPUMsTj49WSl7bGV0IFQ9YXdhaXQgVSgpO2lmKFQhPT0wKXJldHVybiBUfX1yZXR1cm4gVSgpfWFzeW5jIGZ1bmN0aW9uIHhaKHtjb25uOiQsc3RvcmU6WixlbmNsYXZlOkosaG9zdDpRLGNyeXB0bzpWLG1heFB1bGxCeXRlczpZLG9uUHJvZ3Jlc3M6WH0sVyl7bGV0IHo9WT8/X1osSz1hd2FpdCBaLmRvd25sb2Fkcy5saXN0KCksRj1BcnJheS5mcm9tKEspLmZpbHRlcigoSCk9PkguaG9zdD09PVEubGFiZWwpO2lmKEYubGVuZ3RoPDEpcmV0dXJuIDE1O2xldCBOPW8wKEYsKEgpPT5ILmhlYWQpLFU9dUooTiwoSCk9PkguaGVhZC5sZW4seiksTz1OLmxlbmd0aCxxPTA7aWYoWClYKHtwaGFzZToicHVsbCIsaG9zdDpRLmxhYmVsLGRvbmU6MCx0b3RhbDpPfSk7bGV0IEk9cEooJCxVWzBdKTtmb3IobGV0IEg9MDtIPFUubGVuZ3RoO0grKyl7bGV0W1AsQ109YXdhaXQgSTtpZihDIT09MHx8IVApcmV0dXJuIEM7aWYocSs9VVtIXS5sZW5ndGgsWClYKHtwaGFzZToicHVsbCIsaG9zdDpRLmxhYmVsLGRvbmU6cSx0b3RhbDpPfSk7bGV0IFQ9VVtIKzFdO2lmKFQpST1wSigkLFQpO2lmKFgpWCh7cGhhc2U6Im9wZW4iLGhvc3Q6US5sYWJlbCxkb25lOnEsdG90YWw6T30pO2xldCBNPW8wKFAsKHgpPT54LmRsLmhlYWQpLFssQV09YXdhaXQgd1YoWixKLFYsTSk7aWYoQSE9PTApcmV0dXJuIEE7aWYoVyl7aWYoWClYKHtwaGFzZToiZXhlYyIsaG9zdDpRLmxhYmVsLGRvbmU6cSx0b3RhbDpPfSk7YXdhaXQgVygpfX1yZXR1cm4gMH1mdW5jdGlvbiBvSih7aGVhZDokLGJvZHk6Wn0pe2xldCBKPXtlaWQ6JC5laWQsYm9keTpaLGFwbGQ6czB9O2lmKCQub2ZmIT09MClKLm9mZj0kLm9mZjtpZigkLmN0ciE9PTApSi5jdHI9JC5jdHI7cmV0dXJuIEp9YXN5bmMgZnVuY3Rpb24gYUooJCx7Y29ubjpaLHN0b3JlOkosZW5jbGF2ZTpRLGhvc3Q6VixjcnlwdG86WSxvblByb2dyZXNzOlh9LFcpe2xldCB6PVYubGFiZWwsSz1hd2FpdCBaLmlkZW50aXR5KCksRj1uZXcgZygkKSxbTixVXT1GLnJlYWRTdHJ1Y3RzKGokKTtpZihVIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY29kaW5nIG5vdGlmIixqW1VdKTtyZXR1cm59bGV0IE89ITEsST0oYXdhaXQgSi5ob3N0cy5nZXQoeikpPy5sYXN0U2VxLEg9W10sUD0hMTtmb3IobGV0IE0gb2YgTil7bGV0W0EseF09YXdhaXQgZyQoe3NlcTpNLnNlcSxoZWFkQ3BoOk0uaGVhZENwaH0sSy5wdWJsaWNLZXksUSxZKTtpZih4IT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIGRlY3J5cHRpbmcgbm90aWYiLGpbeF0pO2NvbnRpbnVlfWxldCBtPWF3YWl0IFkuYmxha2UzKEEuaGVhZEVuYyk7aWYoYXdhaXQgSi5tZXNzYWdlcy5oYXMobSkpY29udGludWU7bGV0IEU9bmV3IGcoQS5oZWFkRW5jKSxbayxiXT1FLnJlYWRTdHJ1Y3QoWDApO2lmKGIhPT0wKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgaGVhZCIsaltiXSk7Y29udGludWV9aWYoIU0uYm9keUNwaCYmay5sZW4+MClQPSEwLGF3YWl0IEouZG93bmxvYWRzLmVucShbe3NlcTpNLnNlcSxob3N0Onosa2RtOkEua2RtLGhlYWQ6ayxoZWFkRW5jOkEuaGVhZEVuYyxoZWFkRW5jSGFzaDptfV0pO2Vsc2UgSC5wdXNoKHsuLi5BLGhlYWQ6ayxib2R5Q3BoOk0uYm9keUNwaCxoZWFkRW5jSGFzaDptfSk7aWYoST09PXZvaWQgMHx8TS5zZXEhPT1JKzEpY29uc29sZS5sb2coIm91dCBvZiBzZXEiLE0uc2VxLEkpLE89ITA7ZWxzZSBJPU0uc2VxfWlmKEkhPT12b2lkIDApYXdhaXQgSi5ob3N0cy50b3VjaChWLmxhYmVsLEkpO2xldCBDPVtdO2ZvcihsZXQgTSBvZiBIKXtsZXQgQT1RLmRlcml2ZUNpcGhlcihNLmtkbSwiZGVjcnlwdCIpLFt4LG1dPWF3YWl0IFlaKE0uaGVhZEVuYyxNLmJvZHlDcGgsQSxZKTtpZihtIT09MCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIG9wZW4gYm9keSIsalttXSk7Y29udGludWV9Qy5wdXNoKHtrZXk6TS5oZWFkRW5jSGFzaCxkYXRhOm9KKHtoZWFkOk0uaGVhZCxib2R5OnguYm9kfSl9KX1sZXQgVD1hd2FpdCBKLm1lc3NhZ2VzLmFkZChDKTtmb3IobGV0IE09MDtNPFQubGVuZ3RoO00rKyl7bGV0IEE9VFtNXTtpZihBIT09MCYmQSE9PTE1KWNvbnNvbGUuZXJyb3IoIkVSUiBzdG9yaW5nIixqW0FdLCJmb3IgbWVzc2FnZSIsTSl9aWYoWCYmQy5sZW5ndGg+MClYKHtwaGFzZToib3BlbiIsaG9zdDpWLmxhYmVsLGRvbmU6Qy5sZW5ndGgsdG90YWw6Qy5sZW5ndGh9KTtpZihPfHxQfHxDLmxlbmd0aD4wKVcoKX1hc3luYyBmdW5jdGlvbiBmWigkLFo9e30pe2xldCBKPVoucHVsbCE9PSExLFE9Wi5wdXNoPT09ITAse2Nvbm46VixzdG9yZTpZLGVuY2xhdmU6WCxob3N0OlcsY3J5cHRvOnosb25Qcm9ncmVzczpLLHBlZWtQcm9ncmVzc0V2ZXJ5OkYscGVla0NvbmN1cnJlbmN5Ok59PSQsVT1hd2FpdCBWLmlkZW50aXR5KCksW08scV09YXdhaXQgVi5wZWVrKDApO2lmKHEhPT0wKXJldHVybiBHKHEpO2xldCBJPU8ubGVuZ3RoLEg9Rj8/SyQsUD1OPz9uSjtpZihLJiZJPjApSyh7cGhhc2U6InBlZWsiLGhvc3Q6Vy5sYWJlbCxkb25lOjAsdG90YWw6SX0pO2xldCBDPTAsVD1hd2FpdCBEWihPLFAsYXN5bmMoTCk9PntsZXRbdixCXT1hd2FpdCBnJChMLFUucHVibGljS2V5LFgseikseTtpZihCIT09MHx8IXYpeT17b2s6ITEsc2VxOkwuc2VxLHN0YXQ6Qn07ZWxzZXtsZXQgXz1hd2FpdCB6LmJsYWtlMyh2LmhlYWRFbmMpO3k9e29rOiEwLHNlcTpMLnNlcSxrZG06di5rZG0saGVhZEVuYzp2LmhlYWRFbmMsaGVhZEVuY0hhc2g6X319aWYoQys9MSxLJiZUWihDLEksSCkpSyh7cGhhc2U6InBlZWsiLGhvc3Q6Vy5sYWJlbCxkb25lOkMsdG90YWw6SX0pO3JldHVybiB5fSksTT1uZXcgTWFwO2ZvcihsZXQgTCBvZiBUKXtpZighTC5vayljb250aW51ZTtsZXQgdj1mKEwuaGVhZEVuY0hhc2gpLEI9TS5nZXQodik7aWYoQilCLmNvdW50Kz0xO2Vsc2UgTS5zZXQodix7aGFzaDpMLmhlYWRFbmNIYXNoLGNvdW50OjEsc2FtcGxlOkx9KX1sZXQgQT0wLHg9W107Zm9yKGxldCBMIG9mIE0udmFsdWVzKCkpe2lmKEwuY291bnQ+MSlBKz1MLmNvdW50LTE7eC5wdXNoKEwuaGFzaCl9bGV0IG09Ty5sZW5ndGgsRT1NLnNpemUsaz1hd2FpdCB6JCh4LHopLGI9W10sdz0wO2ZvcihsZXQgTCBvZiBNLnZhbHVlcygpKXtpZihhd2FpdCBZLm1lc3NhZ2VzLmhhcyhMLmhhc2gpKXthd2FpdCBZLnVwbG9hZHMuZGVxKFcubGFiZWwsW0wuaGFzaF0pO2NvbnRpbnVlfWlmKHcrPTEsIUopY29udGludWU7bGV0IEI9TC5zYW1wbGUseT1uZXcgZyhCLmhlYWRFbmMpLFtfLGNdPXkucmVhZFN0cnVjdChYMCk7aWYoYyE9PTApe2NvbnNvbGUuZXJyb3IoInJlY29uY2lsZTogcmVhZGluZyBtc2cgaGVhZGVyIixjKTtjb250aW51ZX1iLnB1c2goe2tkbTpCLmtkbSxoZWFkOl8sc2VxOkIuc2VxLGhvc3Q6Vy5sYWJlbCxoZWFkRW5jOkIuaGVhZEVuYyxoZWFkRW5jSGFzaDpCLmhlYWRFbmNIYXNofSl9aWYoYi5sZW5ndGg+MClhd2FpdCBZLmRvd25sb2Fkcy5lbnEoYik7bGV0IGg9MDtpZihRKXtsZXQgTD1hd2FpdCBZLm1lc3NhZ2VzLmxpc3RLZXlzKCksdj1uZXcgU2V0KE0ua2V5cygpKSxCPVtdO2ZvcihsZXQgeSBvZiBMKWlmKCF2LmhhcyhmKHkpKSloKz0xLEIucHVzaCh5KTtpZihCLmxlbmd0aD4wKWF3YWl0IFkudXBsb2Fkcy5lbnEoVy5sYWJlbCxCKX1lbHNle2xldCBMPWF3YWl0IFkubWVzc2FnZXMubGlzdEtleXMoKSx2PW5ldyBTZXQoTS5rZXlzKCkpO2ZvcihsZXQgQiBvZiBMKWlmKCF2LmhhcyhmKEIpKSloKz0xfWxldCBsPU8ubGVuZ3RoPjA/TWF0aC5tYXgoLi4uTy5tYXAoKEwpPT5MLnNlcSkpOjA7aWYoYXdhaXQgWS5ob3N0cy5yZWNvcmRTdGF0cyhXLmxhYmVsLHtzZXRMYXN0U2VxOmx9KSxLKUsoe3BoYXNlOiJwZWVrIixob3N0OlcubGFiZWwsZG9uZTpJLHRvdGFsOkl9KTtyZXR1cm4gUih7bXNnY2hlY2s6ayxudW1CYWdzOm0sdW5pcXVlTXNnczpFLG51bUR1cGVzOkEsbWlzc2luZ0xvY2FsOncsbWlzc2luZ0hvc3Q6aH0pfWNsYXNzIGtae2Nsb2NrO3N0YXRlO3N0b3JlO3RyYW5zcG9ydDtjcnlwdG87Zm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ7b25TY2hlZHVsZVN5bmM7Y29ubmVjdGlvbnM9bmV3IE1hcDthcHBseUNoYWluPVByb21pc2UucmVzb2x2ZSgpO3N5bmNSdW5zPW5ldyBtJDtjbGllbnRTdGF0ZTt4ZmVyU3RhdGU7bWF4UHVzaEJ5dGVzO21heFB1bGxCeXRlcztwZWVrUHJvZ3Jlc3NFdmVyeT1LJDtsYXN0UHJvZ3Jlc3M9d1o7c2NoZWR1bGVkU3luYztjb25zdHJ1Y3RvcigkLFosSixRLFYsWT0hMCxYPUFaLFc9X1oseil7dGhpcy5jbG9jaz0kO3RoaXMuc3RhdGU9Wjt0aGlzLnN0b3JlPUo7dGhpcy50cmFuc3BvcnQ9UTt0aGlzLmNyeXB0bz1WO3RoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQ9WTt0aGlzLm9uU2NoZWR1bGVTeW5jPXo7dGhpcy5tYXhQdXNoQnl0ZXM9WCx0aGlzLm1heFB1bGxCeXRlcz1XLHRoaXMuY2xpZW50U3RhdGU9bmV3IEwwKCgpPT50aGlzLmdldENsaWVudFN0YXRlKCkpLHRoaXMueGZlclN0YXRlPW5ldyBMMCgoKT0+dGhpcy5nZXRYZmVyU3RhdGUoKSksdGhpcy5zY2hlZHVsZWRTeW5jPW5ldyBQWih5Sixhc3luYygpPT57dHJ5e2NvbnNvbGUuaW5mbygiUnVubmluZyBzY2hlZHVsZWQgc3luYyIpLGF3YWl0IHRoaXMuc3luYygpfWNhdGNoKEspe2NvbnNvbGUuZXJyb3IoIkRlYm91bmNlZCBzeW5jIGZhaWxlZDoiLEspfX0pfWVtaXRQcm9ncmVzcz0oJCk9Pnt0aGlzLmxhc3RQcm9ncmVzcz0kLHRoaXMueGZlclN0YXRlLmVtaXQoKX07YXN5bmMgc2V0U2VlZCgkLFope2F3YWl0IHRoaXMuc3RvcmUuc2VlZC5zYXZlKCQsWiksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgZ2V0Q2xpZW50U3RhdGUoKXtsZXR7c3RvcmU6JCxjb25uZWN0aW9uczpafT10aGlzLEo9YXdhaXQgJC5zZWVkLmxvYWQoKSxRPWF3YWl0ICQuaG9zdHMubGlzdCgpLFY9ITE7Zm9yKGxldCBZIG9mIFoudmFsdWVzKCkpaWYoWS5pc0Nvbm5lY3RlZCgpKXtWPSEwO2JyZWFrfXJldHVybntoYXNTZWVkOkohPT12b2lkIDAsaGFzSG9zdDpBcnJheS5mcm9tKFEpLmxlbmd0aD4wLGNvbm5lY3RlZDpWfX1hc3luYyBnZXRYZmVyU3RhdGUoKXtsZXR7dXBsb2FkczokLGRvd25sb2FkczpafT10aGlzLnN0b3JlLEo9YXdhaXQgJC5jb3VudCgpO3JldHVybntudW1Eb3dubG9hZHM6YXdhaXQgWi5jb3VudCgpLG51bVVwbG9hZHM6Sixwcm9ncmVzczp0aGlzLmxhc3RQcm9ncmVzc319YXBwbHk9KCQsWik9PntyZXR1cm4gdGhpcy5lbnF1ZXVlQXBwbHlKb2IoKCk9PnRoaXMuZG9BcHBseSgkLFopKX07YXN5bmMgZG9BcHBseSgkLFo9e2VucXVldWVVcGxvYWQ6ITAsdHJpZ2dlclVwbG9hZDohMH0pe2xldCBKPVtdLFE9W107Zm9yKGxldHtoZWFkOlksYm9keTpYfW9mICQpe2xldCBXPW5ldyBTO1cud3JpdGVTdHJ1Y3QoWDAsWSk7bGV0IHo9Vy5yZXN1bHQoKSxLPWF3YWl0IHRoaXMuY3J5cHRvLmJsYWtlMyh6KSxGPXtlaWQ6WS5laWQsYm9keTpYLGFwbGQ6czB9O2lmKFkub2ZmIT09MClGLm9mZj1ZLm9mZjtpZihZLmN0ciE9PTApRi5jdHI9WS5jdHI7Si5wdXNoKEspLFEucHVzaCh7a2V5OkssZGF0YTpGfSl9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5hZGQoUSksYXdhaXQgZEoodGhpcy5zdG9yZSxKLHRoaXMuY3J5cHRvKTtsZXQgVj1hd2FpdCB0aGlzLmRvQXBwbHlIYXNoZXMoSik7aWYoWi5lbnF1ZXVlVXBsb2FkKXtsZXQgWT1bXTtmb3IobGV0IFg9MDtYPEoubGVuZ3RoO1grKyl7bGV0IFc9VltYXTtpZihXPT09MHx8Vz09PTE1KVkucHVzaChKW1hdKX1pZihZLmxlbmd0aD4wKXtsZXQgWD1hd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKTtmb3IobGV0IFcgb2YgWClhd2FpdCB0aGlzLnN0b3JlLnVwbG9hZHMuZW5xKFcubGFiZWwsWSk7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfX1pZihaLnRyaWdnZXJVcGxvYWQpdGhpcy5zY2hlZHVsZVN5bmMoKTtyZXR1cm4gVn1lbnF1ZXVlQXBwbHlKb2IoJCl7bGV0IFo9dGhpcy5hcHBseUNoYWluLnRoZW4oJCwkKTtyZXR1cm4gdGhpcy5hcHBseUNoYWluPVoudGhlbigoKT0+e3JldHVybn0sKCk9PntyZXR1cm59KSxafWRyYWluQXBwbHlRdWV1ZSgpe3JldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5kb0RyYWluQXBwbHlRdWV1ZSgpKX1hc3luYyBkb0RyYWluQXBwbHlRdWV1ZSgpe2xldCAkPWF3YWl0IHRoaXMuc3RvcmUubWVzc2FnZXMubGlzdCh7YXBsZDpzMH0pO2lmKCQubGVuZ3RoPDEpcmV0dXJuW107bGV0IFo9bzAoJCwoSik9PkouaGVhZCk7cmV0dXJuIHRoaXMuYXBwbHlTdG9yZWQoWil9YXBwbHlIYXNoZXM9KCQpPT57cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKCgpPT50aGlzLmRvQXBwbHlIYXNoZXMoJCkpfTthc3luYyBkb0FwcGx5SGFzaGVzKCQpe2xldCBaPVtdO2ZvcihsZXQgViBvZiAkKXtsZXQgWT1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmdldChWKTtpZihZKVoucHVzaChZKX1sZXQgSj1hd2FpdCB0aGlzLmFwcGx5U3RvcmVkKFopLFE9bmV3IE1hcDtmb3IobGV0IFY9MDtWPFoubGVuZ3RoO1YrKylRLnNldChmKFpbVl0uaGFzaCksSltWXT8/MTIpO3JldHVybiAkLm1hcCgoVik9PlEuZ2V0KGYoVikpPz8xMyl9YXN5bmMgYXBwbHlTdG9yZWQoJCl7aWYoJC5sZW5ndGg8MSlyZXR1cm5bXTtsZXQgWj0kLm1hcCgoWSk9Pih7Li4uWS5oZWFkLGJvZDpZLmJvZHl9KSksSj1hd2FpdCB0aGlzLnN0YXRlLmFwcGx5KFopLFE9W10sVj1bXTtmb3IobGV0IFk9MDtZPCQubGVuZ3RoO1krKyl7bGV0IFg9SltZXTtpZihYPT09MHx8WD09PTE1KVEucHVzaCgkW1ldLmhhc2gpO2Vsc2UgaWYoWCE9PXZvaWQgMCYmbEooWCkpVi5wdXNoKHtrZXk6JFtZXS5oYXNoLGVycjpYfSl9aWYoUS5sZW5ndGg+MClhd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLm1hcmtBcHBsaWVkKFEpO2lmKFYubGVuZ3RoPjApYXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5tYXJrRmFpbGVkKFYpO3JldHVybiBKfWFzeW5jIGluc2VydFJhdygkKXtsZXR7Y2xvY2s6WixjcnlwdG86Sn09dGhpcyxbUSxWXT1hd2FpdCBmSih7bm93Oloubm93KCksYm9kOiQsY3J5cHRvOkp9KTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXQgWD0oYXdhaXQgdGhpcy5hcHBseShbe2hlYWQ6USxib2R5OiR9XSkpWzBdO2lmKFghPT0wJiZYIT09MTUpcmV0dXJuIEcoWD8/MTIpO3JldHVybiBSKFEpfWFzeW5jIG1ha2VVcGRhdGUoJCxaKXtsZXR7Y2xvY2s6SixjcnlwdG86UX09dGhpcyxWPUoubm93KCk7aWYoJC51cGRhdGVkQXQuZ2V0VGltZSgpPlYuZ2V0VGltZSgpKXJldHVybiBHKDQpO2xldCBZPSQuY3RyKzEsW1gsV109YXdhaXQgeCQoe25vdzpWLGVpZDokLmVpZCxjdHI6WSxib2Q6WixjcnlwdG86UX0pO2lmKFchPT0wKXJldHVybiBHKFcpO3JldHVybiBSKHtoZWFkOlgsYm9keTpafSl9YXN5bmMgdXBkYXRlV2l0aFNrZXcoJCxaLEope2lmKEo9PT0hMSlyZXR1cm4gRyg0KTtsZXR7Y2xvY2s6USxjcnlwdG86Vn09dGhpcyxZPVEubm93KCksWD1uZXcgZygkLmVpZCksW1csel09WC5yZWFkU3RydWN0KFEwKTtpZih6IT09MClyZXR1cm4gRyh6KTtsZXQgSz0kLnVwZGF0ZWRBdC5nZXRUaW1lKCktVy50cy5nZXRUaW1lKCksRj17ZWlkOiQuZWlkLG9mZjpLKzEsY3RyOiQuY3RyKzEsbGVuOjB9LFU9KGF3YWl0IHRoaXMuYXBwbHkoW3toZWFkOkYsYm9keTp2b2lkIDB9XSkpWzBdO2lmKFUhPT0wJiZVIT09MTUpcmV0dXJuIEcoVT8/MTIpO2lmKFo9PT12b2lkIDApcmV0dXJuIFIoRik7bGV0W08scV09VCQoe2lkOlcuaWQsdHM6WX0pO2lmKHEhPT0wKXJldHVybiBHKHEpO2xldFtJLEhdPWF3YWl0IHgkKHtub3c6WSxlaWQ6TyxjdHI6MCxib2Q6WixjcnlwdG86Vn0pO2lmKEghPT0wKXJldHVybiBHKEgpO2xldCBDPShhd2FpdCB0aGlzLmFwcGx5KFt7aGVhZDpJLGJvZHk6Wn1dKSlbMF07aWYoQyE9PTAmJkMhPT0xNSlyZXR1cm4gRyhDPz8xMik7cmV0dXJuIFIoSSl9YXN5bmMgdXBkYXRlUmF3KCQsWixKPXRoaXMuZm9yY2VTa2V3SGFuZGxpbmdCeURlZmF1bHQpe2lmKCQudXBkYXRlZEF0LmdldFRpbWUoKT50aGlzLmNsb2NrLm5vdygpLmdldFRpbWUoKSlyZXR1cm4gdGhpcy51cGRhdGVXaXRoU2tldygkLFosSik7cmV0dXJuIHRoaXMuZW5xdWV1ZUFwcGx5Sm9iKGFzeW5jKCk9PntsZXRbUSxWXT1hd2FpdCB0aGlzLm1ha2VVcGRhdGUoJCxaKTtpZihWIT09MClyZXR1cm4gRyhWKTtsZXQgWD0oYXdhaXQgdGhpcy5kb0FwcGx5KFtRXSkpWzBdO2lmKFghPT0wJiZYIT09MTUpcmV0dXJuIEcoWD8/MTIpO3JldHVybiBSKFEuaGVhZCl9KX1hc3luYyBpbnNlcnQoJCl7bGV0e2JvZHk6Wix0eXBlOkosZ2lkOlEscGlkOlYsdGFnczpZfT0kLFc9XzAoe2JvZHk6Wix0eXBlOkosZ2lkOlEscGlkOlYsdGFnczpZfSk7cmV0dXJuIHRoaXMuaW5zZXJ0UmF3KFcpfWFzeW5jIHVwZGF0ZSgkKXtsZXR7cHJpb3I6Wixib2R5OkosdHlwZTpRLGdpZDpWLHBpZDpZLHRhZ3M6WCxmb3JjZTpXfT0kLEs9XzAoe2JvZHk6Six0eXBlOlEsZ2lkOlYscGlkOlksdGFnczpYfSk7cmV0dXJuIHRoaXMudXBkYXRlUmF3KFosSyxXPz90aGlzLmZvcmNlU2tld0hhbmRsaW5nQnlEZWZhdWx0KX1hc3luYyBkZWxldGUoJCl7bGV0IFo9JC5mb3JjZT8/ITA7aWYoInByaW9yImluICQpcmV0dXJuIHRoaXMudXBkYXRlUmF3KCQucHJpb3Isdm9pZCAwLFopO2xldFtKLFFdPWF3YWl0IHRoaXMucmV2RnJvbUFyY2hpdmUoJC5laWQpO2lmKFEhPT0wKXJldHVybiBHKFEpO3JldHVybiB0aGlzLnVwZGF0ZVJhdyhKLHZvaWQgMCxaKX1hc3luYyByZXZGcm9tQXJjaGl2ZSgkKXtsZXQgWj1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxhc3QoJCk7aWYoWilyZXR1cm4gYkooWi5oZWFkKTtsZXQgSj1uZXcgZygkKSxbUSxWXT1KLnJlYWRTdHJ1Y3QoUTApO2lmKFYhPT0wKXJldHVybiBHKFYpO3JldHVybiBSKHtlaWQ6JCxjdHI6LTEsdXBkYXRlZEF0OlEudHN9KX1hc3luYyBnZW5FSUQoJCl7bGV0e2Nsb2NrOlosY3J5cHRvOkp9PXRoaXMsUT1aLm5vdygpO2lmKCQhPT12b2lkIDApcmV0dXJuIFQkKHtpZDokLHRzOlF9KTtsZXQgVj1hd2FpdCBKLmdlblJhbmRvbUJ5dGVzKDgpO3JldHVybiBUJCh7aWQ6Vix0czpRfSl9c3luYygpe3JldHVybiB0aGlzLnN5bmNSdW5zLnJ1bigoKT0+dGhpcy5kb1N5bmMoKSl9YXN5bmMgZG9TeW5jKCl7bGV0e2Nvbm5lY3Rpb25zOiQsY3J5cHRvOlosc3RvcmU6Sn09dGhpcyxRPWF3YWl0IEouc2VlZC5sb2FkKCk7aWYoIVEpcmV0dXJuIDIyO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7Zm9yKGxldFtWLFldb2YgJCl7bGV0IFg9YXdhaXQgSi5ob3N0cy5nZXQoVik7aWYoIVgpY29udGludWU7bGV0IFc9e2Nvbm46WSxzdG9yZTpKLGVuY2xhdmU6USxob3N0OlgsY3J5cHRvOlosbWF4UHVzaEJ5dGVzOnRoaXMubWF4UHVzaEJ5dGVzLG1heFB1bGxCeXRlczp0aGlzLm1heFB1bGxCeXRlcyxvblByb2dyZXNzOnRoaXMuZW1pdFByb2dyZXNzLHBlZWtQcm9ncmVzc0V2ZXJ5OnRoaXMucGVla1Byb2dyZXNzRXZlcnl9LHo9YXdhaXQgTFooVyk7aWYoeiE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwZWVrOiAke3p9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLHo7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBLPWF3YWl0IHJKKFcpO2lmKEshPT0wKXJldHVybiBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHVzaDogJHtLfWApLHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSxLO3RoaXMueGZlclN0YXRlLmVtaXQoKTtsZXQgRj1hd2FpdCB4WihXLGFzeW5jKCk9Pnthd2FpdCB0aGlzLmRyYWluQXBwbHlRdWV1ZSgpfSk7aWYoRiE9PTAmJkYhPT0xNSlyZXR1cm4gY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHB1bGw6ICR7Rn1gKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksRjt0aGlzLnhmZXJTdGF0ZS5lbWl0KCl9cmV0dXJuIHRoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaWRsZSJ9KSwwfWFzeW5jIHJlYnVpbGQoJCl7aWYodGhpcy5zY2hlZHVsZWRTeW5jLmNhbmNlbCgpLGF3YWl0IHRoaXMuc3luY1J1bnMuZmx1c2goKSwkPy5jaGVja0hvc3Q/PyEwKXtsZXQgSj1hd2FpdCB0aGlzLnJlcHVsbCgpO2lmKEohPT0wKXJldHVybiBKfXJldHVybiB0aGlzLmVucXVldWVBcHBseUpvYigoKT0+dGhpcy5yZXBsYXkoKSl9YXN5bmMgbXNnY2hlY2soKXtsZXQgJD1hd2FpdCB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3RLZXlzKCk7cmV0dXJuIHokKCQsdGhpcy5jcnlwdG8pfWxpc3RNc2dzKCQpe3JldHVybiB0aGlzLnN0b3JlLm1lc3NhZ2VzLmxpc3QoJCl9Y291bnRNc2dzKCQpe3JldHVybiB0aGlzLnN0b3JlLm1lc3NhZ2VzLmNvdW50KCQpfWFzeW5jIHJlY29uY2lsZSgkLFope3RoaXMuc2NoZWR1bGVkU3luYy5jYW5jZWwoKSxhd2FpdCB0aGlzLnN5bmNSdW5zLmZsdXNoKCk7bGV0e2Nvbm5lY3Rpb25zOkosY3J5cHRvOlEsc3RvcmU6Vn09dGhpcyxZPWF3YWl0IFYuc2VlZC5sb2FkKCk7aWYoIVkpcmV0dXJuIEcoMjIpO2xldCBYPWF3YWl0IFYuaG9zdHMuZ2V0KCQpO2lmKCFYKXJldHVybiBHKDEzKTtsZXQgVz1KLmdldCgkKTtpZighV3x8IVcuaXNDb25uZWN0ZWQoKSl7aWYoYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KFgsITEsITEpLFg9YXdhaXQgVi5ob3N0cy5nZXQoJCksIVgpcmV0dXJuIEcoMTMpO1c9Si5nZXQoJCl9aWYoIVcpcmV0dXJuIEcoMTIpO2xldCB6PXtjb25uOlcsc3RvcmU6VixlbmNsYXZlOlksY3J5cHRvOlEsbWF4UHVzaEJ5dGVzOnRoaXMubWF4UHVzaEJ5dGVzLG1heFB1bGxCeXRlczp0aGlzLm1heFB1bGxCeXRlcyxvblByb2dyZXNzOnRoaXMuZW1pdFByb2dyZXNzLHBlZWtQcm9ncmVzc0V2ZXJ5OnRoaXMucGVla1Byb2dyZXNzRXZlcnl9LFtLLEZdPWF3YWl0IGZaKHsuLi56LGhvc3Q6WH0sWik7aWYodGhpcy54ZmVyU3RhdGUuZW1pdCgpLEYhPT0wKXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksRyhGKTtpZighSylyZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLEcoMTIpO2lmKFo/LnN5bmM9PT0hMSlyZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLFIoSyk7bGV0IE49YXdhaXQgdGhpcy5zeW5jKCk7aWYoTiE9PTApcmV0dXJuIEcoTik7bGV0IFU9YXdhaXQgVi5ob3N0cy5nZXQoJCk7aWYoIVUpcmV0dXJuIEcoMTMpO2xldFtPLHFdPWF3YWl0IGZaKHsuLi56LGhvc3Q6VX0se3B1bGw6ITEscHVzaDohMX0pO2lmKHRoaXMueGZlclN0YXRlLmVtaXQoKSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSkscSE9PTApcmV0dXJuIEcocSk7aWYoIU8pcmV0dXJuIEcoMTIpO3JldHVybiBSKE8pfWFzeW5jIHJlcHVsbCgpe2xldHtjb25uZWN0aW9uczokLGNyeXB0bzpaLHN0b3JlOkp9PXRoaXMsUT1hd2FpdCBKLnNlZWQubG9hZCgpO2lmKCFRKXJldHVybiAyMjtsZXQgVj1BcnJheS5mcm9tKGF3YWl0IEouaG9zdHMubGlzdCgpKTtpZihWLmxlbmd0aDwxKXJldHVybiAwO2ZvcihsZXQgWSBvZiBWKXtsZXQgWD0kLmdldChZLmxhYmVsKTtpZighWHx8IVguaXNDb25uZWN0ZWQoKSlhd2FpdCB0aGlzLmNvbm5lY3RUb0hvc3QoWSwhMSwhMSl9Zm9yKGxldFtZLFhdb2YgJCl7bGV0IFc9YXdhaXQgSi5ob3N0cy5nZXQoWSk7aWYoIVcpY29udGludWU7bGV0IHo9e2Nvbm46WCxzdG9yZTpKLGVuY2xhdmU6USxob3N0OnsuLi5XLGxhc3RTZXE6MH0sY3J5cHRvOlosbWF4UHVzaEJ5dGVzOnRoaXMubWF4UHVzaEJ5dGVzLG1heFB1bGxCeXRlczp0aGlzLm1heFB1bGxCeXRlcyxvblByb2dyZXNzOnRoaXMuZW1pdFByb2dyZXNzLHBlZWtQcm9ncmVzc0V2ZXJ5OnRoaXMucGVla1Byb2dyZXNzRXZlcnl9LEs9YXdhaXQgTFooeik7aWYoSyE9PTApcmV0dXJuIGNvbnNvbGUuZXJyb3IoYHJlYnVpbGQ6IGZhaWxlZCB0byBwZWVrOiAke0t9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLEs7dGhpcy54ZmVyU3RhdGUuZW1pdCgpO2xldCBGPWF3YWl0IHhaKHopO2lmKEYhPT0wJiZGIT09MTUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoYHJlYnVpbGQ6IGZhaWxlZCB0byBwdWxsOiAke0Z9YCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLEY7dGhpcy54ZmVyU3RhdGUuZW1pdCgpfXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMH1hc3luYyByZXBsYXkoKXtsZXQgJD1hd2FpdCB0aGlzLnN0YXRlLmNsZWFyKCk7aWYoJCE9PTApcmV0dXJuICQ7bGV0IFo9YXdhaXQgdGhpcy5zdG9yZS5tZXNzYWdlcy5saXN0KCksSj1vMChaLChZKT0+WS5oZWFkKSxRPUoubGVuZ3RoO2lmKFE8MSlyZXR1cm4gdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDA7bGV0IFY9MDt3aGlsZShWPEoubGVuZ3RoKXtsZXQgWT0wLFg9MCxXPVY7Zm9yKGxldCBLPVY7SzxKLmxlbmd0aCYmWDwxMDAmJlk8MTAyNDAwO0srKylZKz1KW0tdLmhlYWQubGVuLFgrKyxXPUsrMTtsZXQgej1KLnNsaWNlKFYsVyk7YXdhaXQgdGhpcy5hcHBseVN0b3JlZCh6KSx0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImV4ZWMiLGRvbmU6Vyx0b3RhbDpRfSksVj1XfXJldHVybiB0aGlzLmVtaXRQcm9ncmVzcyh7cGhhc2U6ImlkbGUifSksMH1hc3luYyB3aXBlKCQpe2xldCBaPSQ/Lm1zZ3MhPT0hMSxKPSQ/LmVudHMhPT0hMSxRPSQ/Lm1ldGEhPT0hMSxWPSQ/LnNlZWQ9PT0hMDt0aGlzLnNjaGVkdWxlZFN5bmMuY2FuY2VsKCksYXdhaXQgdGhpcy5kaXNjb25uZWN0KCksYXdhaXQgdGhpcy5zeW5jUnVucy5mbHVzaCgpO2xldHtzdG9yZTpZfT10aGlzO2lmKFEpYXdhaXQgWS5ob3N0cy53aXBlKCksYXdhaXQgWS51cGxvYWRzLndpcGUoKSxhd2FpdCBZLmRvd25sb2Fkcy53aXBlKCk7aWYoWilhd2FpdCBZLm1lc3NhZ2VzLndpcGUoKTtpZihWKWF3YWl0IFkuc2VlZC53aXBlKCk7aWYoSilhd2FpdCB0aGlzLnN0YXRlLmNsZWFyKCk7dGhpcy5sYXN0UHJvZ3Jlc3M9d1osdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCksdGhpcy54ZmVyU3RhdGUuZW1pdCgpfWltcG9ydD1hc3luYygkLFopPT57bGV0e2NyeXB0bzpKLHN0b3JlOlF9PXRoaXMsVj1aPy5vblByb2dyZXNzLFk9YXdhaXQgUS5zZWVkLmxvYWQoKTtpZighWSlyZXR1cm4gMjI7Y29uc29sZS50aW1lKCJpbXBvcnQ6IGRlY29kaW5nIGZpbGUuLi4iKTtsZXQgWD1hd2FpdCAkLmJ5dGVzKCksW1csel09YXdhaXQgeEooWCxKLFkpO2lmKHohPT0wKXJldHVybiB6O2NvbnNvbGUudGltZUVuZCgiaW1wb3J0OiBkZWNvZGluZyBmaWxlLi4uIik7bGV0IEs9MDt3aGlsZShLPFcubGVuZ3RoKXtsZXQgRj0wLE49MCxVPUs7Zm9yKGxldCBJPUs7STxXLmxlbmd0aCYmTjwxMDAmJkY8MTAyNDAwO0krKylGKz1XW0ldLmhlYWQubGVuLE4rKyxVPUkrMTtsZXQgTz1XLnNsaWNlKEssVSk7Y29uc29sZS50aW1lKGBpbXBvcnQ6IGFwcGx5aW5nIFske0t9LCAke1V9XWApO2xldCBxPWF3YWl0IHRoaXMuYXBwbHkoTyx7ZW5xdWV1ZVVwbG9hZDohMCx0cmlnZ2VyVXBsb2FkOiExfSk7Y29uc29sZS50aW1lRW5kKGBpbXBvcnQ6IGFwcGx5aW5nIFske0t9LCAke1V9XWApO2ZvcihsZXQgST0wO0k8Ty5sZW5ndGg7SSsrKXtsZXQgSD1xW0ldO2lmKEghPT0wJiZIIT09MTUpY29uc29sZS53YXJuKGBmYWlsZWQgdG8gaW1wb3J0IG1zZyAke0srSX06ICR7altIXX1gKX1pZihWKXF1ZXVlTWljcm90YXNrKCgpPT5WKFUsVy5sZW5ndGgsMCkpO3RoaXMuZW1pdFByb2dyZXNzKHtwaGFzZToiaW1wb3J0Iixkb25lOlUsdG90YWw6Vy5sZW5ndGh9KSxLPVV9cmV0dXJuIHRoaXMuc2NoZWR1bGVTeW5jKCksdGhpcy5lbWl0UHJvZ3Jlc3Moe3BoYXNlOiJpZGxlIn0pLDB9O3NjaGVkdWxlU3luYz0oKT0+e2lmKHRoaXMub25TY2hlZHVsZVN5bmMpe3RoaXMub25TY2hlZHVsZVN5bmMoKTtyZXR1cm59dGhpcy5zY2hlZHVsZWRTeW5jLnNjaGVkdWxlKCl9O2FzeW5jIGV4cG9ydEJ5dGVzKCl7bGV0e2NyeXB0bzokLHN0b3JlOlp9PXRoaXMsSj1hd2FpdCBaLnNlZWQubG9hZCgpO2lmKCFKKXJldHVybiBHKDIyKTtsZXQgUT1hd2FpdCBaLm1lc3NhZ2VzLmxpc3QoKTtyZXR1cm4gTEooImV4cG9ydCIsMCxRLCQsSil9YXN5bmMgZXhwb3J0KCQpe2xldFtaLEpdPWF3YWl0IHRoaXMuZXhwb3J0Qnl0ZXMoKTtpZihKIT09MClyZXR1cm4gSjtpZighWilyZXR1cm4gMTI7bGV0IFE9bmV3IEJsb2IoW1ouc2xpY2UoKV0pO3JldHVybiBoSihRLCQpLDB9YXN5bmMgbGluaygkLFo9ITApe2lmKGF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuYWRkKCQpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLFope2xldCBKPWF3YWl0IHRoaXMuc3RvcmUuaG9zdHMuZ2V0KCQubGFiZWwpO2lmKEopYXdhaXQgdGhpcy5jb25uZWN0VG9Ib3N0KEopfX1hc3luYyB1bmxpbmsoJCl7YXdhaXQgdGhpcy5zdG9yZS5ob3N0cy5kZWwoJCksdGhpcy5jbGllbnRTdGF0ZS5lbWl0KCl9YXN5bmMgaG9zdHMoKXtyZXR1cm4gQXJyYXkuZnJvbShhd2FpdCB0aGlzLnN0b3JlLmhvc3RzLmxpc3QoKSl9Y29ubmVjdFRvSG9zdD1hc3luYygkLFo9ITAsSj0hMCk9PntsZXR7Y2xvY2s6USxjb25uZWN0aW9uczpWLGNyeXB0bzpZLHN0b3JlOlgsdHJhbnNwb3J0Old9PXRoaXMsej1WLmdldCgkLmxhYmVsKTtpZih6KXtpZih6LmlzQ29ubmVjdGVkKCkpcmV0dXJuO3RyeXt6LmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9Vi5kZWxldGUoJC5sYWJlbCl9bGV0IEs9YXdhaXQgWC5zZWVkLmxvYWQoKTtpZighSylyZXR1cm47Y29uc29sZS5pbmZvKGBDb25uZWN0aW5nIHRvICR7JC5oYW5kbGV9ICgkeyQubGFiZWx9KWApO2xldCBGPW5ldyBMJChLLFksJCxRLFcoJCksKE4pPT5YLmhvc3RzLnNldCgkLmxhYmVsLE4pKTtpZihhd2FpdCBGLnJlZ2lzdGVyKCksWilhd2FpdCBGLmxpc3Rlbihhc3luYyhOKT0+e2xldCBVPXtjb25uOkYsc3RvcmU6WCxlbmNsYXZlOkssaG9zdDokLGNyeXB0bzpZLG1heFB1c2hCeXRlczp0aGlzLm1heFB1c2hCeXRlcyxtYXhQdWxsQnl0ZXM6dGhpcy5tYXhQdWxsQnl0ZXMsb25Qcm9ncmVzczp0aGlzLmVtaXRQcm9ncmVzcyxwZWVrUHJvZ3Jlc3NFdmVyeTp0aGlzLnBlZWtQcm9ncmVzc0V2ZXJ5fTtyZXR1cm4gYUooTixVLHRoaXMuc2NoZWR1bGVTeW5jKX0sKCk9PnRoaXMuY2xpZW50U3RhdGUuZW1pdCgpLCgpPT50aGlzLmNsaWVudFN0YXRlLmVtaXQoKSk7aWYoVi5zZXQoJC5sYWJlbCxGKSx0aGlzLmNsaWVudFN0YXRlLmVtaXQoKSxKKXRoaXMuc2NoZWR1bGVTeW5jKCl9O2FzeW5jIGNvbm5lY3QoJD0hMCxaPSEwKXtsZXR7Y29ubmVjdFRvSG9zdDpKLHNjaGVkdWxlU3luYzpRLHN0b3JlOlZ9PXRoaXM7aWYoIWF3YWl0IFYuc2VlZC5sb2FkKCkpcmV0dXJuO2F3YWl0IHRoaXMuZHJhaW5BcHBseVF1ZXVlKCk7bGV0IFg9YXdhaXQgVi5ob3N0cy5saXN0KCk7Zm9yKGxldCBXIG9mIFgpYXdhaXQgSihXLCQsITEpO2lmKFopUSgpfWRpc2Nvbm5lY3Q9YXN5bmMoKT0+e2ZvcihsZXQgJCBvZiB0aGlzLmNvbm5lY3Rpb25zLnZhbHVlcygpKXRyeXskLmNsb3NlTGlzdGVuZXIoKX1jYXRjaHt9dGhpcy5jb25uZWN0aW9ucy5jbGVhcigpLHRoaXMuY2xpZW50U3RhdGUuZW1pdCgpfX12YXIgeDA9dHlwZW9mIGdsb2JhbFRoaXM9PT0ib2JqZWN0IiYmImNyeXB0byJpbiBnbG9iYWxUaGlzP2dsb2JhbFRoaXMuY3J5cHRvOnZvaWQgMDtmdW5jdGlvbiBiJCgkKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoJCl8fCQ8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrJCl9ZnVuY3Rpb24gQlooJCl7cmV0dXJuICQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoJCkmJiQuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBkKCQsLi4uWil7aWYoIUJaKCQpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIik7aWYoWi5sZW5ndGg+MCYmIVouaW5jbHVkZXMoJC5sZW5ndGgpKXRocm93IEVycm9yKCJVaW50OEFycmF5IGV4cGVjdGVkIG9mIGxlbmd0aCAiK1orIiwgZ290IGxlbmd0aD0iKyQubGVuZ3RoKX1mdW5jdGlvbiBFWigkLFo9ITApe2lmKCQuZGVzdHJveWVkKXRocm93IEVycm9yKCJIYXNoIGluc3RhbmNlIGhhcyBiZWVuIGRlc3Ryb3llZCIpO2lmKFomJiQuZmluaXNoZWQpdGhyb3cgRXJyb3IoIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKX1mdW5jdGlvbiBzSigkLFope2QoJCk7bGV0IEo9Wi5vdXRwdXRMZW47aWYoJC5sZW5ndGg8Sil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIitKKX1mdW5jdGlvbiBtWigkKXtpZih0eXBlb2YgJCE9PSJib29sZWFuIil0aHJvdyBFcnJvcihgYm9vbGVhbiBleHBlY3RlZCwgbm90ICR7JH1gKX0vKiEgbm9ibGUtY2lwaGVycyAtIE1JVCBMaWNlbnNlIChjKSAyMDIzIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL3ZhciBJMD0oJCk9Pm5ldyBVaW50MzJBcnJheSgkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcigkLmJ5dGVMZW5ndGgvNCkpO3ZhciBUVj1uZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoWzI4NzQ1NDAyMF0pLmJ1ZmZlcilbMF09PT02ODtpZighVFYpdGhyb3cgRXJyb3IoIk5vbiBsaXR0bGUtZW5kaWFuIGhhcmR3YXJlIGlzIG5vdCBzdXBwb3J0ZWQiKTtmdW5jdGlvbiBEVigkKXtpZih0eXBlb2YgJCE9PSJzdHJpbmciKXRocm93IEVycm9yKCJzdHJpbmcgZXhwZWN0ZWQiKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCQpKX1mdW5jdGlvbiB5JCgkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKSQ9RFYoJCk7ZWxzZSBpZihCWigkKSkkPWkkKCQpO2Vsc2UgdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQsIGdvdCAiK3R5cGVvZiAkKTtyZXR1cm4gJH1mdW5jdGlvbiB0SigkLFope2lmKFo9PW51bGx8fHR5cGVvZiBaIT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBkZWZpbmVkIik7cmV0dXJuIE9iamVjdC5hc3NpZ24oJCxaKX1mdW5jdGlvbiBlSigkLFope2lmKCQubGVuZ3RoIT09Wi5sZW5ndGgpcmV0dXJuITE7bGV0IEo9MDtmb3IobGV0IFE9MDtRPCQubGVuZ3RoO1ErKylKfD0kW1FdXlpbUV07cmV0dXJuIEo9PT0wfXZhciAkUT0oJCxaKT0+e2Z1bmN0aW9uIEooUSwuLi5WKXtpZihkKFEpLCQubm9uY2VMZW5ndGghPT12b2lkIDApe2xldCBGPVZbMF07aWYoIUYpdGhyb3cgRXJyb3IoIm5vbmNlIC8gaXYgcmVxdWlyZWQiKTtpZigkLnZhclNpemVOb25jZSlkKEYpO2Vsc2UgZChGLCQubm9uY2VMZW5ndGgpfWxldCBZPSQudGFnTGVuZ3RoO2lmKFkmJlZbMV0hPT12b2lkIDApZChWWzFdKTtsZXQgWD1aKFEsLi4uViksVz0oRixOKT0+e2lmKE4hPT12b2lkIDApe2lmKEYhPT0yKXRocm93IEVycm9yKCJjaXBoZXIgb3V0cHV0IG5vdCBzdXBwb3J0ZWQiKTtkKE4pfX0sej0hMTtyZXR1cm57ZW5jcnlwdChGLE4pe2lmKHopdGhyb3cgRXJyb3IoImNhbm5vdCBlbmNyeXB0KCkgdHdpY2Ugd2l0aCBzYW1lIGtleSArIG5vbmNlIik7cmV0dXJuIHo9ITAsZChGKSxXKFguZW5jcnlwdC5sZW5ndGgsTiksWC5lbmNyeXB0KEYsTil9LGRlY3J5cHQoRixOKXtpZihkKEYpLFkmJkYubGVuZ3RoPFkpdGhyb3cgRXJyb3IoImludmFsaWQgY2lwaGVydGV4dCBsZW5ndGg6IHNtYWxsZXIgdGhhbiB0YWdMZW5ndGg9IitZKTtyZXR1cm4gVyhYLmRlY3J5cHQubGVuZ3RoLE4pLFguZGVjcnlwdChGLE4pfX19cmV0dXJuIE9iamVjdC5hc3NpZ24oSiwkKSxKfTtmdW5jdGlvbiBnWigkLFosSj0hMCl7aWYoWj09PXZvaWQgMClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoJCk7aWYoWi5sZW5ndGghPT0kKXRocm93IEVycm9yKCJpbnZhbGlkIG91dHB1dCBsZW5ndGgsIGV4cGVjdGVkICIrJCsiLCBnb3Q6ICIrWi5sZW5ndGgpO2lmKEomJiFqVihaKSl0aHJvdyBFcnJvcigiaW52YWxpZCBvdXRwdXQsIG11c3QgYmUgYWxpZ25lZCIpO3JldHVybiBafWZ1bmN0aW9uIGpWKCQpe3JldHVybiAkLmJ5dGVPZmZzZXQlND09PTB9ZnVuY3Rpb24gaSQoJCl7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSgkKX1mdW5jdGlvbiBVMCguLi4kKXtmb3IobGV0IFo9MDtaPCQubGVuZ3RoO1orKykkW1pdLmZpbGwoMCl9ZnVuY3Rpb24gaCQoJD0zMil7aWYoeDAmJnR5cGVvZiB4MC5nZXRSYW5kb21WYWx1ZXM9PT0iZnVuY3Rpb24iKXJldHVybiB4MC5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoJCkpO2lmKHgwJiZ0eXBlb2YgeDAucmFuZG9tQnl0ZXM9PT0iZnVuY3Rpb24iKXJldHVybiB4MC5yYW5kb21CeXRlcygkKTt0aHJvdyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWQiKX12YXIgSlE9KCQpPT5VaW50OEFycmF5LmZyb20oJC5zcGxpdCgiIikubWFwKChaKT0+Wi5jaGFyQ29kZUF0KDApKSksQVY9SlEoImV4cGFuZCAxNi1ieXRlIGsiKSxfVj1KUSgiZXhwYW5kIDMyLWJ5dGUgayIpLExWPUkwKEFWKSx4Vj1JMChfVik7ZnVuY3Rpb24gRCgkLFope3JldHVybiAkPDxafCQ+Pj4zMi1afWZ1bmN0aW9uIFNaKCQpe3JldHVybiAkLmJ5dGVPZmZzZXQlND09PTB9dmFyIHUkPTY0LGZWPTE2LFFRPTQyOTQ5NjcyOTUsWlE9bmV3IFVpbnQzMkFycmF5O2Z1bmN0aW9uIGtWKCQsWixKLFEsVixZLFgsVyl7bGV0IHo9Vi5sZW5ndGgsSz1uZXcgVWludDhBcnJheSh1JCksRj1JMChLKSxOPVNaKFYpJiZTWihZKSxVPU4/STAoVik6WlEsTz1OP0kwKFkpOlpRO2ZvcihsZXQgcT0wO3E8ejtYKyspe2lmKCQoWixKLFEsRixYLFcpLFg+PVFRKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtsZXQgST1NYXRoLm1pbih1JCx6LXEpO2lmKE4mJkk9PT11JCl7bGV0IEg9cS80O2lmKHElNCE9PTApdGhyb3cgRXJyb3IoImFyeDogaW52YWxpZCBibG9jayBwb3NpdGlvbiIpO2ZvcihsZXQgUD0wLEM7UDxmVjtQKyspQz1IK1AsT1tDXT1VW0NdXkZbUF07cSs9dSQ7Y29udGludWV9Zm9yKGxldCBIPTAsUDtIPEk7SCsrKVA9cStILFlbUF09VltQXV5LW0hdO3ErPUl9fWZ1bmN0aW9uIFZRKCQsWil7bGV0e2FsbG93U2hvcnRLZXlzOkosZXh0ZW5kTm9uY2VGbjpRLGNvdW50ZXJMZW5ndGg6Vixjb3VudGVyUmlnaHQ6WSxyb3VuZHM6WH09dEooe2FsbG93U2hvcnRLZXlzOiExLGNvdW50ZXJMZW5ndGg6OCxjb3VudGVyUmlnaHQ6ITEscm91bmRzOjIwfSxaKTtpZih0eXBlb2YgJCE9PSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoImNvcmUgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIGIkKFYpLGIkKFgpLG1aKFkpLG1aKEopLChXLHosSyxGLE49MCk9PntkKFcpLGQoeiksZChLKTtsZXQgVT1LLmxlbmd0aDtpZihGPT09dm9pZCAwKUY9bmV3IFVpbnQ4QXJyYXkoVSk7aWYoZChGKSxiJChOKSxOPDB8fE4+PVFRKXRocm93IEVycm9yKCJhcng6IGNvdW50ZXIgb3ZlcmZsb3ciKTtpZihGLmxlbmd0aDxVKXRocm93IEVycm9yKGBhcng6IG91dHB1dCAoJHtGLmxlbmd0aH0pIGlzIHNob3J0ZXIgdGhhbiBkYXRhICgke1V9KWApO2xldCBPPVtdLHE9Vy5sZW5ndGgsSSxIO2lmKHE9PT0zMilPLnB1c2goST1pJChXKSksSD14VjtlbHNlIGlmKHE9PT0xNiYmSilJPW5ldyBVaW50OEFycmF5KDMyKSxJLnNldChXKSxJLnNldChXLDE2KSxIPUxWLE8ucHVzaChJKTtlbHNlIHRocm93IEVycm9yKGBhcng6IGludmFsaWQgMzItYnl0ZSBrZXksIGdvdCBsZW5ndGg9JHtxfWApO2lmKCFTWih6KSlPLnB1c2goej1pJCh6KSk7bGV0IFA9STAoSSk7aWYoUSl7aWYoei5sZW5ndGghPT0yNCl0aHJvdyBFcnJvcigiYXJ4OiBleHRlbmRlZCBub25jZSBtdXN0IGJlIDI0IGJ5dGVzIik7UShILFAsSTAoei5zdWJhcnJheSgwLDE2KSksUCksej16LnN1YmFycmF5KDE2KX1sZXQgQz0xNi1WO2lmKEMhPT16Lmxlbmd0aCl0aHJvdyBFcnJvcihgYXJ4OiBub25jZSBtdXN0IGJlICR7Q30gb3IgMTYgYnl0ZXNgKTtpZihDIT09MTIpe2xldCBNPW5ldyBVaW50OEFycmF5KDEyKTtNLnNldCh6LFk/MDoxMi16Lmxlbmd0aCksej1NLE8ucHVzaCh6KX1sZXQgVD1JMCh6KTtyZXR1cm4ga1YoJCxILFAsVCxLLEYsTixYKSxVMCguLi5PKSxGfX12YXIgbz0oJCxaKT0+JFtaKytdJjI1NXwoJFtaKytdJjI1NSk8PDg7Y2xhc3MgWVF7Y29uc3RydWN0b3IoJCl7dGhpcy5ibG9ja0xlbj0xNix0aGlzLm91dHB1dExlbj0xNix0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxNiksdGhpcy5yPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5oPW5ldyBVaW50MTZBcnJheSgxMCksdGhpcy5wYWQ9bmV3IFVpbnQxNkFycmF5KDgpLHRoaXMucG9zPTAsdGhpcy5maW5pc2hlZD0hMSwkPXkkKCQpLGQoJCwzMik7bGV0IFo9bygkLDApLEo9bygkLDIpLFE9bygkLDQpLFY9bygkLDYpLFk9bygkLDgpLFg9bygkLDEwKSxXPW8oJCwxMiksej1vKCQsMTQpO3RoaXMuclswXT1aJjgxOTEsdGhpcy5yWzFdPShaPj4+MTN8Sjw8MykmODE5MSx0aGlzLnJbMl09KEo+Pj4xMHxRPDw2KSY3OTM5LHRoaXMuclszXT0oUT4+Pjd8Vjw8OSkmODE5MSx0aGlzLnJbNF09KFY+Pj40fFk8PDEyKSYyNTUsdGhpcy5yWzVdPVk+Pj4xJjgxOTAsdGhpcy5yWzZdPShZPj4+MTR8WDw8MikmODE5MSx0aGlzLnJbN109KFg+Pj4xMXxXPDw1KSY4MDY1LHRoaXMucls4XT0oVz4+Pjh8ejw8OCkmODE5MSx0aGlzLnJbOV09ej4+PjUmMTI3O2ZvcihsZXQgSz0wO0s8ODtLKyspdGhpcy5wYWRbS109bygkLDE2KzIqSyl9cHJvY2VzcygkLFosSj0hMSl7bGV0IFE9Sj8wOjIwNDgse2g6VixyOll9PXRoaXMsWD1ZWzBdLFc9WVsxXSx6PVlbMl0sSz1ZWzNdLEY9WVs0XSxOPVlbNV0sVT1ZWzZdLE89WVs3XSxxPVlbOF0sST1ZWzldLEg9bygkLForMCksUD1vKCQsWisyKSxDPW8oJCxaKzQpLFQ9bygkLForNiksTT1vKCQsWis4KSxBPW8oJCxaKzEwKSx4PW8oJCxaKzEyKSxtPW8oJCxaKzE0KSxFPVZbMF0rKEgmODE5MSksaz1WWzFdKygoSD4+PjEzfFA8PDMpJjgxOTEpLGI9VlsyXSsoKFA+Pj4xMHxDPDw2KSY4MTkxKSx3PVZbM10rKChDPj4+N3xUPDw5KSY4MTkxKSxoPVZbNF0rKChUPj4+NHxNPDwxMikmODE5MSksbD1WWzVdKyhNPj4+MSY4MTkxKSxMPVZbNl0rKChNPj4+MTR8QTw8MikmODE5MSksdj1WWzddKygoQT4+PjExfHg8PDUpJjgxOTEpLEI9Vls4XSsoKHg+Pj44fG08PDgpJjgxOTEpLHk9Vls5XSsobT4+PjV8USksXz0wLGM9XytFKlgrayooNSpJKStiKig1KnEpK3cqKDUqTykraCooNSpVKTtfPWM+Pj4xMyxjJj04MTkxLGMrPWwqKDUqTikrTCooNSpGKSt2Kig1KkspK0IqKDUqeikreSooNSpXKSxfKz1jPj4+MTMsYyY9ODE5MTtsZXQgYT1fK0UqVytrKlgrYiooNSpJKSt3Kig1KnEpK2gqKDUqTyk7Xz1hPj4+MTMsYSY9ODE5MSxhKz1sKig1KlUpK0wqKDUqTikrdiooNSpGKStCKig1KkspK3kqKDUqeiksXys9YT4+PjEzLGEmPTgxOTE7bGV0IEowPV8rRSp6K2sqVytiKlgrdyooNSpJKStoKig1KnEpO189SjA+Pj4xMyxKMCY9ODE5MSxKMCs9bCooNSpPKStMKig1KlUpK3YqKDUqTikrQiooNSpGKSt5Kig1KkspLF8rPUowPj4+MTMsSjAmPTgxOTE7bGV0IHA9XytFKksrayp6K2IqVyt3KlgraCooNSpJKTtfPXA+Pj4xMyxwJj04MTkxLHArPWwqKDUqcSkrTCooNSpPKSt2Kig1KlUpK0IqKDUqTikreSooNSpGKSxfKz1wPj4+MTMscCY9ODE5MTtsZXQgcTA9XytFKkYraypLK2Iqeit3KlcraCpYO189cTA+Pj4xMyxxMCY9ODE5MSxxMCs9bCooNSpJKStMKig1KnEpK3YqKDUqTykrQiooNSpVKSt5Kig1Kk4pLF8rPXEwPj4+MTMscTAmPTgxOTE7bGV0IHYwPV8rRSpOK2sqRitiKksrdyp6K2gqVztfPXYwPj4+MTMsdjAmPTgxOTEsdjArPWwqWCtMKig1KkkpK3YqKDUqcSkrQiooNSpPKSt5Kig1KlUpLF8rPXYwPj4+MTMsdjAmPTgxOTE7bGV0IGIwPV8rRSpVK2sqTitiKkYrdypLK2gqejtfPWIwPj4+MTMsYjAmPTgxOTEsYjArPWwqVytMKlgrdiooNSpJKStCKig1KnEpK3kqKDUqTyksXys9YjA+Pj4xMyxiMCY9ODE5MTtsZXQgeTA9XytFKk8raypVK2IqTit3KkYraCpLO189eTA+Pj4xMyx5MCY9ODE5MSx5MCs9bCp6K0wqVyt2KlgrQiooNSpJKSt5Kig1KnEpLF8rPXkwPj4+MTMseTAmPTgxOTE7bGV0IGkwPV8rRSpxK2sqTytiKlUrdypOK2gqRjtfPWkwPj4+MTMsaTAmPTgxOTEsaTArPWwqSytMKnordipXK0IqWCt5Kig1KkkpLF8rPWkwPj4+MTMsaTAmPTgxOTE7bGV0IGgwPV8rRSpJK2sqcStiKk8rdypVK2gqTjtfPWgwPj4+MTMsaDAmPTgxOTEsaDArPWwqRitMKksrdip6K0IqVyt5KlgsXys9aDA+Pj4xMyxoMCY9ODE5MSxfPShfPDwyKStffDAsXz1fK2N8MCxjPV8mODE5MSxfPV8+Pj4xMyxhKz1fLFZbMF09YyxWWzFdPWEsVlsyXT1KMCxWWzNdPXAsVls0XT1xMCxWWzVdPXYwLFZbNl09YjAsVls3XT15MCxWWzhdPWkwLFZbOV09aDB9ZmluYWxpemUoKXtsZXR7aDokLHBhZDpafT10aGlzLEo9bmV3IFVpbnQxNkFycmF5KDEwKSxRPSRbMV0+Pj4xMzskWzFdJj04MTkxO2ZvcihsZXQgWD0yO1g8MTA7WCsrKSRbWF0rPVEsUT0kW1hdPj4+MTMsJFtYXSY9ODE5MTskWzBdKz1RKjUsUT0kWzBdPj4+MTMsJFswXSY9ODE5MSwkWzFdKz1RLFE9JFsxXT4+PjEzLCRbMV0mPTgxOTEsJFsyXSs9USxKWzBdPSRbMF0rNSxRPUpbMF0+Pj4xMyxKWzBdJj04MTkxO2ZvcihsZXQgWD0xO1g8MTA7WCsrKUpbWF09JFtYXStRLFE9SltYXT4+PjEzLEpbWF0mPTgxOTE7Sls5XS09ODE5MjtsZXQgVj0oUV4xKS0xO2ZvcihsZXQgWD0wO1g8MTA7WCsrKUpbWF0mPVY7Vj1+Vjtmb3IobGV0IFg9MDtYPDEwO1grKykkW1hdPSRbWF0mVnxKW1hdOyRbMF09KCRbMF18JFsxXTw8MTMpJjY1NTM1LCRbMV09KCRbMV0+Pj4zfCRbMl08PDEwKSY2NTUzNSwkWzJdPSgkWzJdPj4+NnwkWzNdPDw3KSY2NTUzNSwkWzNdPSgkWzNdPj4+OXwkWzRdPDw0KSY2NTUzNSwkWzRdPSgkWzRdPj4+MTJ8JFs1XTw8MXwkWzZdPDwxNCkmNjU1MzUsJFs1XT0oJFs2XT4+PjJ8JFs3XTw8MTEpJjY1NTM1LCRbNl09KCRbN10+Pj41fCRbOF08PDgpJjY1NTM1LCRbN109KCRbOF0+Pj44fCRbOV08PDUpJjY1NTM1O2xldCBZPSRbMF0rWlswXTskWzBdPVkmNjU1MzU7Zm9yKGxldCBYPTE7WDw4O1grKylZPSgkW1hdK1pbWF18MCkrKFk+Pj4xNil8MCwkW1hdPVkmNjU1MzU7VTAoSil9dXBkYXRlKCQpe0VaKHRoaXMpO2xldHtidWZmZXI6WixibG9ja0xlbjpKfT10aGlzOyQ9eSQoJCk7bGV0IFE9JC5sZW5ndGg7Zm9yKGxldCBWPTA7VjxROyl7bGV0IFk9TWF0aC5taW4oSi10aGlzLnBvcyxRLVYpO2lmKFk9PT1KKXtmb3IoO0o8PVEtVjtWKz1KKXRoaXMucHJvY2VzcygkLFYpO2NvbnRpbnVlfWlmKFouc2V0KCQuc3ViYXJyYXkoVixWK1kpLHRoaXMucG9zKSx0aGlzLnBvcys9WSxWKz1ZLHRoaXMucG9zPT09Sil0aGlzLnByb2Nlc3MoWiwwLCExKSx0aGlzLnBvcz0wfXJldHVybiB0aGlzfWRlc3Ryb3koKXtVMCh0aGlzLmgsdGhpcy5yLHRoaXMuYnVmZmVyLHRoaXMucGFkKX1kaWdlc3RJbnRvKCQpe0VaKHRoaXMpLHNKKCQsdGhpcyksdGhpcy5maW5pc2hlZD0hMDtsZXR7YnVmZmVyOlosaDpKfT10aGlzLHtwb3M6UX09dGhpcztpZihRKXtaW1ErK109MTtmb3IoO1E8MTY7USsrKVpbUV09MDt0aGlzLnByb2Nlc3MoWiwwLCEwKX10aGlzLmZpbmFsaXplKCk7bGV0IFY9MDtmb3IobGV0IFk9MDtZPDg7WSsrKSRbVisrXT1KW1ldPj4+MCwkW1YrK109SltZXT4+Pjg7cmV0dXJuICR9ZGlnZXN0KCl7bGV0e2J1ZmZlcjokLG91dHB1dExlbjpafT10aGlzO3RoaXMuZGlnZXN0SW50bygkKTtsZXQgSj0kLnNsaWNlKDAsWik7cmV0dXJuIHRoaXMuZGVzdHJveSgpLEp9fWZ1bmN0aW9uIEJWKCQpe2xldCBaPShRLFYpPT4kKFYpLnVwZGF0ZSh5JChRKSkuZGlnZXN0KCksSj0kKG5ldyBVaW50OEFycmF5KDMyKSk7cmV0dXJuIFoub3V0cHV0TGVuPUoub3V0cHV0TGVuLFouYmxvY2tMZW49Si5ibG9ja0xlbixaLmNyZWF0ZT0oUSk9PiQoUSksWn12YXIgdlo9QlYoKCQpPT5uZXcgWVEoJCkpO2Z1bmN0aW9uIEVWKCQsWixKLFEsVixZPTIwKXtsZXQgWD0kWzBdLFc9WlswXSx6PVpbMV0sSz1aWzJdLEY9WlszXSxOPSRbMV0sVT1KWzBdLE89SlsxXSxxPVYsST0wLEg9JFsyXSxQPVpbNF0sQz1aWzVdLFQ9Wls2XSxNPVpbN10sQT0kWzNdLHg9WCxtPVcsRT16LGs9SyxiPUYsdz1OLGg9VSxsPU8sTD1xLHY9SSxCPUgseT1QLF89QyxjPVQsYT1NLEowPUE7Zm9yKGxldCBxMD0wO3EwPFk7cTArPTIpYl49RCh4K198MCw3KSxMXj1EKGIreHwwLDkpLF9ePUQoTCtifDAsMTMpLHhePUQoXytMfDAsMTgpLHZePUQodyttfDAsNyksY149RCh2K3d8MCw5KSxtXj1EKGMrdnwwLDEzKSx3Xj1EKG0rY3wwLDE4KSxhXj1EKEIraHwwLDcpLEVePUQoYStCfDAsOSksaF49RChFK2F8MCwxMyksQl49RChoK0V8MCwxOCksa149RChKMCt5fDAsNyksbF49RChrK0owfDAsOSkseV49RChsK2t8MCwxMyksSjBePUQoeStsfDAsMTgpLG1ePUQoeCtrfDAsNyksRV49RChtK3h8MCw5KSxrXj1EKEUrbXwwLDEzKSx4Xj1EKGsrRXwwLDE4KSxoXj1EKHcrYnwwLDcpLGxePUQoaCt3fDAsOSksYl49RChsK2h8MCwxMyksd149RChiK2x8MCwxOCkseV49RChCK3Z8MCw3KSxMXj1EKHkrQnwwLDkpLHZePUQoTCt5fDAsMTMpLEJePUQoditMfDAsMTgpLF9ePUQoSjArYXwwLDcpLGNePUQoXytKMHwwLDkpLGFePUQoYytffDAsMTMpLEowXj1EKGErY3wwLDE4KTtsZXQgcD0wO1FbcCsrXT1YK3h8MCxRW3ArK109VyttfDAsUVtwKytdPXorRXwwLFFbcCsrXT1LK2t8MCxRW3ArK109RitifDAsUVtwKytdPU4rd3wwLFFbcCsrXT1VK2h8MCxRW3ArK109TytsfDAsUVtwKytdPXErTHwwLFFbcCsrXT1JK3Z8MCxRW3ArK109SCtCfDAsUVtwKytdPVAreXwwLFFbcCsrXT1DK198MCxRW3ArK109VCtjfDAsUVtwKytdPU0rYXwwLFFbcCsrXT1BK0owfDB9ZnVuY3Rpb24gbVYoJCxaLEosUSl7bGV0IFY9JFswXSxZPVpbMF0sWD1aWzFdLFc9WlsyXSx6PVpbM10sSz0kWzFdLEY9SlswXSxOPUpbMV0sVT1KWzJdLE89SlszXSxxPSRbMl0sST1aWzRdLEg9Wls1XSxQPVpbNl0sQz1aWzddLFQ9JFszXTtmb3IobGV0IEE9MDtBPDIwO0ErPTIpel49RChWK0h8MCw3KSxVXj1EKHorVnwwLDkpLEhePUQoVSt6fDAsMTMpLFZePUQoSCtVfDAsMTgpLE9ePUQoSytZfDAsNyksUF49RChPK0t8MCw5KSxZXj1EKFArT3wwLDEzKSxLXj1EKFkrUHwwLDE4KSxDXj1EKHErRnwwLDcpLFhePUQoQytxfDAsOSksRl49RChYK0N8MCwxMykscV49RChGK1h8MCwxOCksV149RChUK0l8MCw3KSxOXj1EKFcrVHwwLDkpLElePUQoTitXfDAsMTMpLFRePUQoSStOfDAsMTgpLFlePUQoVitXfDAsNyksWF49RChZK1Z8MCw5KSxXXj1EKFgrWXwwLDEzKSxWXj1EKFcrWHwwLDE4KSxGXj1EKEsrenwwLDcpLE5ePUQoRitLfDAsOSksel49RChOK0Z8MCwxMyksS149RCh6K058MCwxOCksSV49RChxK098MCw3KSxVXj1EKEkrcXwwLDkpLE9ePUQoVStJfDAsMTMpLHFePUQoTytVfDAsMTgpLEhePUQoVCtDfDAsNyksUF49RChIK1R8MCw5KSxDXj1EKFArSHwwLDEzKSxUXj1EKEMrUHwwLDE4KTtsZXQgTT0wO1FbTSsrXT1WLFFbTSsrXT1LLFFbTSsrXT1xLFFbTSsrXT1ULFFbTSsrXT1GLFFbTSsrXT1OLFFbTSsrXT1VLFFbTSsrXT1PfXZhciBiWj1WUShFVix7Y291bnRlclJpZ2h0OiEwLGV4dGVuZE5vbmNlRm46bVZ9KSx5Wj0kUSh7YmxvY2tTaXplOjY0LG5vbmNlTGVuZ3RoOjI0LHRhZ0xlbmd0aDoxNn0sKCQsWik9PntyZXR1cm57ZW5jcnlwdChKLFEpe1E9Z1ooSi5sZW5ndGgrMzIsUSwhMSk7bGV0IFY9US5zdWJhcnJheSgwLDMyKSxZPVEuc3ViYXJyYXkoMzIpO1Euc2V0KEosMzIpLFUwKFYpLGJaKCQsWixRLFEpO2xldCBYPXZaKFksVik7cmV0dXJuIFEuc2V0KFgsMTYpLFUwKFEuc3ViYXJyYXkoMCwxNiksWCksUS5zdWJhcnJheSgxNil9LGRlY3J5cHQoSixRKXtkKEopLFE9Z1ooSi5sZW5ndGgrMzIsUSwhMSk7bGV0IFY9US5zdWJhcnJheSgwLDMyKSxZPVEuc3ViYXJyYXkoMzIsNDgpLFg9US5zdWJhcnJheSg0OCk7US5zZXQoSiwzMiksVTAoVik7bGV0IFc9YlooJCxaLFYsViksej12WihYLFcpO2lmKCFlSihZLHopKXRocm93IEVycm9yKCJpbnZhbGlkIHRhZyIpO3JldHVybiBiWigkLFosUS5zdWJhcnJheSgxNiksUS5zdWJhcnJheSgxNikpLFUwKFYsWSx6KSxYfX19KTsvKiEgbm9ibGUtaGFzaGVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovZnVuY3Rpb24gZ1YoJCl7cmV0dXJuICQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxBcnJheUJ1ZmZlci5pc1ZpZXcoJCkmJiQuY29uc3RydWN0b3IubmFtZT09PSJVaW50OEFycmF5In1mdW5jdGlvbiBGJCgkKXtpZighTnVtYmVyLmlzU2FmZUludGVnZXIoJCl8fCQ8MCl0aHJvdyBFcnJvcigicG9zaXRpdmUgaW50ZWdlciBleHBlY3RlZCwgZ290ICIrJCl9ZnVuY3Rpb24gZjAoJCwuLi5aKXtpZighZ1YoJCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQiKTtpZihaLmxlbmd0aD4wJiYhWi5pbmNsdWRlcygkLmxlbmd0aCkpdGhyb3cgRXJyb3IoIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoICIrWisiLCBnb3QgbGVuZ3RoPSIrJC5sZW5ndGgpfWZ1bmN0aW9uIE4kKCQsWj0hMCl7aWYoJC5kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkIik7aWYoWiYmJC5maW5pc2hlZCl0aHJvdyBFcnJvcigiSGFzaCNkaWdlc3QoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCIpfWZ1bmN0aW9uIGwkKCQsWil7ZjAoJCk7bGV0IEo9Wi5vdXRwdXRMZW47aWYoJC5sZW5ndGg8Sil0aHJvdyBFcnJvcigiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgIitKKX1mdW5jdGlvbiBYUSgkKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoJC5idWZmZXIsJC5ieXRlT2Zmc2V0LCQuYnl0ZUxlbmd0aCl9ZnVuY3Rpb24gdDAoJCl7cmV0dXJuIG5ldyBVaW50MzJBcnJheSgkLmJ1ZmZlciwkLmJ5dGVPZmZzZXQsTWF0aC5mbG9vcigkLmJ5dGVMZW5ndGgvNCkpfWZ1bmN0aW9uIGUwKC4uLiQpe2ZvcihsZXQgWj0wO1o8JC5sZW5ndGg7WisrKSRbWl0uZmlsbCgwKX1mdW5jdGlvbiBSJCgkLFope3JldHVybiAkPDwzMi1afCQ+Pj5afXZhciBXUT0oKCk9Pm5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMjg3NDU0MDIwXSkuYnVmZmVyKVswXT09PTY4KSgpO2Z1bmN0aW9uIEdRKCQpe3JldHVybiAkPDwyNCY0Mjc4MTkwMDgwfCQ8PDgmMTY3MTE2ODB8JD4+PjgmNjUyODB8JD4+PjI0JjI1NX12YXIgelE9V1E/KCQpPT4kOigkKT0+R1EoJCk7ZnVuY3Rpb24gU1YoJCl7Zm9yKGxldCBaPTA7WjwkLmxlbmd0aDtaKyspJFtaXT1HUSgkW1pdKTtyZXR1cm4gJH12YXIgZT1XUT8oJCk9PiQ6U1Y7ZnVuY3Rpb24gdlYoJCl7aWYodHlwZW9mICQhPT0ic3RyaW5nIil0aHJvdyBFcnJvcigic3RyaW5nIGV4cGVjdGVkIik7cmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgkKSl9ZnVuY3Rpb24gJCQoJCl7aWYodHlwZW9mICQ9PT0ic3RyaW5nIikkPXZWKCQpO3JldHVybiBmMCgkKSwkfWNsYXNzIGlae31mdW5jdGlvbiBLUSgkKXtsZXQgWj0oUSxWKT0+JChWKS51cGRhdGUoJCQoUSkpLmRpZ2VzdCgpLEo9JCh7fSk7cmV0dXJuIFoub3V0cHV0TGVuPUoub3V0cHV0TGVuLFouYmxvY2tMZW49Si5ibG9ja0xlbixaLmNyZWF0ZT0oUSk9PiQoUSksWn12YXIgRlE9VWludDMyQXJyYXkuZnJvbShbMTc3OTAzMzcwMywzMTQ0MTM0Mjc3LDEwMTM5MDQyNDIsMjc3MzQ4MDc2MiwxMzU5ODkzMTE5LDI2MDA4MjI5MjQsNTI4NzM0NjM1LDE1NDE0NTkyMjVdKTt2YXIgcCQ9QmlnSW50KDQyOTQ5NjcyOTUpLE5RPUJpZ0ludCgzMik7ZnVuY3Rpb24gaFooJCxaPSExKXtpZihaKXJldHVybntoOk51bWJlcigkJnAkKSxsOk51bWJlcigkPj5OUSZwJCl9O3JldHVybntoOk51bWJlcigkPj5OUSZwJCl8MCxsOk51bWJlcigkJnAkKXwwfX1mdW5jdGlvbiBIMCgkLFosSixRLFYpe3JldHVybiAkPSQrWitWfDAsUT1SJChRXiQsMTYpLEo9SitRfDAsWj1SJChaXkosMTIpLHthOiQsYjpaLGM6SixkOlF9fWZ1bmN0aW9uIE0wKCQsWixKLFEsVil7cmV0dXJuICQ9JCtaK1Z8MCxRPVIkKFFeJCw4KSxKPUorUXwwLFo9UiQoWl5KLDcpLHthOiQsYjpaLGM6SixkOlF9fWNsYXNzIHVaIGV4dGVuZHMgaVp7Y29uc3RydWN0b3IoJCxaKXtzdXBlcigpO3RoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5sZW5ndGg9MCx0aGlzLnBvcz0wLEYkKCQpLEYkKFopLHRoaXMuYmxvY2tMZW49JCx0aGlzLm91dHB1dExlbj1aLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KCQpLHRoaXMuYnVmZmVyMzI9dDAodGhpcy5idWZmZXIpfXVwZGF0ZSgkKXtOJCh0aGlzKSwkPSQkKCQpLGYwKCQpO2xldHtibG9ja0xlbjpaLGJ1ZmZlcjpKLGJ1ZmZlcjMyOlF9PXRoaXMsVj0kLmxlbmd0aCxZPSQuYnl0ZU9mZnNldCxYPSQuYnVmZmVyO2ZvcihsZXQgVz0wO1c8Vjspe2lmKHRoaXMucG9zPT09WillKFEpLHRoaXMuY29tcHJlc3MoUSwwLCExKSxlKFEpLHRoaXMucG9zPTA7bGV0IHo9TWF0aC5taW4oWi10aGlzLnBvcyxWLVcpLEs9WStXO2lmKHo9PT1aJiYhKEslNCkmJlcrejxWKXtsZXQgRj1uZXcgVWludDMyQXJyYXkoWCxLLE1hdGguZmxvb3IoKFYtVykvNCkpO2UoRik7Zm9yKGxldCBOPTA7VytaPFY7Tis9US5sZW5ndGgsVys9Wil0aGlzLmxlbmd0aCs9Wix0aGlzLmNvbXByZXNzKEYsTiwhMSk7ZShGKTtjb250aW51ZX1KLnNldCgkLnN1YmFycmF5KFcsVyt6KSx0aGlzLnBvcyksdGhpcy5wb3MrPXosdGhpcy5sZW5ndGgrPXosVys9en1yZXR1cm4gdGhpc31kaWdlc3RJbnRvKCQpe04kKHRoaXMpLGwkKCQsdGhpcyk7bGV0e3BvczpaLGJ1ZmZlcjMyOkp9PXRoaXM7dGhpcy5maW5pc2hlZD0hMCxlMCh0aGlzLmJ1ZmZlci5zdWJhcnJheShaKSksZShKKSx0aGlzLmNvbXByZXNzKEosMCwhMCksZShKKTtsZXQgUT10MCgkKTt0aGlzLmdldCgpLmZvckVhY2goKFYsWSk9PlFbWV09elEoVikpfWRpZ2VzdCgpe2xldHtidWZmZXI6JCxvdXRwdXRMZW46Wn09dGhpczt0aGlzLmRpZ2VzdEludG8oJCk7bGV0IEo9JC5zbGljZSgwLFopO3JldHVybiB0aGlzLmRlc3Ryb3koKSxKfV9jbG9uZUludG8oJCl7bGV0e2J1ZmZlcjpaLGxlbmd0aDpKLGZpbmlzaGVkOlEsZGVzdHJveWVkOlYsb3V0cHV0TGVuOlkscG9zOlh9PXRoaXM7cmV0dXJuICR8fCgkPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtka0xlbjpZfSkpLCQuc2V0KC4uLnRoaXMuZ2V0KCkpLCQuYnVmZmVyLnNldChaKSwkLmRlc3Ryb3llZD1WLCQuZmluaXNoZWQ9USwkLmxlbmd0aD1KLCQucG9zPVgsJC5vdXRwdXRMZW49WSwkfWNsb25lKCl7cmV0dXJuIHRoaXMuX2Nsb25lSW50bygpfX1mdW5jdGlvbiBsWigkLFosSixRLFYsWSxYLFcseixLLEYsTixVLE8scSxJLEgsUCxDLFQpe2xldCBNPTA7Zm9yKGxldCBBPTA7QTxRO0ErKykoe2E6VixiOnosYzpVLGQ6SH09SDAoVix6LFUsSCxKW1orJFtNKytdXSkpLHthOlYsYjp6LGM6VSxkOkh9PU0wKFYseixVLEgsSltaKyRbTSsrXV0pLHthOlksYjpLLGM6TyxkOlB9PUgwKFksSyxPLFAsSltaKyRbTSsrXV0pLHthOlksYjpLLGM6TyxkOlB9PU0wKFksSyxPLFAsSltaKyRbTSsrXV0pLHthOlgsYjpGLGM6cSxkOkN9PUgwKFgsRixxLEMsSltaKyRbTSsrXV0pLHthOlgsYjpGLGM6cSxkOkN9PU0wKFgsRixxLEMsSltaKyRbTSsrXV0pLHthOlcsYjpOLGM6SSxkOlR9PUgwKFcsTixJLFQsSltaKyRbTSsrXV0pLHthOlcsYjpOLGM6SSxkOlR9PU0wKFcsTixJLFQsSltaKyRbTSsrXV0pLHthOlYsYjpLLGM6cSxkOlR9PUgwKFYsSyxxLFQsSltaKyRbTSsrXV0pLHthOlYsYjpLLGM6cSxkOlR9PU0wKFYsSyxxLFQsSltaKyRbTSsrXV0pLHthOlksYjpGLGM6SSxkOkh9PUgwKFksRixJLEgsSltaKyRbTSsrXV0pLHthOlksYjpGLGM6SSxkOkh9PU0wKFksRixJLEgsSltaKyRbTSsrXV0pLHthOlgsYjpOLGM6VSxkOlB9PUgwKFgsTixVLFAsSltaKyRbTSsrXV0pLHthOlgsYjpOLGM6VSxkOlB9PU0wKFgsTixVLFAsSltaKyRbTSsrXV0pLHthOlcsYjp6LGM6TyxkOkN9PUgwKFcseixPLEMsSltaKyRbTSsrXV0pLHthOlcsYjp6LGM6TyxkOkN9PU0wKFcseixPLEMsSltaKyRbTSsrXV0pO3JldHVybnt2MDpWLHYxOlksdjI6WCx2MzpXLHY0OnosdjU6Syx2NjpGLHY3Ok4sdjg6VSx2OTpPLHYxMDpxLHYxMTpJLHYxMjpILHYxMzpQLHYxNDpDLHYxNTpUfX12YXIgTzA9e0NIVU5LX1NUQVJUOjEsQ0hVTktfRU5EOjIsUEFSRU5UOjQsUk9PVDo4LEtFWUVEX0hBU0g6MTYsREVSSVZFX0tFWV9DT05URVhUOjMyLERFUklWRV9LRVlfTUFURVJJQUw6NjR9LEMwPUZRLnNsaWNlKCksUlE9KCgpPT57bGV0ICQ9QXJyYXkuZnJvbSh7bGVuZ3RoOjE2fSwoUSxWKT0+ViksWj0oUSk9PlsyLDYsMywxMCw3LDAsNCwxMywxLDExLDEyLDUsOSwxNCwxNSw4XS5tYXAoKFYpPT5RW1ZdKSxKPVtdO2ZvcihsZXQgUT0wLFY9JDtRPDc7USsrLFY9WihWKSlKLnB1c2goLi4uVik7cmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShKKX0pKCk7Y2xhc3MgcFogZXh0ZW5kcyB1Wntjb25zdHJ1Y3RvcigkPXt9LFo9MCl7c3VwZXIoNjQsJC5ka0xlbj09PXZvaWQgMD8zMjokLmRrTGVuKTt0aGlzLmNodW5rUG9zPTAsdGhpcy5jaHVua3NEb25lPTAsdGhpcy5mbGFncz0wLHRoaXMuc3RhY2s9W10sdGhpcy5wb3NPdXQ9MCx0aGlzLmJ1ZmZlck91dDMyPW5ldyBVaW50MzJBcnJheSgxNiksdGhpcy5jaHVua091dD0wLHRoaXMuZW5hYmxlWE9GPSEwO2xldHtrZXk6Sixjb250ZXh0OlF9PSQsVj1RIT09dm9pZCAwO2lmKEohPT12b2lkIDApe2lmKFYpdGhyb3cgRXJyb3IoJ09ubHkgImtleSIgb3IgImNvbnRleHQiIGNhbiBiZSBzcGVjaWZpZWQgYXQgc2FtZSB0aW1lJyk7bGV0IFk9JCQoSikuc2xpY2UoKTtmMChZLDMyKSx0aGlzLklWPXQwKFkpLGUodGhpcy5JViksdGhpcy5mbGFncz1afE8wLktFWUVEX0hBU0h9ZWxzZSBpZihWKXtsZXQgWT0kJChRKSxYPW5ldyBwWih7ZGtMZW46MzJ9LE8wLkRFUklWRV9LRVlfQ09OVEVYVCkudXBkYXRlKFkpLmRpZ2VzdCgpO3RoaXMuSVY9dDAoWCksZSh0aGlzLklWKSx0aGlzLmZsYWdzPVp8TzAuREVSSVZFX0tFWV9NQVRFUklBTH1lbHNlIHRoaXMuSVY9QzAuc2xpY2UoKSx0aGlzLmZsYWdzPVo7dGhpcy5zdGF0ZT10aGlzLklWLnNsaWNlKCksdGhpcy5idWZmZXJPdXQ9WFEodGhpcy5idWZmZXJPdXQzMil9Z2V0KCl7cmV0dXJuW119c2V0KCl7fWIyQ29tcHJlc3MoJCxaLEosUT0wKXtsZXR7c3RhdGU6Vixwb3M6WX09dGhpcyx7aDpYLGw6V309aFooQmlnSW50KCQpLCEwKSx7djA6eix2MTpLLHYyOkYsdjM6Tix2NDpVLHY1Ok8sdjY6cSx2NzpJLHY4Okgsdjk6UCx2MTA6Qyx2MTE6VCx2MTI6TSx2MTM6QSx2MTQ6eCx2MTU6bX09bFooUlEsUSxKLDcsVlswXSxWWzFdLFZbMl0sVlszXSxWWzRdLFZbNV0sVls2XSxWWzddLEMwWzBdLEMwWzFdLEMwWzJdLEMwWzNdLFgsVyxZLFopO1ZbMF09el5ILFZbMV09S15QLFZbMl09Rl5DLFZbM109Tl5ULFZbNF09VV5NLFZbNV09T15BLFZbNl09cV54LFZbN109SV5tfWNvbXByZXNzKCQsWj0wLEo9ITEpe2xldCBRPXRoaXMuZmxhZ3M7aWYoIXRoaXMuY2h1bmtQb3MpUXw9TzAuQ0hVTktfU1RBUlQ7aWYodGhpcy5jaHVua1Bvcz09PTE1fHxKKVF8PU8wLkNIVU5LX0VORDtpZighSil0aGlzLnBvcz10aGlzLmJsb2NrTGVuO2lmKHRoaXMuYjJDb21wcmVzcyh0aGlzLmNodW5rc0RvbmUsUSwkLFopLHRoaXMuY2h1bmtQb3MrPTEsdGhpcy5jaHVua1Bvcz09PTE2fHxKKXtsZXQgVj10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpO2ZvcihsZXQgWSxYPXRoaXMuY2h1bmtzRG9uZSsxO0p8fCEoWCYxKTtYPj49MSl7aWYoIShZPXRoaXMuc3RhY2sucG9wKCkpKWJyZWFrO3RoaXMuYnVmZmVyMzIuc2V0KFksMCksdGhpcy5idWZmZXIzMi5zZXQoViw4KSx0aGlzLnBvcz10aGlzLmJsb2NrTGVuLHRoaXMuYjJDb21wcmVzcygwLHRoaXMuZmxhZ3N8TzAuUEFSRU5ULHRoaXMuYnVmZmVyMzIsMCksVj10aGlzLnN0YXRlLHRoaXMuc3RhdGU9dGhpcy5JVi5zbGljZSgpfXRoaXMuY2h1bmtzRG9uZSsrLHRoaXMuY2h1bmtQb3M9MCx0aGlzLnN0YWNrLnB1c2goVil9dGhpcy5wb3M9MH1fY2xvbmVJbnRvKCQpeyQ9c3VwZXIuX2Nsb25lSW50bygkKTtsZXR7SVY6WixmbGFnczpKLHN0YXRlOlEsY2h1bmtQb3M6Vixwb3NPdXQ6WSxjaHVua091dDpYLHN0YWNrOlcsY2h1bmtzRG9uZTp6fT10aGlzO3JldHVybiAkLnN0YXRlLnNldChRLnNsaWNlKCkpLCQuc3RhY2s9Vy5tYXAoKEspPT5VaW50MzJBcnJheS5mcm9tKEspKSwkLklWLnNldChaKSwkLmZsYWdzPUosJC5jaHVua1Bvcz1WLCQuY2h1bmtzRG9uZT16LCQucG9zT3V0PVksJC5jaHVua091dD1YLCQuZW5hYmxlWE9GPXRoaXMuZW5hYmxlWE9GLCQuYnVmZmVyT3V0MzIuc2V0KHRoaXMuYnVmZmVyT3V0MzIpLCR9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwLGUwKHRoaXMuc3RhdGUsdGhpcy5idWZmZXIzMix0aGlzLklWLHRoaXMuYnVmZmVyT3V0MzIpLGUwKC4uLnRoaXMuc3RhY2spfWIyQ29tcHJlc3NPdXQoKXtsZXR7c3RhdGU6JCxwb3M6WixmbGFnczpKLGJ1ZmZlcjMyOlEsYnVmZmVyT3V0MzI6Vn09dGhpcyx7aDpZLGw6WH09aFooQmlnSW50KHRoaXMuY2h1bmtPdXQrKykpO2UoUSk7bGV0e3YwOlcsdjE6eix2MjpLLHYzOkYsdjQ6Tix2NTpVLHY2Ok8sdjc6cSx2ODpJLHY5OkgsdjEwOlAsdjExOkMsdjEyOlQsdjEzOk0sdjE0OkEsdjE1Onh9PWxaKFJRLDAsUSw3LCRbMF0sJFsxXSwkWzJdLCRbM10sJFs0XSwkWzVdLCRbNl0sJFs3XSxDMFswXSxDMFsxXSxDMFsyXSxDMFszXSxYLFksWixKKTtWWzBdPVdeSSxWWzFdPXpeSCxWWzJdPUteUCxWWzNdPUZeQyxWWzRdPU5eVCxWWzVdPVVeTSxWWzZdPU9eQSxWWzddPXFeeCxWWzhdPSRbMF1eSSxWWzldPSRbMV1eSCxWWzEwXT0kWzJdXlAsVlsxMV09JFszXV5DLFZbMTJdPSRbNF1eVCxWWzEzXT0kWzVdXk0sVlsxNF09JFs2XV5BLFZbMTVdPSRbN11eeCxlKFEpLGUoViksdGhpcy5wb3NPdXQ9MH1maW5pc2goKXtpZih0aGlzLmZpbmlzaGVkKXJldHVybjt0aGlzLmZpbmlzaGVkPSEwLGUwKHRoaXMuYnVmZmVyLnN1YmFycmF5KHRoaXMucG9zKSk7bGV0ICQ9dGhpcy5mbGFnc3xPMC5ST09UO2lmKHRoaXMuc3RhY2subGVuZ3RoKSR8PU8wLlBBUkVOVCxlKHRoaXMuYnVmZmVyMzIpLHRoaXMuY29tcHJlc3ModGhpcy5idWZmZXIzMiwwLCEwKSxlKHRoaXMuYnVmZmVyMzIpLHRoaXMuY2h1bmtzRG9uZT0wLHRoaXMucG9zPXRoaXMuYmxvY2tMZW47ZWxzZSAkfD0oIXRoaXMuY2h1bmtQb3M/TzAuQ0hVTktfU1RBUlQ6MCl8TzAuQ0hVTktfRU5EO3RoaXMuZmxhZ3M9JCx0aGlzLmIyQ29tcHJlc3NPdXQoKX13cml0ZUludG8oJCl7TiQodGhpcywhMSksZjAoJCksdGhpcy5maW5pc2goKTtsZXR7YmxvY2tMZW46WixidWZmZXJPdXQ6Sn09dGhpcztmb3IobGV0IFE9MCxWPSQubGVuZ3RoO1E8Vjspe2lmKHRoaXMucG9zT3V0Pj1aKXRoaXMuYjJDb21wcmVzc091dCgpO2xldCBZPU1hdGgubWluKFotdGhpcy5wb3NPdXQsVi1RKTskLnNldChKLnN1YmFycmF5KHRoaXMucG9zT3V0LHRoaXMucG9zT3V0K1kpLFEpLHRoaXMucG9zT3V0Kz1ZLFErPVl9cmV0dXJuICR9eG9mSW50bygkKXtpZighdGhpcy5lbmFibGVYT0YpdGhyb3cgRXJyb3IoIlhPRiBpcyBub3QgcG9zc2libGUgYWZ0ZXIgZGlnZXN0IGNhbGwiKTtyZXR1cm4gdGhpcy53cml0ZUludG8oJCl9eG9mKCQpe3JldHVybiBGJCgkKSx0aGlzLnhvZkludG8obmV3IFVpbnQ4QXJyYXkoJCkpfWRpZ2VzdEludG8oJCl7aWYobCQoJCx0aGlzKSx0aGlzLmZpbmlzaGVkKXRocm93IEVycm9yKCJkaWdlc3QoKSB3YXMgYWxyZWFkeSBjYWxsZWQiKTtyZXR1cm4gdGhpcy5lbmFibGVYT0Y9ITEsdGhpcy53cml0ZUludG8oJCksdGhpcy5kZXN0cm95KCksJH1kaWdlc3QoKXtyZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSl9fXZhciBVUT1LUSgoJCk9Pm5ldyBwWigkKSk7dmFyIG5aPW5ldyBVaW50OEFycmF5KFs0OCw0NiwyLDEsMCw0OCw1LDYsMyw0MywxMDEsMTEyLDQsMzQsNCwzMl0pO2Z1bmN0aW9uIE9RKCQpe2xldCBaPW5ldyBVaW50OEFycmF5KG5aLmxlbmd0aCszMik7cmV0dXJuIFouc2V0KG5aKSxaLnNldCgkLnN1YmFycmF5KDAsMzIpLG5aLmxlbmd0aCksWn1mdW5jdGlvbiBxUSgkKXtyZXR1cm4gdHlwZW9mICQ9PT0ic3RyaW5nIj9uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJCk6JH1mdW5jdGlvbiBaJCgkKXtsZXQgWj1uZXcgQXJyYXlCdWZmZXIoJC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWikuc2V0KCQpLFp9Y2xhc3MgY1p7dmVyaWZ5S2V5cz1uZXcgTWFwO3NpZ25LZXlzPW5ldyBNYXA7YXN5bmMgZ2VuUmFuZG9tQnl0ZXMoJCl7cmV0dXJuIGgkKCQpfWFzeW5jIGdlbjI1NkJpdFNlY3VyZVJhbmRvbVNlZWQoKXtyZXR1cm4gaCQoMzIpfWFzeW5jIGVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQoJCxaKXtsZXQgSj1oJCgyNCksVj15WihaLEopLmVuY3J5cHQoJCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KFsuLi5KLC4uLlZdKX1hc3luYyBkZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKCQsWil7bGV0IEo9JC5zbGljZSgwLDI0KSxRPSQuc2xpY2UoMjQpO3JldHVybiB5WihaLEopLmRlY3J5cHQoUSl9YXN5bmMgZGVyaXZlRWQyNTUxOUtleVBhaXIoJCl7bGV0IFo9JCxKPU9RKFopLFE9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicGtjczgiLFokKEopLHtuYW1lOiJFZDI1NTE5In0sITAsWyJzaWduIl0pLFY9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIixRKTtpZih0eXBlb2YgVi54IT09InN0cmluZyIpdGhyb3cgRXJyb3IoIkVkMjU1MTkgSldLIG1pc3NpbmcgeCIpO2xldCBZPWF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoImp3ayIse2t0eToiT0tQIixjcnY6IkVkMjU1MTkiLHg6Vi54fSx7bmFtZToiRWQyNTUxOSJ9LCEwLFsidmVyaWZ5Il0pLFg9bmV3IFVpbnQ4QXJyYXkoYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleSgicmF3IixZKSksVz1uZXcgVWludDhBcnJheSg2NCk7cmV0dXJuIFcuc2V0KFosMCksVy5zZXQoWCwzMiksdGhpcy5zaWduS2V5cy5zZXQoTjAoWiksUSksdGhpcy52ZXJpZnlLZXlzLnNldChOMChYKSxZKSx7a2V5VHlwZToiZWQyNTUxOSIscHJpdmF0ZUtleTpXLHB1YmxpY0tleTpYfX1hc3luYyBpbXBvcnRTaWduS2V5KCQpe2xldCBaPSQuc3ViYXJyYXkoMCwzMiksSj1OMChaKSxRPXRoaXMuc2lnbktleXMuZ2V0KEopO2lmKFEpcmV0dXJuIFE7bGV0IFY9T1EoWiksWT1hd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJwa2NzOCIsWiQoVikse25hbWU6IkVkMjU1MTkifSwhMSxbInNpZ24iXSk7cmV0dXJuIHRoaXMuc2lnbktleXMuc2V0KEosWSksWX1hc3luYyBpbXBvcnRWZXJpZnlLZXkoJCl7bGV0IFo9TjAoJCksSj10aGlzLnZlcmlmeUtleXMuZ2V0KFopO2lmKEopcmV0dXJuIEo7bGV0IFE9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixaJCgkKSx7bmFtZToiRWQyNTUxOSJ9LCExLFsidmVyaWZ5Il0pO3JldHVybiB0aGlzLnZlcmlmeUtleXMuc2V0KFosUSksUX1hc3luYyBzaWduRWQyNTUxOSgkLFope2xldCBKPXFRKCQpLFE9YXdhaXQgdGhpcy5pbXBvcnRTaWduS2V5KFopLFY9YXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLnNpZ24oe25hbWU6IkVkMjU1MTkifSxRLFokKEopKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoVil9YXN5bmMgY2hlY2tTaWdFZDI1NTE5KCQsWixKKXtsZXQgUT1xUShaKTt0cnl7bGV0IFY9YXdhaXQgdGhpcy5pbXBvcnRWZXJpZnlLZXkoSik7cmV0dXJuIGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS52ZXJpZnkoe25hbWU6IkVkMjU1MTkifSxWLFokKCQpLFokKFEpKX1jYXRjaHtyZXR1cm4hMX19YXN5bmMgYmxha2UzKCQpe3JldHVybiBVUSgkKX19dmFyIGJWPW5ldyBjWixVJD1iVjt2YXIgazA9e2VuY29kZSgkLFope2xldCBKPSQud3JpdGVWYXJTdHJpbmcoWi5oYW5kbGUpO2lmKEohPT0wKXJldHVybiBKO2xldCBRPSQud3JpdGVWYXJTdHJpbmcoWi5sYWJlbCk7aWYoUSE9PTApcmV0dXJuIFE7cmV0dXJuICQud3JpdGVWYXJJbnQoWi5pZHg/PzApfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkVmFyU3RyaW5nKCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0W1EsVl09JC5yZWFkVmFyU3RyaW5nKCk7aWYoViE9PTApcmV0dXJuIEcoVik7bGV0W1ksWF09JC5yZWFkVmFySW50KCk7aWYoWCE9PTApcmV0dXJuIEcoWCk7cmV0dXJuIFIoe2hhbmRsZTpaLGxhYmVsOlEsaWR4Oll9KX19O3ZhciBuJD0xLGRaPXtlbmNvZGUoJCxaKXtpZihaLnYhPT1uJClyZXR1cm4gMTA7bGV0WyxKXT10KFoubWFzdGVyU2VlZCk7aWYoSiE9PTApcmV0dXJuIEo7bGV0IFE9JC53cml0ZVZhckludChaLnYpO2lmKFEhPT0wKXJldHVybiBROyQud3JpdGVCeXRlcyhaLm1hc3RlclNlZWQpO2xldCBWPSQud3JpdGVWYXJJbnQoWi5ob3N0cy5sZW5ndGgpO2lmKFYhPT0wKXJldHVybiBWO2ZvcihsZXQgWSBvZiBaLmhvc3RzKXtsZXQgWD0kLndyaXRlU3RydWN0KGswLFkpO2lmKFghPT0wKXJldHVybiBYfXJldHVybiAwfSxkZWNvZGUoJCl7bGV0W1osSl09JC5yZWFkVmFySW50KCk7aWYoSiE9PTApcmV0dXJuIEcoSik7aWYoWiE9PW4kKXJldHVybiBHKDE0KTtsZXRbUSxWXT0kLnJlYWRCeXRlcyhSMCk7aWYoViE9PTApcmV0dXJuIEcoVik7aWYoUT09PXZvaWQgMClyZXR1cm4gRygxNCk7bGV0W1ksWF09dChRKTtpZihYIT09MClyZXR1cm4gRyhYKTtpZihZPT09dm9pZCAwKXJldHVybiBHKDE0KTtsZXRbVyx6XT0kLnJlYWRWYXJJbnQoKTtpZih6IT09MClyZXR1cm4gRyh6KTtpZihXPT09dm9pZCAwfHxXPDApcmV0dXJuIEcoMTApO2xldCBLPVtdO2ZvcihsZXQgRj0wO0Y8VztGKyspe2xldFtOLFVdPSQucmVhZFN0cnVjdChrMCk7aWYoVSE9PTApcmV0dXJuIEcoVSk7aWYoTj09PXZvaWQgMClyZXR1cm4gRygxNCk7Sy5wdXNoKE4pfXJldHVybiBSKHt2Om4kLG1hc3RlclNlZWQ6WSxob3N0czpLfSl9fTtmdW5jdGlvbiBJUSgkLFope2xldFtKLFFdPXQoJCk7aWYoUSE9PTApcmV0dXJuIEcoUSk7aWYoSj09PXZvaWQgMClyZXR1cm4gRygxMCk7bGV0W1YsWV09dChKLnNsaWNlKCkpO2lmKFkhPT0wKXJldHVybiBHKFkpO2lmKFY9PT12b2lkIDApcmV0dXJuIEcoMTApO3JldHVybiBSKHt2Om4kLG1hc3RlclNlZWQ6Vixob3N0czpaLm1hcCgoWCk9Pih7aGFuZGxlOlguaGFuZGxlLGxhYmVsOlgubGFiZWwsaWR4OlguaWR4Pz8wfSkpfSl9dmFyIHJaPXtlbmNvZGUoJCxaKXtsZXRbLEpdPXQoWi5tYXN0ZXJTZWVkKTtpZihKIT09MClyZXR1cm4gSjskLndyaXRlQnl0ZXMoWi5tYXN0ZXJTZWVkKTtsZXQgUT0kLndyaXRlVmFySW50KFouaG9zdHMubGVuZ3RoKTtpZihRIT09MClyZXR1cm4gUTtmb3IobGV0IFYgb2YgWi5ob3N0cyl7bGV0IFk9JC53cml0ZVN0cnVjdChrMCxWKTtpZihZIT09MClyZXR1cm4gWX1yZXR1cm4gMH0sZGVjb2RlKCQpe2xldFtaLEpdPSQucmVhZEJ5dGVzKFIwKTtpZihKIT09MClyZXR1cm4gRyhKKTtpZihaPT09dm9pZCAwKXJldHVybiBHKDE0KTtsZXRbUSxWXT10KFopO2lmKFYhPT0wKXJldHVybiBHKFYpO2lmKFE9PT12b2lkIDApcmV0dXJuIEcoMTQpO2xldFtZLFhdPSQucmVhZFZhckludCgpO2lmKFghPT0wKXJldHVybiBHKFgpO2lmKFk9PT12b2lkIDB8fFk8MClyZXR1cm4gRygxMCk7bGV0IFc9W107Zm9yKGxldCB6PTA7ejxZO3orKyl7bGV0W0ssRl09JC5yZWFkU3RydWN0KGswKTtpZihGIT09MClyZXR1cm4gRyhGKTtpZihLPT09dm9pZCAwKXJldHVybiBHKDE0KTtXLnB1c2goSyl9cmV0dXJuIFIoe21hc3RlclNlZWQ6USxob3N0czpXfSl9fTtmdW5jdGlvbiBQMCgkKXtsZXQgWj1uZXcgVWludDhBcnJheSgkKTtpZigkPjApY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhaKTtyZXR1cm4gWn12YXIgQjA9MzIseVY9LTcsaVY9LTgsaFY9LTI1NyxjJD1be3R5cGU6InB1YmxpYy1rZXkiLGFsZzp5Vn0se3R5cGU6InB1YmxpYy1rZXkiLGFsZzppVn0se3R5cGU6InB1YmxpYy1rZXkiLGFsZzpoVn1dO2Z1bmN0aW9uIHVWKCQpe3JldHVybiAkLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1wuJC8sIiIpfHwibG9jYWxob3N0In1mdW5jdGlvbiBFMCgkKXtsZXQgWj1uZXcgVWludDhBcnJheSgkLmJ5dGVMZW5ndGgpO3JldHVybiBaLnNldCgkKSxafWZ1bmN0aW9uIG0wKCQpe2lmKCQ/LnJwSWQhPT12b2lkIDApcmV0dXJuIFIoJC5ycElkKTtpZih0eXBlb2YgbG9jYXRpb24+InUiKXJldHVybiBHKDkpO3JldHVybiBSKHVWKGxvY2F0aW9uLmhvc3RuYW1lKSl9ZnVuY3Rpb24gZzAoKXtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8IW5hdmlnYXRvci5jcmVkZW50aWFsc3x8dHlwZW9mIFB1YmxpY0tleUNyZWRlbnRpYWw+InUiKXJldHVybiAyNDtyZXR1cm4gMH1mdW5jdGlvbiBTMCgkKXtpZigkPT09bnVsbHx8JC50eXBlIT09InB1YmxpYy1rZXkifHwhKCJyYXdJZCJpbiAkKXx8dHlwZW9mICQuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cyE9PSJmdW5jdGlvbiIpcmV0dXJuIEcoMjcpO3JldHVybiBSKCQpfWFzeW5jIGZ1bmN0aW9uIEhRKCQpe2xldCBaPWcwKCk7aWYoWiE9PTApcmV0dXJuIEcoWik7bGV0W0osUV09bTAoJCk7aWYoUSE9PTApcmV0dXJuIEcoUSk7aWYoSj09PXZvaWQgMClyZXR1cm4gRyg5KTtsZXQgVj0kPy51c2VyTmFtZT8/ImRpcGxvbWF0aWMtc2VlZCIsWT17cmVzaWRlbnRLZXk6InJlcXVpcmVkIixyZXF1aXJlUmVzaWRlbnRLZXk6ITAsdXNlclZlcmlmaWNhdGlvbjoicmVxdWlyZWQifTtpZigkPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudCE9PXZvaWQgMClZLmF1dGhlbnRpY2F0b3JBdHRhY2htZW50PSQuYXV0aGVudGljYXRvckF0dGFjaG1lbnQ7bGV0IFg9e2xhcmdlQmxvYjp7c3VwcG9ydDoicmVxdWlyZWQifX0sVzt0cnl7Vz1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKHtwdWJsaWNLZXk6e2NoYWxsZW5nZTpQMChCMCkscnA6e2lkOkosbmFtZTokPy5ycE5hbWU/PyJESVBMT01BVElDIn0sdXNlcjp7aWQ6UDAoMTYpLG5hbWU6VixkaXNwbGF5TmFtZTpWfSxwdWJLZXlDcmVkUGFyYW1zOmMkLGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246WSxleHRlbnNpb25zOlh9fSl9Y2F0Y2h7cmV0dXJuIEcoMjQpfWxldFt6LEtdPVMwKFcpO2lmKEshPT0wKXJldHVybiBHKEspO2lmKHo9PT12b2lkIDApcmV0dXJuIEcoMjcpO2lmKHouZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8uc3VwcG9ydGVkIT09ITApcmV0dXJuIEcoMjQpO3JldHVybiBSKG5ldyBVaW50OEFycmF5KHoucmF3SWQpKX1hc3luYyBmdW5jdGlvbiBvWigkLFosSil7bGV0IFE9ZzAoKTtpZihRIT09MClyZXR1cm4gUTtsZXRbVixZXT1tMChKKTtpZihZIT09MClyZXR1cm4gWTtpZihWPT09dm9pZCAwKXJldHVybiA5O2xldCBYPXtsYXJnZUJsb2I6e3dyaXRlOkUwKFopfX0sVzt0cnl7Vz1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KHtwdWJsaWNLZXk6e2NoYWxsZW5nZTpQMChCMCkscnBJZDpWLGFsbG93Q3JlZGVudGlhbHM6W3t0eXBlOiJwdWJsaWMta2V5IixpZDpFMCgkKX1dLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOlh9fSl9Y2F0Y2h7cmV0dXJuIDI0fWxldFt6LEtdPVMwKFcpO2lmKEshPT0wKXJldHVybiBLO2lmKHo9PT12b2lkIDApcmV0dXJuIDI3O2lmKHouZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8ud3JpdHRlbiE9PSEwKXJldHVybiAyNDtyZXR1cm4gMH1hc3luYyBmdW5jdGlvbiBNUSgkLFope2xldCBKPWcwKCk7aWYoSiE9PTApcmV0dXJuIEcoSik7bGV0W1EsVl09bTAoWik7aWYoViE9PTApcmV0dXJuIEcoVik7aWYoUT09PXZvaWQgMClyZXR1cm4gRyg5KTtsZXQgWT17bGFyZ2VCbG9iOntyZWFkOiEwfX0sWDt0cnl7bGV0IE49e2NoYWxsZW5nZTpQMChCMCkscnBJZDpRLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOll9O2lmKCQhPT12b2lkIDApTi5hbGxvd0NyZWRlbnRpYWxzPVt7dHlwZToicHVibGljLWtleSIsaWQ6RTAoJCl9XTtYPWF3YWl0IG5hdmlnYXRvci5jcmVkZW50aWFscy5nZXQoe3B1YmxpY0tleTpOfSl9Y2F0Y2h7cmV0dXJuIEcoMjQpfWxldFtXLHpdPVMwKFgpO2lmKHohPT0wKXJldHVybiBHKHopO2lmKFc9PT12b2lkIDApcmV0dXJuIEcoMjcpO2xldCBGPVcuZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpLmxhcmdlQmxvYj8uYmxvYjtpZihGPT09dm9pZCAwKXJldHVybiBHKDcpO3JldHVybiBSKHtibG9iOm5ldyBVaW50OEFycmF5KEYpLGNyZWRJZDpuZXcgVWludDhBcnJheShXLnJhd0lkKX0pfXZhciBkJD1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoImRpcGxvbWF0aWMucHJmLnYxIiksYVo9MzI7YXN5bmMgZnVuY3Rpb24gQ1EoJCl7bGV0IFo9ZzAoKTtpZihaIT09MClyZXR1cm4gRyhaKTtsZXRbSixRXT1tMCgkKTtpZihRIT09MClyZXR1cm4gRyhRKTtpZihKPT09dm9pZCAwKXJldHVybiBHKDkpO2xldCBWPSQ/LnVzZXJOYW1lPz8iZGlwbG9tYXRpYy1wcmYiLFk9e3Jlc2lkZW50S2V5OiJyZXF1aXJlZCIscmVxdWlyZVJlc2lkZW50S2V5OiEwLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixhdXRoZW50aWNhdG9yQXR0YWNobWVudDokPy5hdXRoZW50aWNhdG9yQXR0YWNobWVudD8/InBsYXRmb3JtIn0sWDt0cnl7WD1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuY3JlYXRlKHtwdWJsaWNLZXk6e2NoYWxsZW5nZTpQMChCMCkscnA6e2lkOkosbmFtZTokPy5ycE5hbWU/PyJESVBMT01BVElDIn0sdXNlcjp7aWQ6UDAoMTYpLG5hbWU6VixkaXNwbGF5TmFtZTpWfSxwdWJLZXlDcmVkUGFyYW1zOmMkLGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246WSxleHRlbnNpb25zOntwcmY6e319fX0pfWNhdGNoe3JldHVybiBHKDI0KX1sZXRbVyx6XT1TMChYKTtpZih6IT09MClyZXR1cm4gRyh6KTtpZihXPT09dm9pZCAwKXJldHVybiBHKDI3KTtsZXQgSz1XLmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKTtyZXR1cm4gUih7Y3JlZElkOm5ldyBVaW50OEFycmF5KFcucmF3SWQpLHByZkVuYWJsZWQ6Sy5wcmY/LmVuYWJsZWQ9PT0hMH0pfWFzeW5jIGZ1bmN0aW9uIE8kKCQpe2xldCBaPWcwKCk7aWYoWiE9PTApcmV0dXJuIEcoWik7bGV0W0osUV09bTAoJCk7aWYoUSE9PTApcmV0dXJuIEcoUSk7aWYoSj09PXZvaWQgMClyZXR1cm4gRyg5KTtsZXQgVj0kPy5zYWx0Pz9kJCxZPUUwKFYpLFg9e2NoYWxsZW5nZTpQMChCMCkscnBJZDpKLHVzZXJWZXJpZmljYXRpb246InJlcXVpcmVkIixleHRlbnNpb25zOntwcmY6e2V2YWw6e2ZpcnN0Oll9fX19O2lmKCQ/LmNyZWRJZCE9PXZvaWQgMClYLmFsbG93Q3JlZGVudGlhbHM9W3t0eXBlOiJwdWJsaWMta2V5IixpZDpFMCgkLmNyZWRJZCl9XTtsZXQgVzt0cnl7Vz1hd2FpdCBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0KHtwdWJsaWNLZXk6WH0pfWNhdGNoe3JldHVybiBHKDI0KX1sZXRbeixLXT1TMChXKTtpZihLIT09MClyZXR1cm4gRyhLKTtpZih6PT09dm9pZCAwKXJldHVybiBHKDI3KTtsZXQgRj16LmdldENsaWVudEV4dGVuc2lvblJlc3VsdHMoKS5wcmY/LnJlc3VsdHM7aWYoRj8uZmlyc3Q9PT12b2lkIDApcmV0dXJuIEcoNyk7bGV0IE49Ri5maXJzdCxVPU4gaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9uZXcgVWludDhBcnJheShOKTpuZXcgVWludDhBcnJheShOLmJ1ZmZlcixOLmJ5dGVPZmZzZXQsTi5ieXRlTGVuZ3RoKSxPPVUuYnl0ZUxlbmd0aD49YVo/VS5zbGljZSgwLGFaKTpVO2lmKE8uYnl0ZUxlbmd0aCE9PWFaKXJldHVybiBHKDI3KTtyZXR1cm4gUih7cHJmOk8sY3JlZElkOm5ldyBVaW50OEFycmF5KHoucmF3SWQpfSl9dmFyIHIkPSIiO3ZhciBvJDtmdW5jdGlvbiBwVigpe2lmKHR5cGVvZiByJCE9PSJzdHJpbmcifHxyJC5sZW5ndGg9PT0wKXRocm93IEVycm9yKCJbRElQTE9NQVRJQ10gd29ya2VyIHNvdXJjZSBub3QgZW1iZWRkZWQ7IHJ1biBwa2cgYnVpbGQgYmVmb3JlIHNwYXduIik7cmV0dXJuIGF0b2IociQpfWZ1bmN0aW9uIG5WKCl7aWYobyQhPT12b2lkIDApcmV0dXJuIG8kO2xldCAkPW5ldyBCbG9iKFtwVigpXSx7dHlwZToidGV4dC9qYXZhc2NyaXB0In0pO3JldHVybiBvJD1VUkwuY3JlYXRlT2JqZWN0VVJMKCQpLG8kfWZ1bmN0aW9uIFBRKCl7aWYodHlwZW9mIFdvcmtlcj4idSIpdGhyb3cgRXJyb3IoIltESVBMT01BVElDXSBXb3JrZXIgQVBJIHVuYXZhaWxhYmxlOyBjYW5ub3Qgc3Bhd24gc3luYyB3b3JrZXIiKTtyZXR1cm4gbmV3IFdvcmtlcihuVigpLHt0eXBlOiJtb2R1bGUifSl9dmFyIGNWPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiZGlwbG9tYXRpYy53cmFwLnYxIiksZFY9MzIsclY9MTY7Y2xhc3MgJDB7I0o7IyQ7Y29uc3RydWN0b3IoJCxaKXt0aGlzLiNKPSQsdGhpcy4jJD1afXN0YXRpYyBhc3luYyBmcm9tUmFuZG9tKCQpe2xldCBaPWF3YWl0ICQuZ2VuMjU2Qml0U2VjdXJlUmFuZG9tU2VlZCgpLFtKLFFdPXQoWik7aWYoUSE9PTB8fEo9PT12b2lkIDApdGhyb3cgRXJyb3IoYGVuY2xhdmU6IGludmFsaWQgcmFuZG9tIHNlZWQgKCR7UX0pYCk7cmV0dXJuIG5ldyAkMChKLCQpfXN0YXRpYyBmcm9tQnl0ZXMoJCxaKXtsZXRbSixRXT10KFopO2lmKFEhPT0wKXJldHVybiBHKFEpO2lmKEo9PT12b2lkIDApcmV0dXJuIEcoMTApO2xldFtWLFldPXQoSi5zbGljZSgpKTtpZihZIT09MClyZXR1cm4gRyhZKTtpZihWPT09dm9pZCAwKXJldHVybiBHKDEwKTtyZXR1cm4gUihuZXcgJDAoViwkKSl9YXN5bmMgc2VhbFdpdGhQYXNza2V5KCQpe2xldCBaPSQ/LnNhbHQ/P2QkLEo9JD8uY3JlZElkO2lmKEo9PT12b2lkIDAmJiQ/LmNyZWF0ZUNyZWRJZk5lZWRlZD09PSEwKXtsZXRbWSxYXT1hd2FpdCBDUSh7cnBJZDokPy5ycElkLHJwTmFtZTokPy5ycE5hbWUsdXNlck5hbWU6JD8udXNlck5hbWU/PyJkaXBsb21hdGljLXByZiJ9KTtpZihYIT09MClyZXR1cm4gRyhYKTtpZihZPT09dm9pZCAwKXJldHVybiBHKDI0KTtpZighWS5wcmZFbmFibGVkKXJldHVybiBHKDI0KTtKPVkuY3JlZElkfWxldFtRLFZdPWF3YWl0IE8kKHtycElkOiQ/LnJwSWQscnBOYW1lOiQ/LnJwTmFtZSxjcmVkSWQ6SixzYWx0Olp9KTtpZihWIT09MClyZXR1cm4gRyhWKTtpZihRPT09dm9pZCAwKXJldHVybiBHKDcpO3RyeXtsZXRbWSxYXT1hd2FpdCB0aGlzLiNaKFEucHJmKTtpZihYIT09MClyZXR1cm4gRyhYKTtpZihZPT09dm9pZCAwKXJldHVybiBHKDEyKTtyZXR1cm4gUih7c2VhbGVkTWFzdGVyOlksc2FsdDpaLnNsaWNlKCksY3JlZElkOlEuY3JlZElkLnNsaWNlKCl9KX1maW5hbGx5e1EucHJmLmZpbGwoMCl9fXN0YXRpYyBhc3luYyB1bnNlYWxXaXRoUGFzc2tleSgkLFosSil7bGV0W1EsVl09YXdhaXQgTyQoe3JwSWQ6Si5ycElkLHJwTmFtZTpKLnJwTmFtZSxjcmVkSWQ6Si5jcmVkSWQsc2FsdDpKLnNhbHR9KTtpZihWIT09MClyZXR1cm4gRyhWKTtpZihRPT09dm9pZCAwKXJldHVybiBHKDcpO3RyeXtyZXR1cm4gYXdhaXQgJDAuI1YoJCxaLFEucHJmKX1maW5hbGx5e1EucHJmLmZpbGwoMCl9fWFzeW5jIHBlcnNpc3RUb0xhcmdlQmxvYigkPVtdLFope2xldCBKPVo/LmNyZWRJZDtpZihKPT09dm9pZCAwKXtsZXRbWSxYXT1hd2FpdCBIUShaKTtpZihYIT09MClyZXR1cm4gRyhYKTtpZihZPT09dm9pZCAwKXJldHVybiBHKDI0KTtKPVl9bGV0W1EsVl09dGhpcy4jUSgkKTtpZihWIT09MClyZXR1cm4gRyhWKTtpZihRPT09dm9pZCAwKXJldHVybiBHKDEyKTt0cnl7bGV0IFk9YXdhaXQgb1ooSixRLFopO2lmKFkhPT0wKXJldHVybiBHKFkpO3JldHVybiBSKEopfWZpbmFsbHl7US5maWxsKDApfX1zdGF0aWMgYXN5bmMgZnJvbUxhcmdlQmxvYigkLFope2xldFtKLFFdPWF3YWl0IE1RKFo/LmNyZWRJZCxaKTtpZihRIT09MClyZXR1cm4gRyhRKTtpZihKPT09dm9pZCAwKXJldHVybiBHKDcpO3RyeXtyZXR1cm4gJDAuI1coJCxKLmJsb2IsSi5jcmVkSWQpfWZpbmFsbHl7Si5ibG9iLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBjbGVhckxhcmdlQmxvYigkLFope3JldHVybiBvWigkLG5ldyBVaW50OEFycmF5KFIwKSxaKX1hc3luYyBzZWFsUGFpclBhY2thZ2VCb2R5KCQsWil7bGV0IEo9Wj8uc2FsdD8/ZCQsW1EsVl09YXdhaXQgTyQoe3JwSWQ6Wj8ucnBJZCxycE5hbWU6Wj8ucnBOYW1lLGNyZWRJZDpaPy5jcmVkSWQsc2FsdDpKfSk7aWYoViE9PTApcmV0dXJuIEcoVik7aWYoUT09PXZvaWQgMClyZXR1cm4gRyg3KTt0cnl7bGV0W1ksWF09YXdhaXQgYSQodGhpcy4jJCxRLnByZik7aWYoWCE9PTApcmV0dXJuIEcoWCk7aWYoWT09PXZvaWQgMClyZXR1cm4gRygxMik7bGV0W1csel09dCh0aGlzLiNKLnNsaWNlKCkpO2lmKHohPT0wKXJldHVybiBHKHopO2lmKFc9PT12b2lkIDApcmV0dXJuIEcoMTApO2xldCBLPXttYXN0ZXJTZWVkOlcsaG9zdHM6JC5tYXAoKHEpPT4oe2hhbmRsZTpxLmhhbmRsZSxsYWJlbDpxLmxhYmVsLGlkeDpxLmlkeD8/MH0pKX0sRj1uZXcgUyxOPUYud3JpdGVTdHJ1Y3QoclosSyk7aWYoTiE9PTApcmV0dXJuIFcuZmlsbCgwKSxHKE4pO2xldCBVPUYucmVzdWx0KCk7Vy5maWxsKDApO2xldCBPO3RyeXtPPWF3YWl0IHRoaXMuIyQuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChVLFkpfWNhdGNoe3JldHVybiBVLmZpbGwoMCksRygxMil9cmV0dXJuIFUuZmlsbCgwKSxSKHtib2R5Ok8sc2FsdDpKLnNsaWNlKCksY3JlZElkOlEuY3JlZElkLnNsaWNlKCl9KX1maW5hbGx5e1EucHJmLmZpbGwoMCl9fXN0YXRpYyBhc3luYyBvcGVuUGFpclBhY2thZ2VCb2R5KCQsWixKKXtsZXRbUSxWXT1hd2FpdCBPJCh7cnBJZDpKLnJwSWQscnBOYW1lOkoucnBOYW1lLGNyZWRJZDpKLmNyZWRJZCxzYWx0Okouc2FsdH0pO2lmKFYhPT0wKXJldHVybiBHKFYpO2lmKFE9PT12b2lkIDApcmV0dXJuIEcoNyk7dHJ5e2xldFtZLFhdPWF3YWl0IGEkKCQsUS5wcmYpO2lmKFghPT0wKXJldHVybiBHKFgpO2lmKFk9PT12b2lkIDApcmV0dXJuIEcoMTIpO2xldCBXO3RyeXtXPWF3YWl0ICQuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChaLFkpfWNhdGNoe3JldHVybiBHKDIwKX1sZXQgej1uZXcgZyhXKSxbSyxGXT16LnJlYWRTdHJ1Y3QoclopO2lmKFcuZmlsbCgwKSxGIT09MClyZXR1cm4gRyhGKTtpZihLPT09dm9pZCAwKXJldHVybiBHKDE0KTtsZXRbTixVXT0kMC5mcm9tQnl0ZXMoJCxLLm1hc3RlclNlZWQpO2lmKEsubWFzdGVyU2VlZC5maWxsKDApLFUhPT0wKXJldHVybiBHKFUpO2lmKE49PT12b2lkIDApcmV0dXJuIEcoMTIpO2xldFtPLHFdPWF3YWl0IE4uI1ooUS5wcmYpO2lmKHEhPT0wKXJldHVybiBHKHEpO2lmKE89PT12b2lkIDApcmV0dXJuIEcoMTIpO3JldHVybiBSKHtlbmNsYXZlOk4saG9zdHM6Sy5ob3N0cy5tYXAoKEkpPT4oey4uLkl9KSksc2VhbGVkTWFzdGVyOk8sY3JlZElkOlEuY3JlZElkLnNsaWNlKCl9KX1maW5hbGx5e1EucHJmLmZpbGwoMCl9fXNwYXduU3luY1dvcmtlcigkKXtsZXQgWj1QUSgpLEo9dGhpcy4jSi5zbGljZSgpO3JldHVybiBaLnBvc3RNZXNzYWdlKHtpZDokLmlkLG9wOiJzZXRTZWVkIixzZWVkOkoscGVyc2lzdDokLnBlcnNpc3R9LFtKLmJ1ZmZlcl0pLFp9ZGVyaXZlQ2lwaGVyKCQsWil7bGV0IEo9JC5zbGljZSgpLFE9KFgpPT50aGlzLiNHKEosWCksVj0oWCk9PnRoaXMuI3ooSixYKTtyZXR1cm57ZW5jcnlwdDpPYmplY3QuZnJlZXplKHtlbmNyeXB0OlF9KSxkZWNyeXB0Ok9iamVjdC5mcmVlemUoe2RlY3J5cHQ6Vn0pLGJvdGg6T2JqZWN0LmZyZWV6ZSh7ZW5jcnlwdDpRLGRlY3J5cHQ6Vn0pfVtaXX1hc3luYyBkZXJpdmVJZGVudGl0eSgkLFo9MCl7bGV0IEo9JCxRPVosVj1hd2FpdCB0aGlzLiNYKEosUSk7cmV0dXJuIE9iamVjdC5mcmVlemUoe3B1YmxpY0tleTpWLnB1YmxpY0tleSxzaWduOihZKT0+dGhpcy4jRihKLFEsWSksa2RtRm9yOihZKT0+dGhpcy4jTihKLFEsWSl9KX1hc3luYyNaKCQpe2xldFtaLEpdPWF3YWl0IGEkKHRoaXMuIyQsJCk7aWYoSiE9PTApcmV0dXJuIEcoSik7aWYoWj09PXZvaWQgMClyZXR1cm4gRygxMik7dHJ5e2xldCBRPWF3YWl0IHRoaXMuIyQuZW5jcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZCh0aGlzLiNKLFopO3JldHVybiBqMChRKX1jYXRjaHtyZXR1cm4gRygxMil9fXN0YXRpYyBhc3luYyNWKCQsWixKKXtsZXRbLFFdPWowKFopO2lmKFEhPT0wKXJldHVybiBHKFEpO2xldFtWLFldPWF3YWl0IGEkKCQsSik7aWYoWSE9PTApcmV0dXJuIEcoWSk7aWYoVj09PXZvaWQgMClyZXR1cm4gRygxMik7dHJ5e2xldCBYPWF3YWl0ICQuZGVjcnlwdFhTYWxzYTIwUG9seTEzMDVDb21iaW5lZChaLFYpO3JldHVybiAkMC5mcm9tQnl0ZXMoJCxYKX1jYXRjaHtyZXR1cm4gRygyMCl9fSNRKCQpe2xldFtaLEpdPXQodGhpcy4jSi5zbGljZSgpKTtpZihKIT09MClyZXR1cm4gRyhKKTtpZihaPT09dm9pZCAwKXJldHVybiBHKDEwKTtsZXRbUSxWXT1JUShaLCQpO2lmKFYhPT0wKXJldHVybiBaLmZpbGwoMCksRyhWKTtpZihRPT09dm9pZCAwKXJldHVybiBaLmZpbGwoMCksRygxMik7Wi5maWxsKDApO2xldCBZPW5ldyBTLFg9WS53cml0ZVN0cnVjdChkWixRKTtpZihRLm1hc3RlclNlZWQuZmlsbCgwKSxYIT09MClyZXR1cm4gRyhYKTtyZXR1cm4gUihZLnJlc3VsdCgpKX1zdGF0aWMjVygkLFosSil7aWYoWi5ieXRlTGVuZ3RoPT09MHx8Wi5ldmVyeSgoeik9Pno9PT0wKSlyZXR1cm4gRygyMik7aWYoWi5ieXRlTGVuZ3RoPT09UjApe2xldFt6LEtdPSQwLmZyb21CeXRlcygkLFopO2lmKEshPT0wKXJldHVybiBHKEspO2lmKHo9PT12b2lkIDApcmV0dXJuIEcoMTIpO3JldHVybiBSKHtlbmNsYXZlOnosaG9zdHM6W10sY3JlZElkOkp9KX1sZXQgUT1uZXcgZyhaKSxbVixZXT1RLnJlYWRTdHJ1Y3QoZFopO2lmKFkhPT0wKXJldHVybiBHKFkpO2lmKFY9PT12b2lkIDApcmV0dXJuIEcoMTQpO2xldFtYLFddPSQwLmZyb21CeXRlcygkLFYubWFzdGVyU2VlZCk7aWYoVi5tYXN0ZXJTZWVkLmZpbGwoMCksVyE9PTApcmV0dXJuIEcoVyk7aWYoWD09PXZvaWQgMClyZXR1cm4gRygxMik7cmV0dXJuIFIoe2VuY2xhdmU6WCxob3N0czpWLmhvc3RzLm1hcCgoeik9Pih7Li4uen0pKSxjcmVkSWQ6Sn0pfWFzeW5jI0coJCxaKXtsZXQgSj1hd2FpdCB0aGlzLiNZKCQpO3JldHVybiB0aGlzLiMkLmVuY3J5cHRYU2Fsc2EyMFBvbHkxMzA1Q29tYmluZWQoWixKKX1hc3luYyN6KCQsWil7bGV0IEo9YXdhaXQgdGhpcy4jWSgkKTtyZXR1cm4gdGhpcy4jJC5kZWNyeXB0WFNhbHNhMjBQb2x5MTMwNUNvbWJpbmVkKFosSil9YXN5bmMjWSgkKXtyZXR1cm4gdGhpcy4jJC5ibGFrZTMoVyQodGhpcy4jSiwkKSl9YXN5bmMjSygkLFope2xldCBKPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgkKSxRPW5ldyBVaW50OEFycmF5KDgpO3JldHVybiBuZXcgRGF0YVZpZXcoUS5idWZmZXIpLnNldEJpZ1VpbnQ2NCgwLEJpZ0ludChaKSwhMSksYXdhaXQgdGhpcy4jWShXJChKLFEpKX1hc3luYyNYKCQsWil7bGV0IEo9YXdhaXQgdGhpcy4jSygkLFopO3JldHVybiB0aGlzLiMkLmRlcml2ZUVkMjU1MTlLZXlQYWlyKEopfWFzeW5jI0YoJCxaLEope2xldCBRPWF3YWl0IHRoaXMuI1goJCxaKTtyZXR1cm4gdGhpcy4jJC5zaWduRWQyNTUxOShKLFEucHJpdmF0ZUtleSl9YXN5bmMjTigkLFosSil7bGV0IFE9YXdhaXQgdGhpcy4jWCgkLFopLFY9VyQoUS5wcml2YXRlS2V5LEopO3JldHVybihhd2FpdCB0aGlzLiMkLmJsYWtlMyhWKSkuc2xpY2UoMCxUMCl9fWFzeW5jIGZ1bmN0aW9uIGEkKCQsWil7aWYoWi5ieXRlTGVuZ3RoPHJWKXJldHVybiBHKDEwKTtsZXQgSj1hd2FpdCAkLmJsYWtlMyhXJChaLGNWKSk7cmV0dXJuIFIoSi5zbGljZSgwLGRWKSl9Y2xhc3Mgc1p7ZGI7Y29uc3RydWN0b3IoJCl7dGhpcy5kYj0kfWFzeW5jIGVucSgkKXtsZXQgWj1bLi4uJF07aWYoWi5sZW5ndGg9PT0wKXJldHVybjtsZXQgSj10aGlzLmRiLnRyYW5zYWN0aW9uKFcwLCJyZWFkd3JpdGUiKSxRPUoub2JqZWN0U3RvcmUoVzApO3JldHVybiBuZXcgUHJvbWlzZSgoVixZKT0+e0oub25jb21wbGV0ZT0oKT0+VigpLEoub25lcnJvcj0oKT0+WShKLmVycm9yKTtmb3IobGV0IFggb2YgWil7bGV0IFc9YCR7WC5ob3N0fToke1guc2VxfWA7US5wdXQoWCxXKX19KX1hc3luYyBkZXEoJCxaKXtsZXQgSj1bLi4uWl07aWYoSi5sZW5ndGg9PT0wKXJldHVybjtsZXQgUT10aGlzLmRiLnRyYW5zYWN0aW9uKFcwLCJyZWFkd3JpdGUiKSxWPVEub2JqZWN0U3RvcmUoVzApO3JldHVybiBuZXcgUHJvbWlzZSgoWSxYKT0+e1Eub25jb21wbGV0ZT0oKT0+WSgpLFEub25lcnJvcj0oKT0+WChRLmVycm9yKTtmb3IobGV0IFcgb2YgSil7bGV0IHo9YCR7JH06JHtXfWA7Vi5kZWxldGUoeil9fSl9YXN5bmMgbGlzdCgpe2xldCBaPXRoaXMuZGIudHJhbnNhY3Rpb24oVzAsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoVzApO3JldHVybiBuZXcgUHJvbWlzZSgoSixRKT0+e2xldCBWPVouZ2V0QWxsKCk7Vi5vbnN1Y2Nlc3M9KCk9PkooVi5yZXN1bHQpLFYub25lcnJvcj0oKT0+UShWLmVycm9yKX0pfWFzeW5jIGNvdW50KCl7bGV0IFo9dGhpcy5kYi50cmFuc2FjdGlvbihXMCwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShXMCk7cmV0dXJuIG5ldyBQcm9taXNlKChKLFEpPT57bGV0IFY9Wi5jb3VudCgpO1Yub25zdWNjZXNzPSgpPT5KKFYucmVzdWx0KSxWLm9uZXJyb3I9KCk9PlEoVi5lcnJvcil9KX1hc3luYyB3aXBlKCl7bGV0ICQ9dGhpcy5kYi50cmFuc2FjdGlvbihXMCwicmVhZHdyaXRlIiksWj0kLm9iamVjdFN0b3JlKFcwKTtyZXR1cm4gbmV3IFByb21pc2UoKEosUSk9PnskLm9uY29tcGxldGU9KCk9PkooKSwkLm9uZXJyb3I9KCk9PlEoJC5lcnJvciksWi5jbGVhcigpfSl9fWZ1bmN0aW9uIHdRKCQpe3JldHVybntsYWJlbDokLmxhYmVsLGhhbmRsZTpuZXcgVVJMKCQuaGFuZGxlKSxpZHg6JC5pZHgsbGFzdFNlcTokLmxhc3RTZXF8fDAsY2xvY2tPZmZzZXQ6JC5jbG9ja09mZnNldCxzdWJzY3JpcHRpb246JC5zdWJzY3JpcHRpb259fWZ1bmN0aW9uIG9WKCQsWil7bGV0IEo9ey4uLiR9O2lmKFouc2V0TGFzdFNlcSE9PXZvaWQgMClKLmxhc3RTZXE9Wi5zZXRMYXN0U2VxO2Vsc2UgaWYoWi5sYXN0U2VxIT09dm9pZCAwKXtsZXQgUT1KLmxhc3RTZXF8fDA7aWYoWi5sYXN0U2VxPlEpSi5sYXN0U2VxPVoubGFzdFNlcX1yZXR1cm4gZGVsZXRlIEoubnVtQmFncyxkZWxldGUgSi5udW1EdXBlcyxKfWNsYXNzIHRae2RiO2NvbnN0cnVjdG9yKCQpe3RoaXMuZGI9JH1hc3luYyBhZGQoJCl7cmV0dXJuIHRoaXMucHV0KHsuLi4kLGxhc3RTZXE6MH0pfWFzeW5jIHB1dCgkKXtsZXQgWj17Li4uJCxoYW5kbGU6JC5oYW5kbGUudG9TdHJpbmcoKSxsYXN0U2VxOiQubGFzdFNlcT8/MH0sSj10aGlzLmRiLnRyYW5zYWN0aW9uKFowLCJyZWFkd3JpdGUiKSxRPUoub2JqZWN0U3RvcmUoWjApO3JldHVybiBuZXcgUHJvbWlzZSgoVixZKT0+e0oub25jb21wbGV0ZT0oKT0+VigpLEoub25lcnJvcj0oKT0+WShKLmVycm9yKSxRLnB1dChaKX0pfWFzeW5jIHRvdWNoKCQsWil7cmV0dXJuIHRoaXMucmVjb3JkU3RhdHMoJCx7bGFzdFNlcTpafSl9YXN5bmMgcmVjb3JkU3RhdHMoJCxaKXtsZXQgSj10aGlzLmRiLnRyYW5zYWN0aW9uKFowLCJyZWFkd3JpdGUiKSxRPUoub2JqZWN0U3RvcmUoWjApO3JldHVybiBuZXcgUHJvbWlzZSgoVixZKT0+e0oub25jb21wbGV0ZT0oKT0+VigpLEoub25lcnJvcj0oKT0+WShKLmVycm9yKTtsZXQgWD1RLmdldCgkKTtYLm9uc3VjY2Vzcz0oKT0+e2xldCBXPVgucmVzdWx0O2lmKCFXKXJldHVybjtRLnB1dChvVihXLFopKX19KX1hc3luYyBnZXQoJCl7bGV0IEo9dGhpcy5kYi50cmFuc2FjdGlvbihaMCwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShaMCk7cmV0dXJuIG5ldyBQcm9taXNlKChRLFYpPT57bGV0IFk9Si5nZXQoJCk7WS5vbnN1Y2Nlc3M9KCk9PntsZXQgWD1ZLnJlc3VsdDtpZighWClRKHZvaWQgMCk7ZWxzZSBRKHdRKFgpKX0sWS5vbmVycm9yPSgpPT5WKFkuZXJyb3IpfSl9YXN5bmMgc2V0KCQsWil7bGV0IEo9YXdhaXQgdGhpcy5nZXQoJCk7aWYoIUopcmV0dXJuIDEzO3RyeXtyZXR1cm4gYXdhaXQgdGhpcy5wdXQoey4uLkosLi4uWn0pLDB9Y2F0Y2h7cmV0dXJuIDE4fX1hc3luYyBkZWwoJCl7bGV0IFo9dGhpcy5kYi50cmFuc2FjdGlvbihaMCwicmVhZHdyaXRlIiksSj1aLm9iamVjdFN0b3JlKFowKTtyZXR1cm4gbmV3IFByb21pc2UoKFEsVik9PntaLm9uY29tcGxldGU9KCk9PlEoKSxaLm9uZXJyb3I9KCk9PlYoWi5lcnJvciksSi5kZWxldGUoJCl9KX1hc3luYyBsaXN0KCl7bGV0IFo9dGhpcy5kYi50cmFuc2FjdGlvbihaMCwicmVhZG9ubHkiKS5vYmplY3RTdG9yZShaMCk7cmV0dXJuIG5ldyBQcm9taXNlKChKLFEpPT57bGV0IFY9Wi5nZXRBbGwoKTtWLm9uc3VjY2Vzcz0oKT0+e2xldCBZPVYucmVzdWx0O0ooWS5tYXAod1EpKX0sVi5vbmVycm9yPSgpPT5RKFYuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCAkPXRoaXMuZGIudHJhbnNhY3Rpb24oWjAsInJlYWR3cml0ZSIpLFo9JC5vYmplY3RTdG9yZShaMCk7cmV0dXJuIG5ldyBQcm9taXNlKChKLFEpPT57JC5vbmNvbXBsZXRlPSgpPT5KKCksJC5vbmVycm9yPSgpPT5RKCQuZXJyb3IpLFouY2xlYXIoKX0pfX1jbGFzcyBlWntjcnlwdG87ZGI7Y29uc3RydWN0b3IoJCxaKXt0aGlzLmNyeXB0bz1aO3RoaXMuZGI9JH1hc3luYyBhZGQoJCl7bGV0IFo9dGhpcy5kYi50cmFuc2FjdGlvbih1LCJyZWFkd3JpdGUiKSxKPVoub2JqZWN0U3RvcmUodSk7cmV0dXJuIG5ldyBQcm9taXNlKChRKT0+e2lmKCQubGVuZ3RoPT09MCl7UShbXSk7cmV0dXJufWxldCBWPUFycmF5KCQubGVuZ3RoKS5maWxsKDApO1oub25jb21wbGV0ZT0oKT0+UShWKSxaLm9uZXJyb3I9KCk9Pntmb3IobGV0IFk9MDtZPFYubGVuZ3RoO1krKylWW1ldPTE4O1EoVil9O2ZvcihsZXQgWT0wO1k8JC5sZW5ndGg7WSsrKXtsZXR7a2V5OlgsZGF0YTpXfT0kW1ldLHo9ZihYKSxLPUoucHV0KFcseik7Sy5vbmVycm9yPShGKT0+e0YucHJldmVudERlZmF1bHQoKSxWW1ldPTE4fX19KX1hc3luYyBkZWwoJCl7bGV0IFo9Wy4uLiRdO2lmKFoubGVuZ3RoPT09MClyZXR1cm47bGV0IEo9dGhpcy5kYi50cmFuc2FjdGlvbih1LCJyZWFkd3JpdGUiKSxRPUoub2JqZWN0U3RvcmUodSk7cmV0dXJuIG5ldyBQcm9taXNlKChWLFkpPT57Si5vbmNvbXBsZXRlPSgpPT5WKCksSi5vbmVycm9yPSgpPT5ZKEouZXJyb3IpO2ZvcihsZXQgWCBvZiBaKXtsZXQgVz1mKFgpO1EuZGVsZXRlKFcpfX0pfWFzeW5jIGdldCgkKXtsZXQgSj10aGlzLmRiLnRyYW5zYWN0aW9uKHUsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUodSk7cmV0dXJuIG5ldyBQcm9taXNlKChRLFYpPT57bGV0IFk9ZigkKSxYPUouZ2V0KFkpO1gub25zdWNjZXNzPWFzeW5jKCk9PntsZXQgVz1YLnJlc3VsdDtpZihXKVEoYXdhaXQgdiQoJCxXLHRoaXMuY3J5cHRvKSk7ZWxzZSBRKHZvaWQgMCl9LFgub25lcnJvcj0oKT0+VihYLmVycm9yKX0pfWFzeW5jIGhhcygkKXtyZXR1cm4gYXdhaXQgdGhpcy5nZXQoJCkhPT12b2lkIDB9YXN5bmMgbGlzdCgkKXtsZXQgWj0kPy5hcGxkLEo9JD8uYm9keSE9PSExLFY9dGhpcy5kYi50cmFuc2FjdGlvbih1LCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHUpO3JldHVybiBuZXcgUHJvbWlzZSgoWSxYKT0+e2xldCBXPVtdLHo9Wj09PXZvaWQgMD9WLm9wZW5DdXJzb3IoKTpWLmluZGV4KHEkKS5vcGVuQ3Vyc29yKElEQktleVJhbmdlLm9ubHkoWikpO3oub25zdWNjZXNzPShLKT0+e2xldCBGPUsudGFyZ2V0LnJlc3VsdDtpZihGKXtsZXQgTj1aPT09dm9pZCAwP0Yua2V5OkYucHJpbWFyeUtleSxVPUYudmFsdWU7Vy5wdXNoKHtoYXNoOkYwKE4pLGRhdGE6VX0pLEYuY29udGludWUoKX1lbHNlIFByb21pc2UuYWxsKFcubWFwKCh7aGFzaDpOLGRhdGE6VX0pPT52JChOLFUsdGhpcy5jcnlwdG8se2JvZHk6Sn0pKSkudGhlbihZKS5jYXRjaChYKX0sei5vbmVycm9yPSgpPT5YKHouZXJyb3IpfSl9YXN5bmMgY291bnQoJCl7bGV0IEo9dGhpcy5kYi50cmFuc2FjdGlvbih1LCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHUpO3JldHVybiBuZXcgUHJvbWlzZSgoUSxWKT0+e2xldCBZPSQ9PT12b2lkIDA/Si5jb3VudCgpOkouaW5kZXgocSQpLmNvdW50KElEQktleVJhbmdlLm9ubHkoJCkpO1kub25zdWNjZXNzPSgpPT5RKFkucmVzdWx0KSxZLm9uZXJyb3I9KCk9PlYoWS5lcnJvcil9KX1hc3luYyBsaXN0S2V5cygpe2xldCBaPXRoaXMuZGIudHJhbnNhY3Rpb24odSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh1KTtyZXR1cm4gbmV3IFByb21pc2UoKEosUSk9PntsZXQgVj1bXSxZPVoub3BlbktleUN1cnNvcigpO1kub25zdWNjZXNzPShYKT0+e2xldCBXPVgudGFyZ2V0LnJlc3VsdDtpZihXKVYucHVzaChGMChXLmtleSkpLFcuY29udGludWUoKTtlbHNlIEooVil9LFkub25lcnJvcj0oKT0+UShZLmVycm9yKX0pfWFzeW5jIGxhc3QoJCl7bGV0IEo9dGhpcy5kYi50cmFuc2FjdGlvbih1LCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHUpO3JldHVybiBuZXcgUHJvbWlzZSgoUSxWKT0+e2xldCBZLFg9Si5vcGVuQ3Vyc29yKCk7WC5vbnN1Y2Nlc3M9YXN5bmMoVyk9PntsZXQgej1XLnRhcmdldC5yZXN1bHQ7aWYoeil7bGV0e2tleTpLLHZhbHVlOkZ9PXo7aWYoVjAoJCxGLmVpZCkpe2lmKCFZfHwoRi5jdHI/PzApPihZLmRhdGEuY3RyPz8wKXx8KEYuY3RyPz8wKT09PShZLmRhdGEuY3RyPz8wKSYmKEYub2ZmPz8wKT4oWS5kYXRhLm9mZj8/MCkpWT17a2V5OkssZGF0YTpGfX16LmNvbnRpbnVlKCl9ZWxzZSBpZihZKXtsZXQgSz1GMChZLmtleSk7UShhd2FpdCB2JChLLFkuZGF0YSx0aGlzLmNyeXB0bykpfWVsc2UgUSh2b2lkIDApfSxYLm9uZXJyb3I9KCk9PlYoWC5lcnJvcil9KX1hc3luYyBtYXJrQXBwbGllZCgkKXtsZXQgWj1bLi4uJF07aWYoWi5sZW5ndGg9PT0wKXJldHVybjtsZXQgSj10aGlzLmRiLnRyYW5zYWN0aW9uKHUsInJlYWR3cml0ZSIpLFE9Si5vYmplY3RTdG9yZSh1KTtyZXR1cm4gbmV3IFByb21pc2UoKFYsWSk9PntKLm9uY29tcGxldGU9KCk9PlYoKSxKLm9uZXJyb3I9KCk9PlkoSi5lcnJvcik7Zm9yKGxldCBYIG9mIFope2xldCBXPWYoWCksej1RLmdldChXKTt6Lm9uc3VjY2Vzcz0oKT0+e2xldCBLPXoucmVzdWx0O2lmKCFLKXJldHVybjtqWihLLFMkKSxRLnB1dChLLFcpfSx6Lm9uZXJyb3I9KEspPT57Sy5wcmV2ZW50RGVmYXVsdCgpfX19KX1hc3luYyBtYXJrRmFpbGVkKCQpe2xldCBaPVsuLi4kXTtpZihaLmxlbmd0aD09PTApcmV0dXJuO2xldCBKPXRoaXMuZGIudHJhbnNhY3Rpb24odSwicmVhZHdyaXRlIiksUT1KLm9iamVjdFN0b3JlKHUpO3JldHVybiBuZXcgUHJvbWlzZSgoVixZKT0+e0oub25jb21wbGV0ZT0oKT0+VigpLEoub25lcnJvcj0oKT0+WShKLmVycm9yKTtmb3IobGV0e2tleTpYLGVycjpXfW9mIFope2xldCB6PWYoWCksSz1RLmdldCh6KTtLLm9uc3VjY2Vzcz0oKT0+e2xldCBGPUsucmVzdWx0O2lmKCFGKXJldHVybjtqWihGLGEwLFcpLFEucHV0KEYseil9LEsub25lcnJvcj0oRik9PntGLnByZXZlbnREZWZhdWx0KCl9fX0pfWFzeW5jIHdpcGUoKXtsZXQgJD10aGlzLmRiLnRyYW5zYWN0aW9uKHUsInJlYWR3cml0ZSIpLFo9JC5vYmplY3RTdG9yZSh1KTtyZXR1cm4gbmV3IFByb21pc2UoKEosUSk9PnskLm9uY29tcGxldGU9KCk9PkooKSwkLm9uZXJyb3I9KCk9PlEoJC5lcnJvciksWi5jbGVhcigpfSl9fWNsYXNzICRKeyNKOyMkOyNaOyNWOyNRO2NvbnN0cnVjdG9yKCQpe2lmKHRoaXMuI0o9JC5jcnlwdG8sdGhpcy4jUT0kLnBlcnNpc3RNZXRhLHRoaXMuI1Y9e3JwSWQ6JC5ycElkLHJwTmFtZTokLnJwTmFtZX0sJC5tZXRhIT09dm9pZCAwKXRoaXMuI1o9SiQoJC5tZXRhKX1nZXQgbWV0YSgpe3JldHVybiB0aGlzLiNaPT09dm9pZCAwP3ZvaWQgMDpKJCh0aGlzLiNaKX1zZXRNZXRhKCQpe3RoaXMuI1o9JD09PXZvaWQgMD92b2lkIDA6SiQoJCl9YXN5bmMgc2F2ZSgkLFope2lmKFo/LnBlcnNpc3Q9PT0hMClyZXR1cm4gUHJvbWlzZS5yZWplY3QoRXJyb3IoInByZi1zdG9yZTogdXNlIHdyYXBBbmRTYXZlKGVuY2xhdmUpIHRvIHBlcnNpc3Qgc2VhbGVkIG1hc3RlciIpKTtyZXR1cm4gdGhpcy4jJD0kLHRoaXMuIyR9YXN5bmMgd3JhcEFuZFNhdmUoJCxaKXtsZXRbSixRXT1hd2FpdCAkLnNlYWxXaXRoUGFzc2tleSh7Li4udGhpcy4jVixzYWx0Olo/LnNhbHQsY3JlZElkOlo/LmNyZWRJZD8/dGhpcy4jWj8uY3JlZElkLGNyZWF0ZUNyZWRJZk5lZWRlZDpaPy5jcmVhdGVDcmVkSWZOZWVkZWQ/P1o/LmNyZWRJZD09PXZvaWQgMCx1c2VyTmFtZToiZGlwbG9tYXRpYy1wcmYifSk7aWYoUSE9PTApcmV0dXJuIEcoUSk7aWYoSj09PXZvaWQgMClyZXR1cm4gRygxMik7bGV0IFY9e3NlYWxlZE1hc3RlcjpKLnNlYWxlZE1hc3RlcixzYWx0Okouc2FsdCxjcmVkSWQ6Si5jcmVkSWR9O3JldHVybiB0aGlzLiNaPVYsdGhpcy4jJD0kLGF3YWl0IHRoaXMuI1EoSiQoVikpLFIodGhpcy4jJCl9YXN5bmMgbG9hZCgpe3JldHVybiB0aGlzLiMkfWFzeW5jIHVubG9jaygpe2xldCAkPXRoaXMuI1o7aWYoJD09PXZvaWQgMClyZXR1cm4gRygyMik7bGV0W1osSl09YXdhaXQgJDAudW5zZWFsV2l0aFBhc3NrZXkodGhpcy4jSiwkLnNlYWxlZE1hc3Rlcix7Li4udGhpcy4jVixzYWx0OiQuc2FsdCxjcmVkSWQ6JC5jcmVkSWR9KTtpZihKIT09MClyZXR1cm4gRyhKKTtpZihaPT09dm9pZCAwKXJldHVybiBHKDEyKTtyZXR1cm4gdGhpcy4jJD1aLFIoWil9YXN5bmMgYWRvcHRTZWFsZWQoJCxaKXtyZXR1cm4gdGhpcy4jWj1KJChaKSx0aGlzLiMkPSQsYXdhaXQgdGhpcy4jUShKJChaKSksUih0aGlzLiMkKX1hc3luYyB3aXBlKCl7dGhpcy4jJD12b2lkIDAsdGhpcy4jWj12b2lkIDAsYXdhaXQgdGhpcy4jUSh2b2lkIDApfX1mdW5jdGlvbiBKJCgkKXtsZXRbWixKXT1qMCgkLnNlYWxlZE1hc3Rlci5zbGljZSgpKTtyZXR1cm57c2VhbGVkTWFzdGVyOko9PT0wJiZaIT09dm9pZCAwP1o6JC5zZWFsZWRNYXN0ZXIsc2FsdDokLnNhbHQuc2xpY2UoKSxjcmVkSWQ6JC5jcmVkSWQ9PT12b2lkIDA/dm9pZCAwOiQuY3JlZElkLnNsaWNlKCl9fXZhciBaSj0ic2VlZCIscyQ9InByZk1ldGEiO2NsYXNzIEpKe2VuY2xhdmU7ZGI7I0o7Y29uc3RydWN0b3IoJCxaKXt0aGlzLmRiPSQsdGhpcy4jSj1afWFzeW5jIHNhdmUoJCxaKXtyZXR1cm4gdGhpcy5lbmNsYXZlPSQsdGhpcy5lbmNsYXZlfWFzeW5jIGxvYWQoKXtpZih0aGlzLmVuY2xhdmUpcmV0dXJuIHRoaXMuZW5jbGF2ZTtsZXQgJD1hd2FpdCB0aGlzLiMkKCk7aWYoJD09PXZvaWQgMHx8JD09PSIiKXJldHVybjtsZXQgWj1EJCgkKSxbSixRXT0kMC5mcm9tQnl0ZXModGhpcy4jSixaKTtpZihaLmZpbGwoMCksYXdhaXQgdGhpcy4jWigpLFEhPT0wfHxKPT09dm9pZCAwKXJldHVybjtyZXR1cm4gdGhpcy5lbmNsYXZlPUosdGhpcy5lbmNsYXZlfWFzeW5jIGNsZWFyU2Vzc2lvbigpe3RoaXMuZW5jbGF2ZT12b2lkIDAsYXdhaXQgdGhpcy4jWigpfWFzeW5jIHdpcGUoKXt0aGlzLmVuY2xhdmU9dm9pZCAwO2xldCAkPXRoaXMuZGIudHJhbnNhY3Rpb24oRzAsInJlYWR3cml0ZSIpLFo9JC5vYmplY3RTdG9yZShHMCk7cmV0dXJuIG5ldyBQcm9taXNlKChKLFEpPT57JC5vbmNvbXBsZXRlPSgpPT5KKCksJC5vbmVycm9yPSgpPT5RKCQuZXJyb3IpLFouZGVsZXRlKFpKKSxaLmRlbGV0ZShzJCl9KX1hc3luYyBsb2FkUHJmTWV0YSgpe2xldCBaPXRoaXMuZGIudHJhbnNhY3Rpb24oRzAsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoRzApO3JldHVybiBuZXcgUHJvbWlzZSgoSixRKT0+e2xldCBWPVouZ2V0KHMkKTtWLm9uc3VjY2Vzcz0oKT0+e0ooYVYoVi5yZXN1bHQpKX0sVi5vbmVycm9yPSgpPT5RKFYuZXJyb3IpfSl9YXN5bmMgcGVyc2lzdFByZk1ldGEoJCl7bGV0IFo9dGhpcy5kYi50cmFuc2FjdGlvbihHMCwicmVhZHdyaXRlIiksSj1aLm9iamVjdFN0b3JlKEcwKTtyZXR1cm4gbmV3IFByb21pc2UoKFEsVik9PntpZihaLm9uY29tcGxldGU9KCk9PlEoKSxaLm9uZXJyb3I9KCk9PlYoWi5lcnJvciksJD09PXZvaWQgMCl7Si5kZWxldGUocyQpO3JldHVybn1sZXQgWT17c2VhbGVkTWFzdGVyOiQuc2VhbGVkTWFzdGVyLnNsaWNlKCksc2FsdDokLnNhbHQuc2xpY2UoKSxjcmVkSWQ6JC5jcmVkSWQ9PT12b2lkIDA/dm9pZCAwOiQuY3JlZElkLnNsaWNlKCl9O0oucHV0KFkscyQpfSl9YXN5bmMgaGFzUHJmTWV0YSgpe3JldHVybiBhd2FpdCB0aGlzLmxvYWRQcmZNZXRhKCkhPT12b2lkIDB9YXN5bmMgb3BlblByZlN0b3JlKCQpe2xldCBaPWF3YWl0IHRoaXMubG9hZFByZk1ldGEoKTtyZXR1cm4gbmV3ICRKKHtjcnlwdG86JC5jcnlwdG8/P3RoaXMuI0oscnBJZDokLnJwSWQscnBOYW1lOiQucnBOYW1lLG1ldGE6WixwZXJzaXN0TWV0YTooSik9PnRoaXMucGVyc2lzdFByZk1ldGEoSil9KX0jJCgpe2xldCBaPXRoaXMuZGIudHJhbnNhY3Rpb24oRzAsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoRzApO3JldHVybiBuZXcgUHJvbWlzZSgoSixRKT0+e2xldCBWPVouZ2V0KFpKKTtWLm9uc3VjY2Vzcz0oKT0+e2xldCBZPVYucmVzdWx0O0oodHlwZW9mIFk9PT0ic3RyaW5nIiYmWS5sZW5ndGg+MD9ZOnZvaWQgMCl9LFYub25lcnJvcj0oKT0+UShWLmVycm9yKX0pfSNaKCl7bGV0ICQ9dGhpcy5kYi50cmFuc2FjdGlvbihHMCwicmVhZHdyaXRlIiksWj0kLm9iamVjdFN0b3JlKEcwKTtyZXR1cm4gbmV3IFByb21pc2UoKEosUSk9PnskLm9uY29tcGxldGU9KCk9PkooKSwkLm9uZXJyb3I9KCk9PlEoJC5lcnJvciksWi5kZWxldGUoWkopfSl9fWZ1bmN0aW9uIGFWKCQpe2lmKCQ9PT12b2lkIDB8fCQ9PT1udWxsfHx0eXBlb2YgJCE9PSJvYmplY3QiKXJldHVybjtsZXQgWj0kO2lmKCEoWi5zZWFsZWRNYXN0ZXIgaW5zdGFuY2VvZiBVaW50OEFycmF5KXx8IShaLnNhbHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSlyZXR1cm47bGV0W0osUV09ajAoWi5zZWFsZWRNYXN0ZXIpO2lmKFEhPT0wfHxKPT09dm9pZCAwKXJldHVybjtyZXR1cm57c2VhbGVkTWFzdGVyOkosc2FsdDpaLnNhbHQuc2xpY2UoKSxjcmVkSWQ6Wi5jcmVkSWQgaW5zdGFuY2VvZiBVaW50OEFycmF5P1ouY3JlZElkLnNsaWNlKCk6dm9pZCAwfX1jbGFzcyBRSntkYjtjb25zdHJ1Y3RvcigkKXt0aGlzLmRiPSR9YXN5bmMgZW5xKCQsWil7bGV0IEo9Wy4uLlpdO2lmKEoubGVuZ3RoPT09MClyZXR1cm47bGV0IFE9dGhpcy5kYi50cmFuc2FjdGlvbih6MCwicmVhZHdyaXRlIiksVj1RLm9iamVjdFN0b3JlKHowKTtyZXR1cm4gbmV3IFByb21pc2UoKFksWCk9PntRLm9uY29tcGxldGU9KCk9PlkoKSxRLm9uZXJyb3I9KCk9PlgoUS5lcnJvcik7Zm9yKGxldCBXIG9mIEope2xldCB6PU4wKFcpO1YucHV0KHtob3N0OiQsaGFzaDp6fSl9fSl9YXN5bmMgZGVxKCQsWil7bGV0IEo9Wy4uLlpdO2lmKEoubGVuZ3RoPT09MClyZXR1cm47bGV0IFE9dGhpcy5kYi50cmFuc2FjdGlvbih6MCwicmVhZHdyaXRlIiksVj1RLm9iamVjdFN0b3JlKHowKTtyZXR1cm4gbmV3IFByb21pc2UoKFksWCk9PntRLm9uY29tcGxldGU9KCk9PlkoKSxRLm9uZXJyb3I9KCk9PlgoUS5lcnJvcik7Zm9yKGxldCBXIG9mIEope2xldCB6PU4wKFcpO1YuZGVsZXRlKFskLHpdKX19KX1hc3luYyBsaXN0KCQpe2xldCBKPXRoaXMuZGIudHJhbnNhY3Rpb24oejAsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoejApO3JldHVybiBuZXcgUHJvbWlzZSgoUSxWKT0+e2xldCBZPUouZ2V0QWxsKCk7WS5vbnN1Y2Nlc3M9KCk9PntsZXQgVz1ZLnJlc3VsdC5maWx0ZXIoKHopPT56Lmhvc3Q9PT0kKS5tYXAoKHopPT56Lmhhc2gpO1EoVy5tYXAoKHopPT5EJCh6KSkpfSxZLm9uZXJyb3I9KCk9PlYoWS5lcnJvcil9KX1hc3luYyBjb3VudCgpe2xldCBaPXRoaXMuZGIudHJhbnNhY3Rpb24oejAsInJlYWRvbmx5Iikub2JqZWN0U3RvcmUoejApO3JldHVybiBuZXcgUHJvbWlzZSgoSixRKT0+e2xldCBWPVouY291bnQoKTtWLm9uc3VjY2Vzcz0oKT0+SihWLnJlc3VsdCksVi5vbmVycm9yPSgpPT5RKFYuZXJyb3IpfSl9YXN5bmMgd2lwZSgpe2xldCAkPXRoaXMuZGIudHJhbnNhY3Rpb24oejAsInJlYWR3cml0ZSIpLFo9JC5vYmplY3RTdG9yZSh6MCk7cmV0dXJuIG5ldyBQcm9taXNlKChKLFEpPT57JC5vbmNvbXBsZXRlPSgpPT5KKCksJC5vbmVycm9yPSgpPT5RKCQuZXJyb3IpLFouY2xlYXIoKX0pfX12YXIgRzA9InNlZWRNZXRhIixaMD0iaG9zdHMiLHowPSJ1cGxvYWRRdWV1ZSIsVzA9ImRvd25sb2FkUXVldWUiLHU9Im1lc3NhZ2VzIixxJD0iYXBsZCIsVFE9MyxEUT0iZGlwbG9tYXRpYy1zdG9yZS1kYiI7Y2xhc3MgalF7c2VlZDtob3N0czt1cGxvYWRzO2Rvd25sb2FkczttZXNzYWdlcztkYjtjb25zdHJ1Y3RvcigkLFope3RoaXMuZGI9JCx0aGlzLnNlZWQ9bmV3IEpKKCQsWiksdGhpcy5ob3N0cz1uZXcgdFooJCksdGhpcy51cGxvYWRzPW5ldyBRSigkKSx0aGlzLmRvd25sb2Fkcz1uZXcgc1ooJCksdGhpcy5tZXNzYWdlcz1uZXcgZVooJCxaKX1hc3luYyB3aXBlKCl7YXdhaXQgdGhpcy5ob3N0cy53aXBlKCksYXdhaXQgdGhpcy51cGxvYWRzLndpcGUoKSxhd2FpdCB0aGlzLmRvd25sb2Fkcy53aXBlKCksYXdhaXQgdGhpcy5tZXNzYWdlcy53aXBlKCl9fWFzeW5jIGZ1bmN0aW9uIHNWKCl7cmV0dXJuIG5ldyBQcm9taXNlKCgkLFopPT57bGV0IEo9aW5kZXhlZERCLm9wZW4oRFEsVFEpO0oub251cGdyYWRlbmVlZGVkPSgpPT57bGV0e3Jlc3VsdDpRLHRyYW5zYWN0aW9uOlZ9PUo7aWYoIVEub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhHMCkpUS5jcmVhdGVPYmplY3RTdG9yZShHMCk7aWYoIVEub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhaMCkpUS5jcmVhdGVPYmplY3RTdG9yZShaMCx7a2V5UGF0aDoibGFiZWwifSk7aWYoIVEub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh6MCkpUS5jcmVhdGVPYmplY3RTdG9yZSh6MCx7a2V5UGF0aDpbImhvc3QiLCJoYXNoIl19KTtpZighUS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFcwKSlRLmNyZWF0ZU9iamVjdFN0b3JlKFcwKTtsZXQgWTtpZighUS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHUpKVk9US5jcmVhdGVPYmplY3RTdG9yZSh1KTtlbHNle2lmKCFWKXRocm93IEVycm9yKCJtaXNzaW5nIHVwZ3JhZGUgdHJhbnNhY3Rpb24gZm9yIG1lc3NhZ2VzIHN0b3JlIik7WT1WLm9iamVjdFN0b3JlKHUpfWlmKCFZLmluZGV4TmFtZXMuY29udGFpbnMocSQpKVkuY3JlYXRlSW5kZXgocSQsImFwbGQiLHt1bmlxdWU6ITF9KX0sSi5vbmJsb2NrZWQ9KCk9Pntjb25zb2xlLndhcm4oYFtESVBMT01BVElDXSBwcm90b2NvbCBzdG9yZSBJREIgdXBncmFkZSBibG9ja2VkICgke0RRfSDihpIgdiR7VFF9KTsgd2FpdGluZyBmb3Igb3RoZXIgY29ubmVjdGlvbnMgdG8gY2xvc2VgKX0sSi5vbnN1Y2Nlc3M9KCk9PntsZXQgUT1KLnJlc3VsdDtRLm9udmVyc2lvbmNoYW5nZT0oKT0+e1EuY2xvc2UoKX0sJChRKX0sSi5vbmVycm9yPSgpPT5aKEouZXJyb3I/P0Vycm9yKCJwcm90b2NvbCBzdG9yZSBJbmRleGVkREIgb3BlbiBmYWlsZWQiKSl9KX1hc3luYyBmdW5jdGlvbiBBUSgkKXtsZXQgWj1hd2FpdCBzVigpO2lmKHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc3RvcmFnZT8ucGVyc2lzdCl0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFtuYXZpZ2F0b3Iuc3RvcmFnZS5wZXJzaXN0KCksbmV3IFByb21pc2UoKEopPT57c2V0VGltZW91dCgoKT0+SighMSksMjAwMCl9KV0pfWNhdGNoe31yZXR1cm4gbmV3IGpRKFosJCl9Y2xhc3MgVkp7Y2xpZW50O2VudERCO3Bvc3Q7d2hlblJlYWR5O3Jlc29sdmVSZWFkeTtyZWplY3RSZWFkeTtjb25zdHJ1Y3RvcigkKXt0aGlzLnBvc3Q9JCx0aGlzLndoZW5SZWFkeT1uZXcgUHJvbWlzZSgoWixKKT0+e3RoaXMucmVzb2x2ZVJlYWR5PVosdGhpcy5yZWplY3RSZWFkeT1KfSl9YXN5bmMgaW5pdCgpe3RyeXtsZXQgJD1hd2FpdCBBUShVJCksWj1hd2FpdCB2Sih7Y2FjaGU6ITF9KSxKPW5ldyBrJChaLmFwcGx5LCgpPT5aLmNsZWFyKCksKFkpPT57aWYoWS5sZW5ndGg8MSlyZXR1cm47dGhpcy5wb3N0KHtraW5kOiJkaXJ0eSIsZWlkczpZLm1hcCgoWCk9Plguc2xpY2UoKSl9KX0pLFE9Si5jbGVhcjtKLmNsZWFyPWFzeW5jKCk9PntsZXQgWT1hd2FpdCBRKCk7aWYoWT09PTApdGhpcy5wb3N0KHtraW5kOiJ3aXBlZCJ9KTtyZXR1cm4gWX07bGV0IFY9bmV3IGtaKG5ldyBYWixKLCQsX0osVSQpO3RoaXMuY2xpZW50PVYsdGhpcy5lbnREQj1aLFYuY2xpZW50U3RhdGUubGlzdGVuKCgpPT57dGhpcy5lbWl0Q2xpZW50U3RhdGUoKX0pLFYueGZlclN0YXRlLmxpc3RlbigoKT0+e3RoaXMuZW1pdFhmZXJTdGF0ZSgpfSksYXdhaXQgdGhpcy5lbWl0Q2xpZW50U3RhdGUoKSxhd2FpdCB0aGlzLmVtaXRYZmVyU3RhdGUoKSx0aGlzLnBvc3Qoe2tpbmQ6InJlYWR5In0pLHRoaXMubWFya1JlYWR5KCl9Y2F0Y2goJCl7bGV0IFo9JCBpbnN0YW5jZW9mIEVycm9yPyQ6RXJyb3IoU3RyaW5nKCQpKTt0aHJvdyB0aGlzLnBvc3Qoe2tpbmQ6ImluaXRFcnJvciIsbWVzc2FnZTpaLm1lc3NhZ2V9KSx0aGlzLmZhaWxSZWFkeShaKSxafX1tYXJrUmVhZHkoKXtsZXQgJD10aGlzLnJlc29sdmVSZWFkeTtpZih0aGlzLnJlc29sdmVSZWFkeT12b2lkIDAsdGhpcy5yZWplY3RSZWFkeT12b2lkIDAsJCkkKCl9ZmFpbFJlYWR5KCQpe2xldCBaPXRoaXMucmVqZWN0UmVhZHk7aWYodGhpcy5yZXNvbHZlUmVhZHk9dm9pZCAwLHRoaXMucmVqZWN0UmVhZHk9dm9pZCAwLFopWigkKX1yZXF1aXJlQ2xpZW50KCl7aWYoIXRoaXMuY2xpZW50KXRocm93IEVycm9yKCJXb3JrZXJSdW50aW1lIG5vdCBpbml0aWFsaXplZCIpO3JldHVybiB0aGlzLmNsaWVudH1hc3luYyBlbWl0Q2xpZW50U3RhdGUoKXtsZXQgJD10aGlzLmNsaWVudDtpZighJClyZXR1cm47bGV0IFo9YXdhaXQgJC5jbGllbnRTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6ImNsaWVudFN0YXRlIixzdGF0ZTpafSl9YXN5bmMgZW1pdFhmZXJTdGF0ZSgpe2xldCAkPXRoaXMuY2xpZW50O2lmKCEkKXJldHVybjtsZXQgWj1hd2FpdCAkLnhmZXJTdGF0ZS5nZXQoKTt0aGlzLnBvc3Qoe2tpbmQ6InhmZXJTdGF0ZSIsc3RhdGU6Wn0pfWhvc3RGcm9tU2VyaWFsaXplZCgkKXtyZXR1cm57aGFuZGxlOm5ldyBVUkwoJC5oYW5kbGUpLGxhYmVsOiQubGFiZWwsaWR4OiQuaWR4fX1hc3luYyBoYW5kbGUoJCl7YXdhaXQgdGhpcy53aGVuUmVhZHk7bGV0IFo9dGhpcy5yZXF1aXJlQ2xpZW50KCk7c3dpdGNoKCQub3Ape2Nhc2UicGluZyI6cmV0dXJuInBvbmciO2Nhc2Uic2V0U2VlZCI6e2xldFtKLFFdPSQwLmZyb21CeXRlcyhVJCwkLnNlZWQpO2lmKFEhPT0wfHxKPT09dm9pZCAwKXRocm93IG5ldyBLMChRKTthd2FpdCBaLnNldFNlZWQoSix7cGVyc2lzdDokLnBlcnNpc3R9KTtyZXR1cm59Y2FzZSJsaW5rIjp7YXdhaXQgWi5saW5rKHRoaXMuaG9zdEZyb21TZXJpYWxpemVkKCQuaG9zdCksJC5jb25uZWN0Pz8hMCk7cmV0dXJufWNhc2UidW5saW5rIjp7YXdhaXQgWi51bmxpbmsoJC5sYWJlbCk7cmV0dXJufWNhc2UiY29ubmVjdCI6e2F3YWl0IFouY29ubmVjdCgkLmxpc3Rlbj8/ITAsJC5zeW5jPz8hMCk7cmV0dXJufWNhc2UiZGlzY29ubmVjdCI6e2F3YWl0IFouZGlzY29ubmVjdCgpO3JldHVybn1jYXNlInN5bmMiOnJldHVybiBhd2FpdCBaLnN5bmMoKTtjYXNlInJlYnVpbGQiOnJldHVybiBhd2FpdCBaLnJlYnVpbGQoe2NoZWNrSG9zdDokLmNoZWNrSG9zdD8/ITB9KTtjYXNlInJlY29uY2lsZSI6e2xldFtKLFFdPWF3YWl0IFoucmVjb25jaWxlKCQuaG9zdExhYmVsLHtwdWxsOiQucHVsbCxwdXNoOiQucHVzaCxzeW5jOiQuc3luY30pO2lmKFEhPT0wKXRocm93IG5ldyBLMChRKTtpZighSil0aHJvdyBuZXcgSzAoMTIpO3JldHVybiBKfWNhc2UibXNnY2hlY2siOnJldHVybiBhd2FpdCBaLm1zZ2NoZWNrKCk7Y2FzZSJlbnRjaGVjayI6e2xldCBKPXRoaXMuZW50REI7aWYoIUopdGhyb3cgbmV3IEswKDEyKTtsZXRbUSxWXT1hd2FpdCBKLmNoZWNrc3VtKFUkKTtpZihWIT09MCl0aHJvdyBuZXcgSzAoVik7aWYoIVEpdGhyb3cgbmV3IEswKDEyKTtyZXR1cm4gUX1jYXNlIndpcGUiOnthd2FpdCBaLndpcGUoe21zZ3M6JC5tc2dzLGVudHM6JC5lbnRzLG1ldGE6JC5tZXRhLHNlZWQ6JC5zZWVkfSk7cmV0dXJufWNhc2UiaW1wb3J0Ijp7bGV0IEo9JC5ieXRlcy5zbGljZSgpLFE9bmV3IEJsb2IoW0pdKSxWPW5ldyBGaWxlKFtRXSwiaW1wb3J0LmRpcCIpO3JldHVybiBhd2FpdCBaLmltcG9ydChWKX1jYXNlImV4cG9ydCI6e2xldFtKLFFdPWF3YWl0IFouZXhwb3J0Qnl0ZXMoKTtpZihRIT09MCl0aHJvdyBuZXcgSzAoUSk7aWYoIUopdGhyb3cgbmV3IEswKDEyKTtyZXR1cm4gSn1jYXNlImdldENsaWVudFN0YXRlIjpyZXR1cm4gYXdhaXQgWi5jbGllbnRTdGF0ZS5nZXQoKTtjYXNlImdldFhmZXJTdGF0ZSI6cmV0dXJuIGF3YWl0IFoueGZlclN0YXRlLmdldCgpO2RlZmF1bHQ6e2xldCBKPSQ7dGhyb3cgRXJyb3IoInVua25vd24gd29ya2VyIGNvbW1hbmQiKX19fX1jbGFzcyBLMCBleHRlbmRzIEVycm9ye3N0YXR1cztjb25zdHJ1Y3RvcigkKXtzdXBlcihgV29ya2VyU3RhdHVzRXJyb3I6ICR7alskXX1gKTt0aGlzLnN0YXR1cz0kO3RoaXMubmFtZT0iV29ya2VyU3RhdHVzRXJyb3IifX1mdW5jdGlvbiB0JCgkLFope3JldHVybntraW5kOiJyZXBseSIsaWQ6JCxvazohMCxyZXN1bHQ6Wn19ZnVuY3Rpb24gWUooJCxaKXtyZXR1cm57a2luZDoicmVwbHkiLGlkOiQsb2s6ITEsc3RhdHVzOlp9fXZhciBBMD1nbG9iYWxUaGlzLF9RPW5ldyBWSigoJCxaKT0+e2lmKFomJloubGVuZ3RoPjApQTAucG9zdE1lc3NhZ2UoJCxaKTtlbHNlIEEwLnBvc3RNZXNzYWdlKCQpfSk7QTAub25tZXNzYWdlPSgkKT0+e2xldCBaPSQuZGF0YTtpZighekooWikpcmV0dXJuO3RWKFopfTthc3luYyBmdW5jdGlvbiB0VigkKXt0cnl7bGV0IFo9YXdhaXQgX1EuaGFuZGxlKCQpO2lmKCgkLm9wPT09ImV4cG9ydCJ8fCQub3A9PT0ibXNnY2hlY2sifHwkLm9wPT09ImVudGNoZWNrIikmJlogaW5zdGFuY2VvZiBVaW50OEFycmF5KXtsZXQgSj1aLnNsaWNlKCk7QTAucG9zdE1lc3NhZ2UodCQoJC5pZCxKKSxbSi5idWZmZXJdKTtyZXR1cm59aWYoJC5vcD09PSJyZWNvbmNpbGUiJiZaJiZ0eXBlb2YgWj09PSJvYmplY3QiJiYibXNnY2hlY2siaW4gWiYmWi5tc2djaGVjayBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2xldCBKPVoubXNnY2hlY2suc2xpY2UoKSxRPXsuLi5aLG1zZ2NoZWNrOkp9O0EwLnBvc3RNZXNzYWdlKHQkKCQuaWQsUSksW0ouYnVmZmVyXSk7cmV0dXJufUEwLnBvc3RNZXNzYWdlKHQkKCQuaWQsWikpfWNhdGNoKFope2lmKFogaW5zdGFuY2VvZiBLMCl7QTAucG9zdE1lc3NhZ2UoWUooJC5pZCxaLnN0YXR1cykpO3JldHVybn1jb25zb2xlLmVycm9yKCJ3b3JrZXIgY29tbWFuZCBmYWlsZWQiLFopLEEwLnBvc3RNZXNzYWdlKFlKKCQuaWQsMTIpKX19X1EuaW5pdCgpLmNhdGNoKCgkKT0+e2NvbnNvbGUuZXJyb3IoIndvcmtlciBpbml0IGZhaWxlZCIsJCl9KTsK";var LW;function QK(){if(typeof pW!=="string"||pW.length===0)throw Error("[DIPLOMATIC] worker source not embedded; run pkg build before spawn");return atob(pW)}function MK(){if(LW!==void 0)return LW;let Z=new Blob([QK()],{type:"text/javascript"});return LW=URL.createObjectURL(Z),LW}function ql(){if(typeof Worker>"u")throw Error("[DIPLOMATIC] Worker API unavailable; cannot spawn sync worker");return new Worker(MK(),{type:"module"})}var zK=new TextEncoder().encode("diplomatic.wrap.v1"),hK=32,SK=16;class ${#W;#Z;constructor(Z,X){this.#W=Z,this.#Z=X}static async fromRandom(Z){let X=await Z.gen256BitSecureRandomSeed(),[W,V]=ZZ(X);if(V!==0||W===void 0)throw Error(`enclave: invalid random seed (${V})`);return new $(W,Z)}static fromBytes(Z,X){let[W,V]=ZZ(X);if(V!==0)return Y(V);if(W===void 0)return Y(10);let[l,K]=ZZ(W.slice());if(K!==0)return Y(K);if(l===void 0)return Y(10);return d(new $(l,Z))}async sealWithPasskey(Z){let X=Z?.salt??jX,W=Z?.credId;if(W===void 0&&Z?.createCredIfNeeded===!0){let[K,G]=await gV({rpId:Z?.rpId,rpName:Z?.rpName,userName:Z?.userName??"diplomatic-prf"});if(G!==0)return Y(G);if(K===void 0)return Y(24);if(!K.prfEnabled)return Y(24);W=K.credId}let[V,l]=await bX({rpId:Z?.rpId,rpName:Z?.rpName,credId:W,salt:X});if(l!==0)return Y(l);if(V===void 0)return Y(7);try{let[K,G]=await this.#X(V.prf);if(G!==0)return Y(G);if(K===void 0)return Y(12);return d({sealedMaster:K,salt:X.slice(),credId:V.credId.slice()})}finally{V.prf.fill(0)}}static async unsealWithPasskey(Z,X,W){let[V,l]=await bX({rpId:W.rpId,rpName:W.rpName,credId:W.credId,salt:W.salt});if(l!==0)return Y(l);if(V===void 0)return Y(7);try{return await $.#V(Z,X,V.prf)}finally{V.prf.fill(0)}}async persistToLargeBlob(Z=[],X){let W=X?.credId;if(W===void 0){let[K,G]=await TW(X);if(G!==0)return Y(G);if(K===void 0)return Y(24);W=K}let[V,l]=this.#l(Z);if(l!==0)return Y(l);if(V===void 0)return Y(12);try{let K=await BX(W,V,X);if(K!==0)return Y(K);return d(W)}finally{V.fill(0)}}static async fromLargeBlob(Z,X){let[W,V]=await IW(X?.credId,X);if(V!==0)return Y(V);if(W===void 0)return Y(7);try{return $.#m(Z,W.blob,W.credId)}finally{W.blob.fill(0)}}static async clearLargeBlob(Z,X){return BX(Z,new Uint8Array(dZ),X)}async sealPairPackageBody(Z,X){let W=X?.salt??jX,[V,l]=await bX({rpId:X?.rpId,rpName:X?.rpName,credId:X?.credId,salt:W});if(l!==0)return Y(l);if(V===void 0)return Y(7);try{let[K,G]=await EX(this.#Z,V.prf);if(G!==0)return Y(G);if(K===void 0)return Y(12);let[m,R]=ZZ(this.#W.slice());if(R!==0)return Y(R);if(m===void 0)return Y(10);let J={masterSeed:m,hosts:Z.map((k)=>({handle:k.handle,label:k.label,idx:k.idx??0}))},C=new i,F=C.writeStruct(UX,J);if(F!==0)return m.fill(0),Y(F);let b=C.result();m.fill(0);let c;try{c=await this.#Z.encryptXSalsa20Poly1305Combined(b,K)}catch{return b.fill(0),Y(12)}return b.fill(0),d({body:c,salt:W.slice(),credId:V.credId.slice()})}finally{V.prf.fill(0)}}static async openPairPackageBody(Z,X,W){let[V,l]=await bX({rpId:W.rpId,rpName:W.rpName,credId:W.credId,salt:W.salt});if(l!==0)return Y(l);if(V===void 0)return Y(7);try{let[K,G]=await EX(Z,V.prf);if(G!==0)return Y(G);if(K===void 0)return Y(12);let m;try{m=await Z.decryptXSalsa20Poly1305Combined(X,K)}catch{return Y(20)}let R=new P(m),[J,C]=R.readStruct(UX);if(m.fill(0),C!==0)return Y(C);if(J===void 0)return Y(14);let[F,b]=$.fromBytes(Z,J.masterSeed);if(J.masterSeed.fill(0),b!==0)return Y(b);if(F===void 0)return Y(12);let[c,k]=await F.#X(V.prf);if(k!==0)return Y(k);if(c===void 0)return Y(12);return d({enclave:F,hosts:J.hosts.map((T)=>({...T})),sealedMaster:c,credId:V.credId.slice()})}finally{V.prf.fill(0)}}spawnSyncWorker(Z){let X=ql(),W=this.#W.slice();return X.postMessage({id:Z.id,op:"setSeed",seed:W,persist:Z.persist},[W.buffer]),X}deriveCipher(Z,X){let W=Z.slice(),V=(G)=>this.#Y(W,G),l=(G)=>this.#R(W,G);return{encrypt:Object.freeze({encrypt:V}),decrypt:Object.freeze({decrypt:l}),both:Object.freeze({encrypt:V,decrypt:l})}[X]}async deriveIdentity(Z,X=0){let W=Z,V=X,l=await this.#G(W,V);return Object.freeze({publicKey:l.publicKey,sign:(K)=>this.#C(W,V,K),kdmFor:(K)=>this.#F(W,V,K)})}async#X(Z){let[X,W]=await EX(this.#Z,Z);if(W!==0)return Y(W);if(X===void 0)return Y(12);try{let V=await this.#Z.encryptXSalsa20Poly1305Combined(this.#W,X);return LZ(V)}catch{return Y(12)}}static async#V(Z,X,W){let[,V]=LZ(X);if(V!==0)return Y(V);let[l,K]=await EX(Z,W);if(K!==0)return Y(K);if(l===void 0)return Y(12);try{let G=await Z.decryptXSalsa20Poly1305Combined(X,l);return $.fromBytes(Z,G)}catch{return Y(20)}}#l(Z){let[X,W]=ZZ(this.#W.slice());if(W!==0)return Y(W);if(X===void 0)return Y(10);let[V,l]=SV(X,Z);if(l!==0)return X.fill(0),Y(l);if(V===void 0)return X.fill(0),Y(12);X.fill(0);let K=new i,G=K.writeStruct(cW,V);if(V.masterSeed.fill(0),G!==0)return Y(G);return d(K.result())}static#m(Z,X,W){if(X.byteLength===0||X.every((R)=>R===0))return Y(22);if(X.byteLength===dZ){let[R,J]=$.fromBytes(Z,X);if(J!==0)return Y(J);if(R===void 0)return Y(12);return d({enclave:R,hosts:[],credId:W})}let V=new P(X),[l,K]=V.readStruct(cW);if(K!==0)return Y(K);if(l===void 0)return Y(14);let[G,m]=$.fromBytes(Z,l.masterSeed);if(l.masterSeed.fill(0),m!==0)return Y(m);if(G===void 0)return Y(12);return d({enclave:G,hosts:l.hosts.map((R)=>({...R})),credId:W})}async#Y(Z,X){let W=await this.#K(Z);return this.#Z.encryptXSalsa20Poly1305Combined(X,W)}async#R(Z,X){let W=await this.#K(Z);return this.#Z.decryptXSalsa20Poly1305Combined(X,W)}async#K(Z){return this.#Z.blake3(yX(this.#W,Z))}async#J(Z,X){let W=new TextEncoder().encode(Z),V=new Uint8Array(8);return new DataView(V.buffer).setBigUint64(0,BigInt(X),!1),await this.#K(yX(W,V))}async#G(Z,X){let W=await this.#J(Z,X);return this.#Z.deriveEd25519KeyPair(W)}async#C(Z,X,W){let V=await this.#G(Z,X);return this.#Z.signEd25519(W,V.privateKey)}async#F(Z,X,W){let V=await this.#G(Z,X),l=yX(V.privateKey,W);return(await this.#Z.blake3(l)).slice(0,HZ)}}async function EX(Z,X){if(X.byteLength<SK)return Y(10);let W=await Z.blake3(yX(X,zK));return d(W.slice(0,hK))}class yW{#W;#Z;#X;#V;#l;constructor(Z){if(this.#W=Z.crypto,this.#l=Z.persistMeta,this.#V={rpId:Z.rpId,rpName:Z.rpName},Z.meta!==void 0)this.#X=cX(Z.meta)}get meta(){return this.#X===void 0?void 0:cX(this.#X)}setMeta(Z){this.#X=Z===void 0?void 0:cX(Z)}async save(Z,X){if(X?.persist===!0)return Promise.reject(Error("prf-store: use wrapAndSave(enclave) to persist sealed master"));return this.#Z=Z,this.#Z}async wrapAndSave(Z,X){let[W,V]=await Z.sealWithPasskey({...this.#V,salt:X?.salt,credId:X?.credId??this.#X?.credId,createCredIfNeeded:X?.createCredIfNeeded??X?.credId===void 0,userName:"diplomatic-prf"});if(V!==0)return Y(V);if(W===void 0)return Y(12);let l={sealedMaster:W.sealedMaster,salt:W.salt,credId:W.credId};return this.#X=l,this.#Z=Z,await this.#l(cX(l)),d(this.#Z)}async load(){return this.#Z}async unlock(){let Z=this.#X;if(Z===void 0)return Y(22);let[X,W]=await $.unsealWithPasskey(this.#W,Z.sealedMaster,{...this.#V,salt:Z.salt,credId:Z.credId});if(W!==0)return Y(W);if(X===void 0)return Y(12);return this.#Z=X,d(X)}async adoptSealed(Z,X){return this.#X=cX(X),this.#Z=Z,await this.#l(cX(X)),d(this.#Z)}async wipe(){this.#Z=void 0,this.#X=void 0,await this.#l(void 0)}}function cX(Z){let[X,W]=LZ(Z.sealedMaster.slice());return{sealedMaster:W===0&&X!==void 0?X:Z.sealedMaster,salt:Z.salt.slice(),credId:Z.credId===void 0?void 0:Z.credId.slice()}}var xV="seed",QW="prfMeta";class MW{enclave;db;#W;constructor(Z,X){this.db=Z,this.#W=X}async save(Z,X){return this.enclave=Z,this.enclave}async load(){if(this.enclave)return this.enclave;let Z=await this.#Z();if(Z===void 0||Z==="")return;let X=iZ(Z),[W,V]=$.fromBytes(this.#W,X);if(X.fill(0),await this.#X(),V!==0||W===void 0)return;return this.enclave=W,this.enclave}async clearSession(){this.enclave=void 0,await this.#X()}async wipe(){this.enclave=void 0;let Z=this.db.transaction(JZ,"readwrite"),X=Z.objectStore(JZ);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.delete(xV),X.delete(QW)})}async loadPrfMeta(){let X=this.db.transaction(JZ,"readonly").objectStore(JZ);return new Promise((W,V)=>{let l=X.get(QW);l.onsuccess=()=>{W(NK(l.result))},l.onerror=()=>V(l.error)})}async persistPrfMeta(Z){let X=this.db.transaction(JZ,"readwrite"),W=X.objectStore(JZ);return new Promise((V,l)=>{if(X.oncomplete=()=>V(),X.onerror=()=>l(X.error),Z===void 0){W.delete(QW);return}let K={sealedMaster:Z.sealedMaster.slice(),salt:Z.salt.slice(),credId:Z.credId===void 0?void 0:Z.credId.slice()};W.put(K,QW)})}async hasPrfMeta(){return await this.loadPrfMeta()!==void 0}async openPrfStore(Z){let X=await this.loadPrfMeta();return new yW({crypto:Z.crypto??this.#W,rpId:Z.rpId,rpName:Z.rpName,meta:X,persistMeta:(W)=>this.persistPrfMeta(W)})}#Z(){let X=this.db.transaction(JZ,"readonly").objectStore(JZ);return new Promise((W,V)=>{let l=X.get(xV);l.onsuccess=()=>{let K=l.result;W(typeof K==="string"&&K.length>0?K:void 0)},l.onerror=()=>V(l.error)})}#X(){let Z=this.db.transaction(JZ,"readwrite"),X=Z.objectStore(JZ);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.delete(xV)})}}function NK(Z){if(Z===void 0||Z===null||typeof Z!=="object")return;let X=Z;if(!(X.sealedMaster instanceof Uint8Array)||!(X.salt instanceof Uint8Array))return;let[W,V]=LZ(X.sealedMaster);if(V!==0||W===void 0)return;return{sealedMaster:W,salt:X.salt.slice(),credId:X.credId instanceof Uint8Array?X.credId.slice():void 0}}class HV{db;constructor(Z){this.db=Z}async enq(Z,X){let W=[...X];if(W.length===0)return;let V=this.db.transaction(CZ,"readwrite"),l=V.objectStore(CZ);return new Promise((K,G)=>{V.oncomplete=()=>K(),V.onerror=()=>G(V.error);for(let m of W){let R=GZ(m);l.put({host:Z,hash:R})}})}async deq(Z,X){let W=[...X];if(W.length===0)return;let V=this.db.transaction(CZ,"readwrite"),l=V.objectStore(CZ);return new Promise((K,G)=>{V.oncomplete=()=>K(),V.onerror=()=>G(V.error);for(let m of W){let R=GZ(m);l.delete([Z,R])}})}async list(Z){let W=this.db.transaction(CZ,"readonly").objectStore(CZ);return new Promise((V,l)=>{let K=W.getAll();K.onsuccess=()=>{let m=K.result.filter((R)=>R.host===Z).map((R)=>R.hash);V(m.map((R)=>iZ(R)))},K.onerror=()=>l(K.error)})}async count(){let X=this.db.transaction(CZ,"readonly").objectStore(CZ);return new Promise((W,V)=>{let l=X.count();l.onsuccess=()=>W(l.result),l.onerror=()=>V(l.error)})}async wipe(){let Z=this.db.transaction(CZ,"readwrite"),X=Z.objectStore(CZ);return new Promise((W,V)=>{Z.oncomplete=()=>W(),Z.onerror=()=>V(Z.error),X.clear()})}}var JZ="seedMeta",lZ="hosts",CZ="uploadQueue",RZ="downloadQueue",o="messages",PX="apld",al=3,_l="diplomatic-store-db";class PV{seed;hosts;uploads;downloads;messages;db;constructor(Z,X){this.db=Z,this.seed=new MW(Z,X),this.hosts=new zV(Z),this.uploads=new HV(Z),this.downloads=new MV(Z),this.messages=new hV(Z,X)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}async function gK(){return new Promise((Z,X)=>{let W=indexedDB.open(_l,al);W.onupgradeneeded=()=>{let{result:V,transaction:l}=W;if(!V.objectStoreNames.contains(JZ))V.createObjectStore(JZ);if(!V.objectStoreNames.contains(lZ))V.createObjectStore(lZ,{keyPath:"label"});if(!V.objectStoreNames.contains(CZ))V.createObjectStore(CZ,{keyPath:["host","hash"]});if(!V.objectStoreNames.contains(RZ))V.createObjectStore(RZ);let K;if(!V.objectStoreNames.contains(o))K=V.createObjectStore(o);else{if(!l)throw Error("missing upgrade transaction for messages store");K=l.objectStore(o)}if(!K.indexNames.contains(PX))K.createIndex(PX,"apld",{unique:!1})},W.onblocked=()=>{console.warn(`[DIPLOMATIC] protocol store IDB upgrade blocked (${_l} → v${al}); waiting for other connections to close`)},W.onsuccess=()=>{let V=W.result;V.onversionchange=()=>{V.close()},Z(V)},W.onerror=()=>X(W.error??Error("protocol store IndexedDB open failed"))})}async function zW(Z){let X=await gK();if(typeof navigator<"u"&&navigator.storage?.persist)try{await Promise.race([navigator.storage.persist(),new Promise((W)=>{setTimeout(()=>W(!1),2000)})])}catch{}return new PV(X,Z)}function sl(Z){if(!Z||typeof Z!=="object")return!1;if(!("kind"in Z))return!1;return typeof Z.kind==="string"}function rl(Z){if(typeof Z!=="number")return;return Z}function tl(Z){if(!Z||typeof Z!=="object")return;if(!("hasSeed"in Z)||!("hasHost"in Z)||!("connected"in Z))return;if(typeof Z.hasSeed!=="boolean"||typeof Z.hasHost!=="boolean"||typeof Z.connected!=="boolean")return;return{hasSeed:Z.hasSeed,hasHost:Z.hasHost,connected:Z.connected}}function xK(Z){if(!Z||typeof Z!=="object")return;if(!("phase"in Z))return;let X=HK(Z.phase);if(X===void 0)return;let W={phase:X};if("host"in Z&&typeof Z.host==="string")W.host=Z.host;if("done"in Z&&typeof Z.done==="number")W.done=Z.done;if("total"in Z&&typeof Z.total==="number")W.total=Z.total;if("bytesDone"in Z&&typeof Z.bytesDone==="number")W.bytesDone=Z.bytesDone;if("bytesTotal"in Z&&typeof Z.bytesTotal==="number")W.bytesTotal=Z.bytesTotal;return W}function HK(Z){if(Z==="peek"||Z==="pull"||Z==="open"||Z==="exec"||Z==="push"||Z==="import"||Z==="idle"||Z==="apply")return Z==="apply"?"exec":Z;return}function el(Z){if(!Z||typeof Z!=="object")return;if(!("numUploads"in Z)||!("numDownloads"in Z))return;if(typeof Z.numUploads!=="number"||typeof Z.numDownloads!=="number")return;let X={phase:"idle"};if("progress"in Z){let W=xK(Z.progress);if(W===void 0)return;X=W}return{numUploads:Z.numUploads,numDownloads:Z.numDownloads,progress:X}}var FZ="[DIPLOMATIC]";class DX{worker;state;store;local;nextId=1;pending=new Map;readyTimeoutMs;scheduledSync;cachedClientState={hasSeed:!1,hasHost:!1,connected:!1};cachedXferState={numUploads:0,numDownloads:0,progress:oZ};clientState;xferState;constructor(Z,X,W,V,l){this.state=Z,this.store=X,this.readyTimeoutMs=l,this.clientState=new bZ(async()=>this.cachedClientState),this.xferState=new bZ(async()=>this.cachedXferState),this.scheduledSync=new NX(V,async()=>{if(!this.worker)return;try{await this.request({id:this.allocId(),op:"sync"})}catch(K){console.error(`${FZ} worker sync after local write failed`,K)}}),this.local=new vZ(W,Z,X,()=>{throw Error(`${FZ} local writer has no transport (use worker for network)`)},SZ,!0,void 0,void 0,()=>{this.scheduledSync.schedule()}),this.local.xferState.listen((K)=>{this.cachedXferState={numUploads:K.numUploads,numDownloads:K.numDownloads,progress:this.cachedXferState.progress},this.xferState.emit()})}bindWorker(Z){let X=this.worker;if(X){X.onmessage=null,X.onerror=null,X.onmessageerror=null;try{X.terminate()}catch{}}this.worker=Z,Z.onmessage=(W)=>{this.onMessage(W.data)},Z.onerror=(W)=>{console.error(`${FZ} worker error`,W),this.failPending(Error(`${FZ} worker failed to load`))},Z.onmessageerror=()=>{this.failPending(Error(`${FZ} worker message error`))}}failPending(Z){for(let[,X]of this.pending)X.reject(Z);this.pending.clear()}async flushScheduledSync(){await this.scheduledSync.flush()}static async open(Z,X,W={}){let V=W.clock??new pZ,l=W.syncDebounceMs??lW,K=W.readyTimeoutMs??15000,G=new DX(Z,X,V,l,K);return await G.hydrateStateFromStore(X),G}async hydrateStateFromStore(Z){let X=await Z.seed.load(),W=await Z.hosts.list();this.cachedClientState={hasSeed:X!==void 0,hasHost:Array.from(W).length>0,connected:!1};let V=await Z.uploads.count(),l=await Z.downloads.count();this.cachedXferState={numUploads:V,numDownloads:l,progress:oZ}}async pullRemoteState(){let Z=await this.request({id:this.allocId(),op:"getClientState"}),X=tl(Z);if(X!==void 0)this.cachedClientState=X;let W=await this.request({id:this.allocId(),op:"getXferState"}),V=el(W);if(V!==void 0)this.cachedXferState=V}requireWorker(){if(!this.worker)throw Error(`${FZ} no sync worker; call setSeed first`);return this.worker}async ping(){if(await this.request({id:this.allocId(),op:"ping"})!=="pong")throw Error(`${FZ} worker ping failed`)}terminate(){this.scheduledSync.cancel();let Z=this.worker;if(this.worker=void 0,Z)try{Z.terminate()}catch{}this.failPending(Error(`${FZ} worker terminated`))}onMessage(Z){if(!sl(Z))return;let X=Z;switch(X.kind){case"ready":return;case"initError":{this.failPending(Error(`${FZ} worker init failed: ${X.message}`));return}case"clientState":{this.cachedClientState=X.state,this.clientState.emit();return}case"xferState":{this.cachedXferState=X.state,this.xferState.emit();return}case"dirty":{this.state.refresh(X.eids.map(iK));return}case"wiped":{this.state.clear();return}case"reply":{let W=this.pending.get(X.id);if(!W)return;if(this.pending.delete(X.id),X.ok)W.resolve(X.result);else W.reject(new wX(X.status));return}default:return}}allocId(){let Z=this.nextId;return this.nextId+=1,Z}request(Z,X){let W=this.requireWorker();return new Promise((V,l)=>{if(this.pending.set(Z.id,{resolve:V,reject:l}),X&&X.length>0)W.postMessage(Z,X);else W.postMessage(Z)})}async requestStatus(Z,X){try{let W=await this.request(Z,X),V=rl(W);if(V!==void 0)return V;return 0}catch(W){if(W instanceof wX)return W.status;return 12}}serializeHost(Z){return{handle:Z.handle.href,label:Z.label,idx:Z.idx??0}}async setSeed(Z,X){await this.local.setSeed(Z,X),this.cachedClientState={...this.cachedClientState,hasSeed:!0},this.clientState.emit();let W=this.allocId(),V=this.readyTimeoutMs;await new Promise((l,K)=>{let G,m=(R)=>{if(G!==void 0)clearTimeout(G);R()};this.pending.set(W,{resolve:(R)=>m(()=>l(R)),reject:(R)=>m(()=>K(R))}),G=setTimeout(()=>{this.pending.delete(W),K(Error(`${FZ} setSeed worker timeout after ${V}ms`))},V);try{let R=Z.spawnSyncWorker({id:W,persist:X?.persist});this.bindWorker(R)}catch(R){if(this.pending.delete(W),G!==void 0)clearTimeout(G);K(R instanceof Error?R:Error(String(R)))}});try{await this.pullRemoteState()}catch{}}async link(Z,X=!0){await this.local.link(Z,!1),await this.request({id:this.allocId(),op:"link",host:this.serializeHost(Z),connect:X})}async unlink(Z){if(await this.local.unlink(Z),!this.worker)return;await this.request({id:this.allocId(),op:"unlink",label:Z})}async hosts(){return this.local.hosts()}async connect(Z=!0,X=!0){if(!this.worker)return;await this.request({id:this.allocId(),op:"connect",listen:Z,sync:X})}async disconnect(){if(!this.worker)return;await this.request({id:this.allocId(),op:"disconnect"})}async insertRaw(Z){return this.local.insertRaw(Z)}async updateRaw(Z,X,W){return this.local.updateRaw(Z,X,W)}async insert(Z){return this.local.insert(Z)}async update(Z){return this.local.update(Z)}async delete(Z){return this.local.delete(Z)}async genEID(Z){return this.local.genEID(Z)}async sync(){if(!this.worker)return 0;return this.requestStatus({id:this.allocId(),op:"sync"})}async rebuild(Z){return this.scheduledSync.cancel(),await this.scheduledSync.flush(),this.requestStatus({id:this.allocId(),op:"rebuild",checkHost:Z?.checkHost})}async listMsgs(Z){return this.local.listMsgs(Z)}async countMsgs(Z){return this.local.countMsgs(Z)}async reconcile(Z,X){try{let W=await this.request({id:this.allocId(),op:"reconcile",hostLabel:Z,pull:X?.pull,push:X?.push,sync:X?.sync});if(!PK(W))return Y(12);return d(W)}catch(W){if(W instanceof wX&&W.status!==0)return Y(W.status);return Y(12)}}async msgcheck(){let Z=await this.request({id:this.allocId(),op:"msgcheck"});if(!(Z instanceof Uint8Array))throw Error(`${FZ} msgcheck: expected Uint8Array`);return Z}async entcheck(){let Z=await this.request({id:this.allocId(),op:"entcheck"});if(!(Z instanceof Uint8Array))throw Error(`${FZ} entcheck: expected Uint8Array`);return Z}async wipe(Z){if(await this.local.wipe(Z),this.worker)await this.request({id:this.allocId(),op:"wipe",msgs:Z?.msgs,ents:Z?.ents,meta:Z?.meta,seed:Z?.seed});await this.hydrateStateFromStore(this.store),this.clientState.emit(),this.xferState.emit()}async import(Z){let X=new Uint8Array(await Z.arrayBuffer());return this.requestStatus({id:this.allocId(),op:"import",bytes:X},[X.buffer])}async export(Z,X){try{let W=await this.request({id:this.allocId(),op:"export"});if(!(W instanceof Uint8Array))return 12;let V=new Blob([W.slice()]);return GW(V,Z),0}catch(W){if(W instanceof wX)return W.status;return 12}}}class wX extends Error{status;constructor(Z){super(`WorkerReplyError: ${z[Z]}`);this.status=Z;this.name="WorkerReplyError"}}function PK(Z){if(!Z||typeof Z!=="object")return!1;let X=Z;return X.msgcheck instanceof Uint8Array&&X.msgcheck.length===32&&typeof X.numBags==="number"&&typeof X.numDupes==="number"}function iK(Z){return Z}var kX="[DIPLOMATIC]";async function hW(Z){let X=Z.clock??new pZ;if(Z.worker===!0&&UK(Z)!==void 0)throw Error(`${kX} worker path requires IndexedDB on both sides; do not pass store (got a custom store)`);if(Z.worker!==!0){console.info(`${kX} sync on main thread `+"(no worker — app did not request a worker)");let l=await Z0(Z.store);return uK(X,Z.state,l)}if(typeof Worker>"u")throw Error(`${kX} worker: true but Worker API is unavailable`);let W=await Z0(void 0),V=await DX.open(Z.state,W,{readyTimeoutMs:Z.readyTimeoutMs,clock:X,syncDebounceMs:Z.syncDebounceMs});return console.info(`${kX} worker-mode client open (sync Worker starts on setSeed via Enclave)`),{client:V,mode:"worker",dispose:()=>{console.info(`${kX} terminating sync worker`),V.terminate()}}}function UK(Z){if("store"in Z)return Z.store;return}async function uK(Z,X,W){let V=new vZ(Z,X,W,rX,SZ);return{client:V,mode:"main",dispose:()=>{V.disconnect()}}}async function Z0(Z){if(Z!==void 0)return Z;if(typeof indexedDB>"u")throw Error(`${kX} IndexedDB is unavailable; pass store explicitly (e.g. new MemoryStore(crypto))`);return zW(SZ)}function OK(Z){let[X,W]=iV();return SW(()=>{async function V(){let K=await Z.clientState.get();W(K)}let l=Z.clientState.listen(V);return V(),()=>{l()}},[Z]),X}function BK(Z){let[X,W]=iV();return SW(()=>{async function V(){let K=await Z.xferState.get();W(K)}let l=Z.xferState.listen(V);return V(),()=>{l()}},[Z]),X}function jK(Z){SW(()=>{async function X(){try{if(!(await Z.clientState.get()).hasSeed)return;await Z.connect(),await Z.sync()}catch(K){console.error("reconnectAndSync failed",K)}}function W(){X()}function V(){if(typeof document<"u"&&document.visibilityState==="visible")X()}function l(){X()}if(globalThis.addEventListener("online",W),typeof document<"u")document.addEventListener("visibilitychange",V);return globalThis.addEventListener("focus",l),globalThis.addEventListener("pageshow",l),()=>{if(globalThis.removeEventListener("online",W),typeof document<"u")document.removeEventListener("visibilitychange",V);globalThis.removeEventListener("focus",l),globalThis.removeEventListener("pageshow",l)}},[Z])}function EK(Z={}){let X=Z.clock??new pZ,{seed:W,host:V,readyTimeoutMs:l}=Z,K=Z.worker===!0,G="store"in Z?Z.store:void 0,[m,R]=iV({stateMgr:qW});return SW(()=>{let J=!1,C;return(async()=>{let F=await eW();if(J)return;let b=WW(F),c=K?await hW({state:b,clock:X,worker:!0,readyTimeoutMs:l}):await hW({state:b,clock:X,store:G,readyTimeoutMs:l});if(J){c.dispose();return}C=c.dispose;let{client:k,mode:T}=c;if(W)await k.setSeed(W);if(V)await k.link(V);if(J){C();return}R({client:k,entDB:F,stateMgr:b,mode:T,error:void 0})})().catch((F)=>{let b=F instanceof Error?F:Error(String(F));if(console.error("[DIPLOMATIC] useClient init failed",b),!J)R((c)=>({...c,client:void 0,error:b}))}),()=>{J=!0,C?.()}},[X,W,V,K,G,l]),m}import{use as wK,useEffect as X0,useRef as DK,useState as AK}from"react";function W0(Z,X,W){let[V,l]=AK();return X0(()=>{async function K(){let G=await W();l(G)}return K(),Z.on(X,K),()=>{Z.off(X,K)}},[Z,X,W]),V}function oK(Z,X,W){let V=DK(W());return X0(()=>{async function l(){V.current=W()}return Z.on(X,l),()=>{Z.off(X,l)}},[Z,X,W]),wK(V.current)}function V0(Z,X){return`${Z}:${X}`}class UV{queue=new Map;async enq(Z){for(let X of Z){let W=V0(X.host,X.seq);this.queue.set(W,X)}}async deq(Z,X){for(let W of X){let V=V0(Z,W);this.queue.delete(V)}}async list(){let Z=[];for(let X of this.queue.values())Z.push(X);return Z}async count(){return this.queue.size}async wipe(){this.queue.clear()}}function nK(Z,X){if(X.setLastSeq!==void 0)Z.lastSeq=X.setLastSeq;else if(X.lastSeq!==void 0&&X.lastSeq>Z.lastSeq)Z.lastSeq=X.lastSeq}class uV{hosts=new Map;async add(Z){let X={...Z,lastSeq:0};this.hosts.set(Z.label,X)}async touch(Z,X){await this.recordStats(Z,{lastSeq:X})}async recordStats(Z,X){let W=this.hosts.get(Z);if(!W)return;nK(W,X),this.hosts.set(Z,{...W})}async get(Z){return this.hosts.get(Z)}async set(Z,X){let W=this.hosts.get(Z);if(!W)return 13;return this.hosts.set(Z,{...W,...X}),0}async del(Z){this.hosts.delete(Z)}async list(){return this.hosts.values()}async wipe(){this.hosts.clear()}}class OV{crypto;messages=new Map;constructor(Z){this.crypto=Z}async add(Z){let X=[];for(let{key:W,data:V}of Z)this.messages.set(g(W),V),X.push(0);return X}async del(Z){for(let X of Z)this.messages.delete(g(X))}async get(Z){let X=this.messages.get(g(Z));if(X)return await uZ(Z,X,this.crypto);return}async has(Z){return this.messages.has(g(Z))}async list(Z){let X=Z?.apld,W=Z?.body!==!1,V=[];for(let[l,K]of this.messages){if(X!==void 0&&RX(K.apld)!==X)continue;let G=t(l);V.push(await uZ(G,K,this.crypto,{body:W}))}return V}async count(Z){if(Z===void 0)return this.messages.size;let X=0;for(let W of this.messages.values())if(RX(W.apld)===Z)X++;return X}async listKeys(){let Z=[];for(let X of this.messages.keys())Z.push(t(X));return Z}async last(Z){let X;for(let[W,V]of this.messages){if(e(Z,V.eid)===!1)continue;let l=t(W);if(X===void 0)X={hash:l,data:V};else if((V.ctr??0)>(X.data.ctr??0)||(V.ctr??0)===(X.data.ctr??0)&&(V.off??0)>(X.data.off??0))X={hash:l,data:V}}if(X)return await uZ(X.hash,X.data,this.crypto);return}async markApplied(Z){for(let X of Z){let W=this.messages.get(g(X));if(!W)continue;nZ(W,UZ)}}async markFailed(Z){for(let{key:X,err:W}of Z){let V=this.messages.get(g(X));if(!V)continue;nZ(V,cZ,W)}}async wipe(){this.messages.clear()}}class BV{enclave;async save(Z,X){return this.enclave=Z,this.enclave}async load(){return this.enclave}async wipe(){this.enclave=void 0}}class jV{queue=new Map;async enq(Z,X){let W=this.queue.get(Z)||new Set;this.queue.set(Z,W);for(let V of X)W.add(GZ(V))}async deq(Z,X){let W=this.queue.get(Z);if(W)for(let V of X)W.delete(GZ(V))}async list(Z){let X=this.queue.get(Z);if(!X)return[];let W=[];for(let V of X)W.push(iZ(V));return W}async count(){let Z=0;for(let X of this.queue.values())Z+=X.size;return Z}async wipe(){this.queue.clear()}}class l0{seed=new BV;hosts=new uV;uploads=new jV;downloads=new UV;messages;constructor(Z){this.messages=new OV(Z)}async wipe(){await this.hosts.wipe(),await this.uploads.wipe(),await this.downloads.wipe(),await this.messages.wipe()}}class K0{singletonType;latest;latestOff=-1;emitter=new gZ;constructor(Z){this.singletonType=Z}async apply(Z){for(let X of Z){let W=new P(X.eid),[V,l]=W.readStruct(_);if(l!==0)continue;let K=new i;K.writeVarString(this.singletonType);let G=K.result();if(V.id.length===G.length&&V.id.every((m,R)=>m===G[R])){if(this.latest===void 0||X.off>this.latestOff)this.latestOff=X.off,this.latest=X.bod,this.emitter.emit(this.singletonType,null)}}return Z.map(()=>0)}clear=async()=>{return this.latest=void 0,this.latestOff=-1,this.emitter.emit(this.singletonType,null),0};notify=(Z)=>{for(let X of Z)if(X===this.singletonType)this.emitter.emit(this.singletonType,null)};refresh=async(Z)=>{this.notify([this.singletonType])};on=(Z,X)=>{this.emitter.addEventListener(Z,X)};off=(Z,X)=>{this.emitter.removeEventListener(Z,X)}}var G0={capable(){return $l()},async createCred(Z){return TW(Z)},async write(Z,X,W){return BX(Z,X,W)},async read(Z,X){let[W,V]=await IW(Z,X);if(V!==0||W===void 0)return Y(V);return d(W.blob)}};class m0{#W;#Z;#X;#V;#l;constructor(Z){if(this.#W=Z.crypto,this.#V=Z.rpId,this.#l=Z.rpName,Z.credId!==void 0)this.#X=Z.credId.slice()}get credId(){if(this.#X===void 0)return;return this.#X.slice()}setCredId(Z){this.#X=Z===void 0?void 0:Z.slice()}async save(Z,X){if(X?.persist!==!0)return this.#Z=Z,this.#Z;let[W,V]=await Z.persistToLargeBlob([],{rpId:this.#V,rpName:this.#l,credId:this.#X});if(V!==0||W===void 0)return Promise.reject(Error(`persistToLargeBlob status ${V}`));return this.#X=W,this.#Z=Z,this.#Z}async load(){return this.#Z}async unlock(){let Z=this.#X;if(Z===void 0)return Y(22);let[X,W]=await $.fromLargeBlob(this.#W,{rpId:this.#V,rpName:this.#l,credId:Z});if(W!==0||X===void 0)return Y(W);return this.#Z=X.enclave,d(X.enclave)}async wipe(){let Z=this.#X;if(Z!==void 0){let X=await $.clearLargeBlob(Z,{rpId:this.#V});if(X!==0)return Promise.reject(Error(`clearLargeBlob status ${X}`))}this.#Z=void 0,this.#X=void 0}}var TX=1,AX={encode(Z,X){let W=Z.writeVarInt(X.v);if(W!==0)return W;let V=Z.writeVarBytes(X.salt);if(V!==0)return V;let l=Z.writeVarBytes(X.credId);if(l!==0)return l;return Z.writeVarBytes(X.body)},decode(Z){let[X,W]=Z.readVarInt();if(W!==0)return Y(W);if(X===void 0)return Y(14);let[V,l]=Z.readVarBytes();if(l!==0)return Y(l);if(V===void 0)return Y(14);let[K,G]=Z.readVarBytes();if(G!==0)return Y(G);if(K===void 0)return Y(14);let[m,R]=Z.readVarBytes();if(R!==0)return Y(R);if(m===void 0)return Y(14);return d({v:X,salt:V,credId:K,body:m})}};var NW={PREFIX:"dip1:",VERSION:TX,async seal(Z,X,W,V){let[l,K]=await X.sealPairPackageBody(W,V);if(K!==0)return Y(K);if(l===void 0)return Y(12);let G=new i,m=G.writeStruct(AX,{v:TX,salt:l.salt,credId:l.credId,body:l.body});if(m!==0)return Y(m);return d(NW.PREFIX+uW(G.result()))},async open(Z,X,W){let V=X.trim();if(!V.startsWith(NW.PREFIX))return Y(10);let l;try{l=OW(V.slice(NW.PREFIX.length))}catch{return Y(10)}let K=new P(l),[G,m]=K.readStruct(AX);if(m!==0)return Y(m);if(G===void 0)return Y(14);if(G.v!==TX)return Y(14);let[R,J]=await $.openPairPackageBody(Z,G.body,{...W,salt:G.salt,credId:G.credId.byteLength>0?G.credId:void 0});if(J!==0)return Y(J);if(R===void 0)return Y(12);return d({enclave:R.enclave,hosts:R.hosts,salt:G.salt.slice(),credId:R.credId,sealedMaster:R.sealedMaster})}};async function k2(Z,X){let W=await zW(SZ),V=new vZ(new pZ,Z,W,rX,SZ);return{client:V,setSeed:async(K)=>{let[G,m]=$.fromBytes(SZ,iZ(K));if(m!==0||G===void 0)throw Error(`invalid seed (${m})`);await W.seed.save(G),await W.hosts.add({handle:X,label:"host",idx:0}),await V.connect()}}}export{jK as useSyncOnResume,oK as useStateWatcherSuspense,W0 as useStateWatcher,BK as useClientXferState,OK as useClientState,EK as useClient,KW as shouldEmitItemProgress,nZ as setApld,EX as sealKeyFromPrf,ZV as revFromHead,hX as revFromEntity,yK as prfCapable,UX as pairPackagePlainCodec,AX as pairPackageEnvelopeCodec,zW as openIDBStore,eW as openEntDB,hW as openDiplomaticClient,qW as nullStateManager,r0 as nullEntDB,Fl as normalizeTags,s0 as isTombstone,WV as isTerminalApplyFailure,ZK as isPendingApply,D as isLiveEnt,e0 as isApldState,oZ as idleProgress,cW as identityBundleCodec,iZ as htob,rX as hostHTTPTransport,k2 as genWebClient,u0 as genSingletonEID,bX as evalPrf,WW as entStateManager,ml as encodeEntRev,_ as eidCodec,kW as defaultWebAuthnRpId,YX as defaultPeekProgressEvery,SZ as crypto,gV as createPrfCred,SV as createIdentityBundle,Gl as cmpBytes,WX as checksumSet,MX as checksumEntRevs,OZ as bundleHostCodec,GZ as btoh,uW as btob64url,g as btob64,OW as b64urltob,t as b64tob,LZ as asSealedMasterKey,ZZ as asMasterSeed,RX as apldFromStored,DX as WorkerClient,gZ as TypedEventEmitter,vZ as SyncClient,z as Status,zX as StateManager,K0 as SingletonStateManager,$W as SEALED_MASTER_KEY_LEN,yW as PrfSeedStore,m0 as PasskeySeedStore,NW as PairPackage,TX as PAIR_PACKAGE_VERSION,l0 as MemoryStore,dZ as MASTER_SEED_LEN,G0 as LargeBlob,iX as IDENTITY_BUNDLE_VERSION,PV as IDBStore,MW as IDBSeedStore,oW as HTTPTransport,tW as EntIDB,XW as EntDBMemory,i as Encoder,$ as Enclave,P as Decoder,jX as DEFAULT_PRF_SALT,pZ as Clock,SX as CachedEntDB,yZ as APLD_PENDING,cZ as APLD_ERROR,UZ as APLD_APPLIED};
|