@kittycad/lib 4.5.13 → 4.5.14

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@kittycad/oauth2-auth-code-pkce");try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}function e(t,e){return`${t.replace(/\/+$/,"")}/${e.replace(/^\/+/,"")}`}function n(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));const n=e.toString();return n?`?${n}`:""}function i(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t||{}))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));return e}try{if("undefined"!=typeof process&&process.versions?.node&&"win32"===process.platform){new Function("m","return import(m)")("win-ca")}}catch{}class l extends Error{constructor(t,e,n){super(n||e?.message||`HTTP ${t}`),this.name="ApiError",this.status=t,this.error_code=e?.error_code,this.request_id=e?.request_id,this.body=e}}async function o(t){if(t.ok)return;let e,n;try{n=await t.text()}catch{throw new l(t.status)}try{e=JSON.parse(n)}catch{e=n?{message:n}:void 0}throw new l(t.status,e)}class c{started=!1;seenTokens=new Set;constructor(t,e,n="page_token"){this.fetchPage=t,this.baseParams={...e},this.tokenField=n,this.reset()}hasNext(){return!this.started||!!this.nextToken}reset(){this.started=!1,this.nextToken=void 0,this.seenTokens.clear();const t=this.baseParams[this.tokenField];"string"==typeof t&&this.seenTokens.add(t)}async next(){if(this.started&&!this.nextToken)return[];const t=this.started&&this.nextToken?{...this.baseParams,[this.tokenField]:this.nextToken}:{...this.baseParams},e=await this.fetchPage(t);if(!function(t){return null!==t&&"object"==typeof t&&Object.hasOwn(t,"items")&&Array.isArray(t.items)&&Object.hasOwn(t,"next_page")}(e))throw new TypeError("Invalid paginated response: expected items and next_page");const n=e.next_page;if(null!==n){if("string"!=typeof n||!n.trim())throw new TypeError("Invalid paginated response: invalid next_page token");if(this.seenTokens.has(n))throw new Error("Paginated response repeated a page token");this.seenTokens.add(n)}return this.started=!0,this.nextToken=n,e.items}}function s(t,e,n="page_token"){return new c(t,e,n)}async function a({client:t,id:e,limit:i,page_token:l,sort_by:c}){const s=`/users/${e}/api-calls`+n({limit:i,page_token:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function d({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function b({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function r({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-tokens"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}const Z=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function m(t){return"Uint8Array"===Z(t)}function u(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function h(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function p(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function X(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function y(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:p(e)?Object.fromEntries(e):e))}const G=7,V=Symbol.for("@@mdb.bson.version"),W=2147483647,f=-2147483648,g=Math.pow(2,63)-1,I=-Math.pow(2,63),Y=Math.pow(2,53),S=-Math.pow(2,53),J=1,R=2,x=3,K=4,L=5,T=6,U=7,N=8,z=9,w=10,k=11,H=12,B=13,j=14,C=15,v=16,M=17,P=18,F=19,Q=255,E=127,O=0,_=4,D=Object.freeze({double:1,string:2,object:3,array:4,binData:5,undefined:6,objectId:7,bool:8,date:9,null:10,regex:11,dbPointer:12,javascript:13,symbol:14,javascriptWithScope:15,int:16,timestamp:17,long:18,decimal:19,minKey:-1,maxKey:127});class A extends Error{get bsonError(){return!0}get name(){return"BSONError"}constructor(t,e){super(t,e)}static isBSONError(t){return null!=t&&"object"==typeof t&&"bsonError"in t&&!0===t.bsonError&&"name"in t&&"message"in t&&"stack"in t}}class $ extends A{get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${G}.x.x`)}}class q extends A{get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class tt extends A{get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let et,nt;function it(t,e,n,i){if(i){et??=new TextDecoder("utf8",{fatal:!0});try{return et.decode(t.subarray(e,n))}catch(t){throw new A("Invalid UTF-8 string in BSON document",{cause:t})}}return nt??=new TextDecoder("utf8",{fatal:!1}),nt.decode(t.subarray(e,n))}function lt(t,e,n){if(0===t.length)return"";const i=n-e;if(0===i)return"";if(i>20)return null;if(1===i&&t[e]<128)return String.fromCharCode(t[e]);if(2===i&&t[e]<128&&t[e+1]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1]);if(3===i&&t[e]<128&&t[e+1]<128&&t[e+2]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1])+String.fromCharCode(t[e+2]);const l=[];for(let i=e;i<n;i++){const e=t[i];if(e>127)return null;l.push(e)}return String.fromCharCode(...l)}function ot(t){return at.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function ct(t){return crypto.getRandomValues(at.allocate(t))}const st=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?ct:ot})(),at={isUint8Array:m,toLocalBufferType(t){if(Buffer.isBuffer(t))return t;if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength);const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return Buffer.from(t);throw new A("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>at.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,i,l)=>at.toLocalBufferType(t).copy(e,n??0,i??0,l??t.length),equals:(t,e)=>at.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>at.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>at.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>at.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;if(null!=l)return l;const o=at.toLocalBufferType(t).toString("utf8",e,n);if(i)for(let i=0;i<o.length;i++)if(65533===o.charCodeAt(i)){it(t,e,n,!0);break}return o},utf8ByteLength:t=>Buffer.byteLength(t,"utf8"),encodeUTF8Into(t,e,n){const i=function(t,e,n){if(0===e.length)return 0;if(e.length>25)return null;if(t.length-n<e.length)return null;for(let i=0,l=n;i<e.length;i++,l++){const n=e.charCodeAt(i);if(n>127)return null;t[l]=n}return e.length}(t,e,n);return null!=i?i:at.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:st,swap32:t=>at.toLocalBufferType(t).swap32()};function dt(t){if(t<0)throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);return Zt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}const bt=(()=>{const{crypto:t}=globalThis;if(null!=t&&"function"==typeof t.getRandomValues)return e=>t.getRandomValues(Zt.allocate(e));if(function(){const{navigator:t}=globalThis;return"object"==typeof t&&"ReactNative"===t.product}()){const{console:t}=globalThis;t?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.")}return dt})(),rt=/(\d|[a-f])/i,Zt={isUint8Array:m,toLocalBufferType(t){const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("Uint8Array"===e)return t;if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength));if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return new Uint8Array(t);throw new A("Cannot make a Uint8Array from passed potentialBuffer.")},allocate(t){if("number"!=typeof t)throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);return new Uint8Array(t)},allocateUnsafe:t=>Zt.allocate(t),compare(t,e){if(t===e)return 0;const n=Math.min(t.length,e.length);for(let i=0;i<n;i++){if(t[i]<e[i])return-1;if(t[i]>e[i])return 1}return t.length<e.length?-1:t.length>e.length?1:0},concat(t){if(0===t.length)return Zt.allocate(0);let e=0;for(const n of t)e+=n.length;const n=Zt.allocate(e);let i=0;for(const e of t)n.set(e,i),i+=e.length;return n},copy(t,e,n,i,l){if(void 0!==l&&l<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${l}`);if(l=l??t.length,void 0!==i&&(i<0||i>l))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${l}. Received ${i}`);if(i=i??0,void 0!==n&&n<0)throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);n=n??0;const o=t.subarray(i,l),c=Math.min(o.length,e.length-n);return c<=0?0:(e.set(o.subarray(0,c),n),c)},equals(t,e){if(t.byteLength!==e.byteLength)return!1;for(let n=0;n<t.byteLength;n++)if(t[n]!==e[n])return!1;return!0},fromNumberArray:t=>Uint8Array.from(t),fromBase64:t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),fromUTF8:t=>(new TextEncoder).encode(t),toBase64:t=>btoa(Zt.toISO88591(t)),fromISO88591:t=>Uint8Array.from(t,(t=>255&t.charCodeAt(0))),toISO88591:t=>Array.from(Uint16Array.from(t),(t=>String.fromCharCode(t))).join(""),fromHex(t){const e=t.length%2==0?t:t.slice(0,t.length-1),n=[];for(let t=0;t<e.length;t+=2){const i=e[t],l=e[t+1];if(!rt.test(i))break;if(!rt.test(l))break;const o=Number.parseInt(`${i}${l}`,16);n.push(o)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;return null!=l?l:it(t,e,n,i)},utf8ByteLength:t=>(new TextEncoder).encode(t).byteLength,encodeUTF8Into(t,e,n){const i=(new TextEncoder).encode(e);return t.set(i,n),i.byteLength},randomBytes:bt,swap32(t){if(t.length%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t.length;e+=4){const n=t[e],i=t[e+1],l=t[e+2],o=t[e+3];t[e]=o,t[e+1]=l,t[e+2]=i,t[e+3]=n}return t}},mt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?at:Zt,ut=Symbol.for("@@mdb.bson.type");class ht{get[ut](){return this._bsontype}get[V](){return G}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const pt=new Float64Array(1),Xt=new Uint8Array(pt.buffer,0,8);pt[0]=-1;const yt=0===Xt[7],Gt={isBigEndian:yt,getNonnegativeInt32LE(t,e){if(t[e+3]>127)throw new RangeError(`Size cannot be negative at offset: ${e}`);return t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24},getInt32LE:(t,e)=>t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24,getUint32LE:(t,e)=>t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3],getUint32BE:(t,e)=>t[e+3]+256*t[e+2]+65536*t[e+1]+16777216*t[e],getBigInt64LE:(t,e)=>(BigInt(t[e+4]+256*t[e+5]+65536*t[e+6]+(t[e+7]<<24))<<32n)+BigInt(t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3]),getFloat64LE:yt?(t,e)=>(Xt[7]=t[e],Xt[6]=t[e+1],Xt[5]=t[e+2],Xt[4]=t[e+3],Xt[3]=t[e+4],Xt[2]=t[e+5],Xt[1]=t[e+6],Xt[0]=t[e+7],pt[0]):(t,e)=>(Xt[0]=t[e],Xt[1]=t[e+1],Xt[2]=t[e+2],Xt[3]=t[e+3],Xt[4]=t[e+4],Xt[5]=t[e+5],Xt[6]=t[e+6],Xt[7]=t[e+7],pt[0]),setInt32BE:(t,e,n)=>(t[e+3]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e]=n,4),setInt32LE:(t,e,n)=>(t[e]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+3]=n,4),setBigInt64LE(t,e,n){const i=0xffffffffn;let l=Number(n&i);t[e]=l,l>>=8,t[e+1]=l,l>>=8,t[e+2]=l,l>>=8,t[e+3]=l;let o=Number(n>>32n&i);return t[e+4]=o,o>>=8,t[e+5]=o,o>>=8,t[e+6]=o,o>>=8,t[e+7]=o,8},setFloat64LE:yt?(t,e,n)=>(pt[0]=n,t[e]=Xt[7],t[e+1]=Xt[6],t[e+2]=Xt[5],t[e+3]=Xt[4],t[e+4]=Xt[3],t[e+5]=Xt[2],t[e+6]=Xt[1],t[e+7]=Xt[0],8):(t,e,n)=>(pt[0]=n,t[e]=Xt[0],t[e+1]=Xt[1],t[e+2]=Xt[2],t[e+3]=Xt[3],t[e+4]=Xt[4],t[e+5]=Xt[5],t[e+6]=Xt[6],t[e+7]=Xt[7],8)};class Vt extends ht{get _bsontype(){return"Binary"}static BSON_BINARY_SUBTYPE_DEFAULT=0;static BUFFER_SIZE=256;static SUBTYPE_DEFAULT=0;static SUBTYPE_FUNCTION=1;static SUBTYPE_BYTE_ARRAY=2;static SUBTYPE_UUID_OLD=3;static SUBTYPE_UUID=4;static SUBTYPE_MD5=5;static SUBTYPE_ENCRYPTED=6;static SUBTYPE_COLUMN=7;static SUBTYPE_SENSITIVE=8;static SUBTYPE_VECTOR=9;static SUBTYPE_USER_DEFINED=128;static VECTOR_TYPE=Object.freeze({Int8:3,Float32:39,PackedBit:16});buffer;sub_type;position;constructor(t,e){if(super(),null!=t&&"string"==typeof t&&!ArrayBuffer.isView(t)&&!u(t)&&!Array.isArray(t))throw new A("Binary can only be constructed from Uint8Array or number[]");this.sub_type=255&(e??Vt.BSON_BINARY_SUBTYPE_DEFAULT),null==t?(this.buffer=mt.allocate(Vt.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?mt.fromNumberArray(t):mt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new A("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new A("only accepts single character Uint8Array or Array");let e;if(e="string"==typeof t?t.charCodeAt(0):"number"==typeof t?t:t[0],e<0||e>255)throw new A("only accepts number in a valid unsigned byte range 0-255");if(this.buffer.byteLength>this.position)this.buffer[this.position++]=e;else{const t=mt.allocate(Vt.BUFFER_SIZE+this.buffer.length);t.set(this.buffer,0),this.buffer=t,this.buffer[this.position++]=e}}write(t,e){if(e="number"==typeof e?e:this.position,this.buffer.byteLength<e+t.length){const e=mt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(mt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new A("input cannot be string")}read(t,e){const n=t+(e=e&&e>0?e:this.position);return this.buffer.subarray(t,n>this.position?this.position:n)}value(){return this.buffer.length===this.position?this.buffer:this.buffer.subarray(0,this.position)}length(){return this.position}toJSON(){return mt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?mt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?mt.toBase64(this.buffer.subarray(0,this.position)):mt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===Vt.SUBTYPE_VECTOR&&Wt(this);const e=mt.toBase64(this.buffer),n=Number(this.sub_type).toString(16);return t.legacy?{$binary:e,$type:1===n.length?"0"+n:n}:{$binary:{base64:e,subType:1===n.length?"0"+n:n}}}toUUID(){if(this.sub_type===Vt.SUBTYPE_UUID)return new It(this.buffer.subarray(0,this.position));throw new A(`Binary sub_type "${this.sub_type}" (${typeof this.sub_type}) is not supported for converting to UUID. Only 0x${Vt.SUBTYPE_UUID.toString(16).padStart(2,"0")} is currently supported.`)}static createFromHexString(t,e){return new Vt(mt.fromHex(t),e)}static createFromBase64(t,e){return new Vt(mt.fromBase64(t),e)}static fromExtendedJSON(t,e){let n,i;if(e=e||{},"$binary"in t?e.legacy&&"string"==typeof t.$binary&&"$type"in t?(i=t.$type?parseInt(t.$type,16):0,n=mt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(i=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=mt.fromBase64(t.$binary.base64)):"$uuid"in t&&(i=4,n=It.bytesFromString(t.$uuid)),!n)throw new A(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return i===_?new It(n):new Vt(n,i)}inspect(t,e,n){n??=y;return`Binary.createFromBase64(${n(mt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Int8)throw new A("Binary datatype field is not Int8");return Wt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Float32)throw new A("Binary datatype field is not Float32");Wt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Gt.isBigEndian&&mt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");return Wt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");Wt(this);const t=8*(this.length()-2)-this.buffer[1],e=new Int8Array(t);for(let t=0;t<e.length;t++){const n=t/8|0,i=this.buffer[n+2]>>7-t%8&1;e[t]=i}return e}static fromInt8Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Int8,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2);const i=new this(e,this.SUBTYPE_VECTOR);return Wt(i),i}static fromFloat32Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Gt.isBigEndian&&mt.swap32(new Uint8Array(e.buffer,2));const i=new this(e,this.SUBTYPE_VECTOR);return Wt(i),i}static fromPackedBits(t,e=0){const n=mt.allocate(t.byteLength+2);n[0]=Vt.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const i=new this(n,this.SUBTYPE_VECTOR);return Wt(i),i}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=Vt.VECTOR_TYPE.PackedBit;const i=t.length%8;n[1]=0===i?0:8-i;for(let e=0;e<t.length;e++){const i=e>>>3,l=t[e];if(0!==l&&1!==l)throw new A(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===l)continue;const o=7-e%8;n[i+2]|=l<<o}return new this(n,Vt.SUBTYPE_VECTOR)}}function Wt(t){if(t.sub_type!==Vt.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],i=t.buffer[1];if((n===Vt.VECTOR_TYPE.Float32||n===Vt.VECTOR_TYPE.Int8)&&0!==i)throw new A("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===Vt.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new A("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===Vt.VECTOR_TYPE.PackedBit&&0!==i&&2===e)throw new A("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===Vt.VECTOR_TYPE.PackedBit&&i>7)throw new A(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`)}const ft=/^[0-9A-F]{32}$/i,gt=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class It extends Vt{constructor(t){let e;if(null==t)e=It.generate();else if(t instanceof It)e=mt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=mt.toLocalBufferType(t);else{if("string"!=typeof t)throw new A("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");e=It.bytesFromString(t)}super(e,_)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[mt.toHex(this.buffer.subarray(0,4)),mt.toHex(this.buffer.subarray(4,6)),mt.toHex(this.buffer.subarray(6,8)),mt.toHex(this.buffer.subarray(8,10)),mt.toHex(this.buffer.subarray(10,16))].join("-"):mt.toHex(this.buffer)}toString(t){return"hex"===t?mt.toHex(this.id):"base64"===t?mt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof It)return mt.equals(t.id,this.id);try{return mt.equals(new It(t).id,this.id)}catch{return!1}}toBinary(){return new Vt(this.id,Vt.SUBTYPE_UUID)}static generate(){const t=mt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?It.isValidUUIDString(t):m(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=It.bytesFromString(t);return new It(e)}static createFromBase64(t){return new It(mt.fromBase64(t))}static bytesFromString(t){if(!It.isValidUUIDString(t))throw new A("UUID string representation must be 32 hex digits or canonical hyphenated representation");return mt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return ft.test(t)||gt.test(t)}inspect(t,e,n){return n??=y,`new UUID(${n(this.toHexString(),e)})`}}class Yt extends ht{get _bsontype(){return"Code"}code;scope;constructor(t,e){super(),this.code=t.toString(),this.scope=e??null}toJSON(){return null!=this.scope?{code:this.code,scope:this.scope}:{code:this.code}}toExtendedJSON(){return this.scope?{$code:this.code,$scope:this.scope}:{$code:this.code}}static fromExtendedJSON(t){return new Yt(t.$code,t.$scope)}inspect(t,e,n){n??=y;let i=n(this.code,e);const l=i.includes("\n");null!=this.scope&&(i+=`,${l?"\n":" "}${n(this.scope,e)}`);return`new Code(${l?"\n":""}${i}${l&&null===this.scope?"\n":""})`}}function St(t){return null!=t&&"object"==typeof t&&"$id"in t&&null!=t.$id&&"$ref"in t&&"string"==typeof t.$ref&&(!("$db"in t)||"$db"in t&&"string"==typeof t.$db)}class Jt extends ht{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,i){super();const l=t.split(".");2===l.length&&(n=l.shift(),t=l.shift()),this.collection=t,this.oid=e,this.db=n,this.fields=i||{}}get namespace(){return this.collection}set namespace(t){this.collection=t}toJSON(){const t=Object.assign({$ref:this.collection,$id:this.oid},this.fields);return null!=this.db&&(t.$db=this.db),t}toExtendedJSON(t){t=t||{};let e={$ref:this.collection,$id:this.oid};return t.legacy||(this.db&&(e.$db=this.db),e=Object.assign(e,this.fields)),e}static fromExtendedJSON(t){const e=Object.assign({},t);return delete e.$ref,delete e.$id,delete e.$db,new Jt(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=y;const i=[n(this.namespace,e),n(this.oid,e),...this.db?[n(this.db,e)]:[],...Object.keys(this.fields).length>0?[n(this.fields,e)]:[]];return i[1]=n===y?`new ObjectId(${i[1]})`:i[1],`new DBRef(${i.join(", ")})`}}function Rt(t){if(""===t)return t;let e=0;const n="-"===t[e],i="+"===t[e];(i||n)&&(e+=1);let l=!1;for(;e<t.length&&"0"===t[e];++e)l=!0;return l?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:i?t.slice(1):t}let xt;try{xt=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}const Kt=4294967296,Lt=0x10000000000000000,Tt=Lt/2,Ut={},Nt={},zt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class wt extends ht{get _bsontype(){return"Long"}get __isLong__(){return!0}high;low;unsigned;constructor(t=0,e,n){super();const i="boolean"==typeof e?e:Boolean(n),l="number"==typeof e?e:0,o="string"==typeof t?wt.fromString(t,i):"bigint"==typeof t?wt.fromBigInt(t,i):{low:0|t,high:0|l,unsigned:i};this.low=o.low,this.high=o.high,this.unsigned=o.unsigned}static TWO_PWR_24=wt.fromInt(16777216);static MAX_UNSIGNED_VALUE=wt.fromBits(-1,-1,!0);static ZERO=wt.fromInt(0);static UZERO=wt.fromInt(0,!0);static ONE=wt.fromInt(1);static UONE=wt.fromInt(1,!0);static NEG_ONE=wt.fromInt(-1);static MAX_VALUE=wt.fromBits(-1,2147483647,!1);static MIN_VALUE=wt.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new wt(t,e,n)}static fromInt(t,e){let n,i,l;return e?(l=0<=(t>>>=0)&&t<256)&&(i=Nt[t],i)?i:(n=wt.fromBits(t,(0|t)<0?-1:0,!0),l&&(Nt[t]=n),n):(l=-128<=(t|=0)&&t<128)&&(i=Ut[t],i)?i:(n=wt.fromBits(t,t<0?-1:0,!1),l&&(Ut[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?wt.UZERO:wt.ZERO;if(e){if(t<0)return wt.UZERO;if(t>=Lt)return wt.MAX_UNSIGNED_VALUE}else{if(t<=-Tt)return wt.MIN_VALUE;if(t+1>=Tt)return wt.MAX_VALUE}return t<0?wt.fromNumber(-t,e).neg():wt.fromBits(t%Kt|0,t/Kt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new wt(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new A("empty string");if(n<2||36<n)throw new A("radix");let i;if((i=t.indexOf("-"))>0)throw new A("interior hyphen");if(0===i)return wt._fromString(t.substring(1),e,n).neg();const l=wt.fromNumber(Math.pow(n,8));let o=wt.ZERO;for(let e=0;e<t.length;e+=8){const i=Math.min(8,t.length-e),c=parseInt(t.substring(e,e+i),n);if(i<8){const t=wt.fromNumber(Math.pow(n,i));o=o.mul(t).add(wt.fromNumber(c))}else o=o.mul(l),o=o.add(wt.fromNumber(c))}return o.unsigned=e,o}static fromStringStrict(t,e,n){let i=!1;if("number"==typeof e?(n=e,e=!1):i=!!e,n??=10,t.trim()!==t)throw new A(`Input: '${t}' contains leading and/or trailing whitespace`);if(!function(t,e){const n="0123456789abcdefghijklmnopqrstuvwxyz".slice(0,e=e??10);return!new RegExp(`[^-+${n}]`,"i").test(t)&&t}(t,n))throw new A(`Input: '${t}' contains invalid characters for radix: ${n}`);const l=Rt(t),o=wt._fromString(l,i,n);if(o.toString(n).toLowerCase()!==l.toLowerCase())throw new A(`Input: ${t} is not representable as ${o.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return o}static fromString(t,e,n){let i=!1;return"number"==typeof e?(n=e,e=!1):i=!!e,n??=10,"NaN"===t&&n<24||("Infinity"===t||"+Infinity"===t||"-Infinity"===t)&&n<35?wt.ZERO:wt._fromString(t,i,n)}static fromBytes(t,e,n){return n?wt.fromBytesLE(t,e):wt.fromBytesBE(t,e)}static fromBytesLE(t,e){return new wt(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,e)}static fromBytesBE(t,e){return new wt(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],e)}static isLong(t){return null!=t&&"object"==typeof t&&"__isLong__"in t&&!0===t.__isLong__}static fromValue(t,e){return"number"==typeof t?wt.fromNumber(t,e):"string"==typeof t?wt.fromString(t,e):wt.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){wt.isLong(t)||(t=wt.fromValue(t));const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16;let a=0,d=0,b=0,r=0;return r+=l+(65535&t.low),b+=r>>>16,r&=65535,b+=i+s,d+=b>>>16,b&=65535,d+=n+c,a+=d>>>16,d&=65535,a+=e+o,a&=65535,wt.fromBits(b<<16|r,a<<16|d,this.unsigned)}and(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(wt.isLong(t)||(t=wt.fromValue(t)),this.eq(t))return 0;const e=this.isNegative(),n=t.isNegative();return e&&!n?-1:!e&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1}comp(t){return this.compare(t)}divide(t){if(wt.isLong(t)||(t=wt.fromValue(t)),t.isZero())throw new A("division by zero");if(xt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?xt.div_u:xt.div_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?wt.UZERO:wt.ZERO;let e,n,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return wt.UZERO;if(t.gt(this.shru(1)))return wt.UONE;i=wt.UZERO}else{if(this.eq(wt.MIN_VALUE)){if(t.eq(wt.ONE)||t.eq(wt.NEG_ONE))return wt.MIN_VALUE;if(t.eq(wt.MIN_VALUE))return wt.ONE;return e=this.shr(1).div(t).shl(1),e.eq(wt.ZERO)?t.isNegative()?wt.ONE:wt.NEG_ONE:(n=this.sub(t.mul(e)),i=e.add(n.div(t)),i)}if(t.eq(wt.MIN_VALUE))return this.unsigned?wt.UZERO:wt.ZERO;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();i=wt.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const l=Math.ceil(Math.log(e)/Math.LN2),o=l<=48?1:Math.pow(2,l-48);let c=wt.fromNumber(e),s=c.mul(t);for(;s.isNegative()||s.gt(n);)e-=o,c=wt.fromNumber(e,this.unsigned),s=c.mul(t);c.isZero()&&(c=wt.ONE),i=i.add(c),n=n.sub(s)}return i}div(t){return this.divide(t)}equals(t){return wt.isLong(t)||(t=wt.fromValue(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)}eq(t){return this.equals(t)}getHighBits(){return this.high}getHighBitsUnsigned(){return this.high>>>0}getLowBits(){return this.low}getLowBitsUnsigned(){return this.low>>>0}getNumBitsAbs(){if(this.isNegative())return this.eq(wt.MIN_VALUE)?64:this.neg().getNumBitsAbs();const t=0!==this.high?this.high:this.low;let e;for(e=31;e>0&&!(t&1<<e);e--);return 0!==this.high?e+33:e+1}greaterThan(t){return this.comp(t)>0}gt(t){return this.greaterThan(t)}greaterThanOrEqual(t){return this.comp(t)>=0}gte(t){return this.greaterThanOrEqual(t)}ge(t){return this.greaterThanOrEqual(t)}isEven(){return!(1&this.low)}isNegative(){return!this.unsigned&&this.high<0}isOdd(){return!(1&~this.low)}isPositive(){return this.unsigned||this.high>=0}isZero(){return 0===this.high&&0===this.low}lessThan(t){return this.comp(t)<0}lt(t){return this.lessThan(t)}lessThanOrEqual(t){return this.comp(t)<=0}lte(t){return this.lessThanOrEqual(t)}modulo(t){if(wt.isLong(t)||(t=wt.fromValue(t)),xt){const e=(this.unsigned?xt.rem_u:xt.rem_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}return this.sub(this.div(t).mul(t))}mod(t){return this.modulo(t)}rem(t){return this.modulo(t)}multiply(t){if(this.isZero())return wt.ZERO;if(wt.isLong(t)||(t=wt.fromValue(t)),xt){const e=xt.mul(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}if(t.isZero())return wt.ZERO;if(this.eq(wt.MIN_VALUE))return t.isOdd()?wt.MIN_VALUE:wt.ZERO;if(t.eq(wt.MIN_VALUE))return this.isOdd()?wt.MIN_VALUE:wt.ZERO;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(wt.TWO_PWR_24)&&t.lt(wt.TWO_PWR_24))return wt.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16,a=65535&t.low;let d=0,b=0,r=0,Z=0;return Z+=l*a,r+=Z>>>16,Z&=65535,r+=i*a,b+=r>>>16,r&=65535,r+=l*s,b+=r>>>16,r&=65535,b+=n*a,d+=b>>>16,b&=65535,b+=i*s,d+=b>>>16,b&=65535,b+=l*c,d+=b>>>16,b&=65535,d+=e*a+n*s+i*c+l*o,d&=65535,wt.fromBits(r<<16|Z,d<<16|b,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(wt.MIN_VALUE)?wt.MIN_VALUE:this.not().add(wt.ONE)}neg(){return this.negate()}not(){return wt.fromBits(~this.low,~this.high,this.unsigned)}notEquals(t){return!this.equals(t)}neq(t){return this.notEquals(t)}ne(t){return this.notEquals(t)}or(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):wt.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):wt.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(wt.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return wt.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?wt.fromBits(e,0,this.unsigned):wt.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return wt.isLong(t)||(t=wt.fromValue(t)),this.add(t.neg())}sub(t){return this.subtract(t)}toInt(){return this.unsigned?this.low>>>0:this.low}toNumber(){return this.unsigned?(this.high>>>0)*Kt+(this.low>>>0):this.high*Kt+(this.low>>>0)}toBigInt(){return BigInt(this.toString())}toBytes(t){return t?this.toBytesLE():this.toBytesBE()}toBytesLE(){const t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24,255&t,t>>>8&255,t>>>16&255,t>>>24]}toBytesBE(){const t=this.high,e=this.low;return[t>>>24,t>>>16&255,t>>>8&255,255&t,e>>>24,e>>>16&255,e>>>8&255,255&e]}toSigned(){return this.unsigned?wt.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new A("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(wt.MIN_VALUE)){const e=wt.fromNumber(t),n=this.div(e),i=n.mul(e).sub(this);return n.toString(t)+i.toInt().toString(t)}return"-"+this.neg().toString(t)}const e=wt.fromNumber(Math.pow(t,6),this.unsigned);let n=this,i="";for(;;){const l=n.div(e);let o=(n.sub(l.mul(e)).toInt()>>>0).toString(t);if(n=l,n.isZero())return o+i;for(;o.length<6;)o="0"+o;i=""+o+i}}toUnsigned(){return this.unsigned?this:wt.fromBits(this.low,this.high,!0)}xor(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low^t.low,this.high^t.high,this.unsigned)}eqz(){return this.isZero()}le(t){return this.lessThanOrEqual(t)}toExtendedJSON(t){return t&&t.relaxed?this.toNumber():{$numberLong:this.toString()}}static fromExtendedJSON(t,e){const{useBigInt64:n=!1,relaxed:i=!0}={...e};if(t.$numberLong.length>20)throw new A("$numberLong string is too long");if(!zt.test(t.$numberLong))throw new A(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const l=wt.fromString(t.$numberLong);return i?l.toNumber():l}inspect(t,e,n){n??=y;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Ht=/^(\+|-)?(Infinity|inf)$/i,Bt=/^(\+|-)?NaN$/i,jt=6111,Ct=-6176,vt=mt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Mt=mt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Pt=mt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Ft=/^([-+])?(\d+)?$/;function Qt(t){return!isNaN(parseInt(t,10))}function Et(t){const e=wt.fromNumber(1e9);let n=wt.fromNumber(0);if(!(t.parts[0]||t.parts[1]||t.parts[2]||t.parts[3]))return{quotient:t,rem:n};for(let i=0;i<=3;i++)n=n.shiftLeft(32),n=n.add(new wt(t.parts[i],0)),t.parts[i]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Ot(t,e){throw new A(`"${t}" is not a valid Decimal128 string - ${e}`)}class _t extends ht{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=_t.fromString(t).bytes;else{if(!(t instanceof Uint8Array||m(t)))throw new A("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new A("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return _t._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return _t._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,i=!1,l=!1,o=!1,c=0,s=0,a=0,d=0,b=0;const r=[0];let Z=0,m=0,u=0,h=0,p=new wt(0,0),X=new wt(0,0),y=0,G=0;if(t.length>=7e3)throw new A(t+" not a valid Decimal128 string");const V=t.match(kt),W=t.match(Ht),f=t.match(Bt);if(!V&&!W&&!f||0===t.length)throw new A(t+" not a valid Decimal128 string");if(V){const e=V[2],n=V[4],i=V[5],l=V[6];n&&void 0===l&&Ot(t,"missing exponent power"),n&&void 0===e&&Ot(t,"missing exponent base"),void 0===n&&(i||l)&&Ot(t,"missing e before exponent")}if("+"!==t[G]&&"-"!==t[G]||(i=!0,n="-"===t[G++]),!Qt(t[G])&&"."!==t[G]){if("i"===t[G]||"I"===t[G])return new _t(n?Mt:Pt);if("N"===t[G])return new _t(vt)}for(;Qt(t[G])||"."===t[G];)"."!==t[G]?(Z<34&&("0"!==t[G]||o)&&(o||(b=s),o=!0,r[m++]=parseInt(t[G],10),Z+=1),o&&(a+=1),l&&(d+=1),s+=1,G+=1):(l&&Ot(t,"contains multiple periods"),l=!0,G+=1);if(l&&!s)throw new A(t+" not a valid Decimal128 string");if("e"===t[G]||"E"===t[G]){const e=t.substr(++G).match(Ft);if(!e||!e[2])return new _t(vt);h=parseInt(e[0],10),G+=e[0].length}if(t[G])return new _t(vt);if(Z){if(u=Z-1,c=a,1!==c)for(;"0"===t[b+c-1+Number(i)+Number(l)];)c-=1}else r[0]=0,a=1,Z=1,c=0;for(h<=d&&d>h+16384?h=Ct:h-=d;h>jt;){if(u+=1,u>=34){if(0===c){h=jt;break}Ot(t,"overflow")}h-=1}if(e.allowRounding){for(;h<Ct||Z<a;){if(0===u&&c<Z){h=Ct,c=0;break}if(Z<a?a-=1:u-=1,h<jt)h+=1;else{if(r.join("").match(/^0+$/)){h=jt;break}Ot(t,"overflow")}}if(u+1<c){let e=s;l&&(b+=1,e+=1),i&&(b+=1,e+=1);const o=parseInt(t[b+u+1],10);let c=0;if(o>=5&&(c=1,5===o)){c=r[u]%2==1?1:0;for(let n=b+u+2;n<e;n++)if(parseInt(t[n],10)){c=1;break}}if(c){let t=u;for(;t>=0&&++r[t]>9;t--)if(r[t]=0,0===t){if(!(h<jt))return new _t(n?Mt:Pt);h+=1,r[t]=1}}}}else{for(;h<Ct||Z<a;){if(0===u){if(0===c){h=Ct;break}Ot(t,"exponent underflow")}Z<a?("0"!==t[a-1+Number(i)+Number(l)]&&0!==c&&Ot(t,"inexact rounding"),a-=1):(0!==r[u]&&Ot(t,"inexact rounding"),u-=1),h<jt?h+=1:Ot(t,"overflow")}if(u+1<c){l&&(b+=1),i&&(b+=1);0!==parseInt(t[b+u+1],10)&&Ot(t,"inexact rounding")}}if(p=wt.fromNumber(0),X=wt.fromNumber(0),0===c)p=wt.fromNumber(0),X=wt.fromNumber(0);else if(u<17){let t=0;for(X=wt.fromNumber(r[t++]),p=new wt(0,0);t<=u;t++)X=X.multiply(wt.fromNumber(10)),X=X.add(wt.fromNumber(r[t]))}else{let t=0;for(p=wt.fromNumber(r[t++]);t<=u-17;t++)p=p.multiply(wt.fromNumber(10)),p=p.add(wt.fromNumber(r[t]));for(X=wt.fromNumber(r[t++]);t<=u;t++)X=X.multiply(wt.fromNumber(10)),X=X.add(wt.fromNumber(r[t]))}const g=function(t,e){if(!t&&!e)return{high:wt.fromNumber(0),low:wt.fromNumber(0)};const n=t.shiftRightUnsigned(32),i=new wt(t.getLowBits(),0),l=e.shiftRightUnsigned(32),o=new wt(e.getLowBits(),0);let c=n.multiply(l),s=n.multiply(o);const a=i.multiply(l);let d=i.multiply(o);return c=c.add(s.shiftRightUnsigned(32)),s=new wt(s.getLowBits(),0).add(a).add(d.shiftRightUnsigned(32)),c=c.add(s.shiftRightUnsigned(32)),d=s.shiftLeft(32).add(new wt(d.getLowBits(),0)),{high:c,low:d}}(p,wt.fromString("100000000000000000"));g.low=g.low.add(X),function(t,e){const n=t.high>>>0,i=e.high>>>0;if(n<i)return!0;if(n===i&&t.low>>>0<e.low>>>0)return!0;return!1}(g.low,X)&&(g.high=g.high.add(wt.fromNumber(1))),y=h+6176;const I={low:wt.fromNumber(0),high:wt.fromNumber(0)};g.high.shiftRightUnsigned(49).and(wt.fromNumber(1)).equals(wt.fromNumber(1))?(I.high=I.high.or(wt.fromNumber(3).shiftLeft(61)),I.high=I.high.or(wt.fromNumber(y).and(wt.fromNumber(16383).shiftLeft(47))),I.high=I.high.or(g.high.and(wt.fromNumber(0x7fffffffffff)))):(I.high=I.high.or(wt.fromNumber(16383&y).shiftLeft(49)),I.high=I.high.or(g.high.and(wt.fromNumber(562949953421311)))),I.low=g.low,n&&(I.high=I.high.or(wt.fromString("9223372036854775808")));const Y=mt.allocateUnsafe(16);return G=0,Y[G++]=255&I.low.low,Y[G++]=I.low.low>>8&255,Y[G++]=I.low.low>>16&255,Y[G++]=I.low.low>>24&255,Y[G++]=255&I.low.high,Y[G++]=I.low.high>>8&255,Y[G++]=I.low.high>>16&255,Y[G++]=I.low.high>>24&255,Y[G++]=255&I.high.low,Y[G++]=I.high.low>>8&255,Y[G++]=I.high.low>>16&255,Y[G++]=I.high.low>>24&255,Y[G++]=255&I.high.high,Y[G++]=I.high.high>>8&255,Y[G++]=I.high.high>>16&255,Y[G++]=I.high.high>>24&255,new _t(Y)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let i,l,o,c=0,s=!1,a={parts:[0,0,0,0]};const d=[];c=0;const b=this.bytes,r=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,Z=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,m=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,u=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24;c=0;({low:new wt(r,Z),high:new wt(m,u)}).high.lessThan(wt.ZERO)&&d.push("-");const h=u>>26&31;if(h>>3==3){if(30===h)return d.join("")+"Infinity";if(31===h)return"NaN";t=u>>15&16383,i=8+(u>>14&1)}else i=u>>14&7,t=u>>17&16383;const p=t-6176;if(a.parts[0]=(16383&u)+((15&i)<<14),a.parts[1]=m,a.parts[2]=Z,a.parts[3]=r,0===a.parts[0]&&0===a.parts[1]&&0===a.parts[2]&&0===a.parts[3])s=!0;else for(o=3;o>=0;o--){let t=0;const e=Et(a);if(a=e.quotient,t=e.rem.low,t)for(l=8;l>=0;l--)n[9*o+l]=t%10,t=Math.floor(t/10)}if(s)e=1,n[c]=0;else for(e=36;!n[c];)e-=1,c+=1;const X=e-1+p;if(X>=34||X<=-7||p>0){if(e>34)return d.push("0"),p>0?d.push(`E+${p}`):p<0&&d.push(`E${p}`),d.join("");d.push(`${n[c++]}`),e-=1,e&&d.push(".");for(let t=0;t<e;t++)d.push(`${n[c++]}`);d.push("E"),X>0?d.push(`+${X}`):d.push(`${X}`)}else if(p>=0)for(let t=0;t<e;t++)d.push(`${n[c++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)d.push(`${n[c++]}`);else d.push("0");for(d.push(".");t++<0;)d.push("0");for(let i=0;i<e-Math.max(t-1,0);i++)d.push(`${n[c++]}`)}return d.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return _t.fromString(t.$numberDecimal)}inspect(t,e,n){n??=y;return`new Decimal128(${n(this.toString(),e)})`}}class Dt extends ht{get _bsontype(){return"Double"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=+t}static fromString(t){const e=Number(t);if("NaN"===t)return new Dt(NaN);if("Infinity"===t)return new Dt(1/0);if("-Infinity"===t)return new Dt(-1/0);if(!Number.isFinite(e))throw new A(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new A(`Input: '${t}' contains whitespace`);if(""===t)throw new A("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new A(`Input: '${t}' is not in decimal or exponential notation`);return new Dt(e)}valueOf(){return this.value}toJSON(){return this.value}toString(t){return this.value.toString(t)}toExtendedJSON(t){return t&&(t.legacy||t.relaxed&&isFinite(this.value))?this.value:Object.is(Math.sign(this.value),-0)?{$numberDouble:"-0.0"}:{$numberDouble:Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}}static fromExtendedJSON(t,e){const n=parseFloat(t.$numberDouble);return e&&e.relaxed?n:new Dt(n)}inspect(t,e,n){return n??=y,`new Double(${n(this.value,e)})`}}class At extends ht{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=Rt(t),n=Number(t);if(W<n)throw new A(`Input: '${t}' is larger than the maximum value for Int32`);if(f>n)throw new A(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new A(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new A(`Input: '${t}' is not a valid Int32 string`);return new At(n)}valueOf(){return this.value}toString(t){return this.value.toString(t)}toJSON(){return this.value}toExtendedJSON(t){return t&&(t.relaxed||t.legacy)?this.value:{$numberInt:this.value.toString()}}static fromExtendedJSON(t,e){return e&&e.relaxed?parseInt(t.$numberInt,10):new At(t.$numberInt)}inspect(t,e,n){return n??=y,`new Int32(${n(this.value,e)})`}}class $t extends ht{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new $t}inspect(){return"new MaxKey()"}}class qt extends ht{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MinKey()"}}const te=new WeakMap,ee=[];for(let t=0;t<256;t++)ee.push(t.toString(16).padStart(2,"0"));const ne=new Int8Array(103);for(let t=48;t<=57;t++)ne[t]=t-48;for(let t=65;t<=70;t++)ne[t]=t-55;for(let t=97;t<=102;t++)ne[t]=t-87;class ie extends ht{get _bsontype(){return"ObjectId"}static index=0;static PROCESS_UNIQUE=null;static resetState=()=>{this.index=Math.floor(16777216*Math.random()),this.PROCESS_UNIQUE=null};static{this.resetState();const{startupSnapshot:t}=globalThis?.process?.getBuiltinModule?.("v8")??{};t?.isBuildingSnapshot?.()&&t?.addDeserializeCallback?.(this.resetState)}static cacheHexString;i0;i1;i2;i3;setFromBytes(t,e=0){this.i0=t[e]<<16|t[e+1]<<8|t[e+2],this.i1=t[e+3]<<16|t[e+4]<<8|t[e+5],this.i2=t[e+6]<<16|t[e+7]<<8|t[e+8],this.i3=t[e+9]<<16|t[e+10]<<8|t[e+11]}setFromHex(t){const e=ne;this.i0=e[t.charCodeAt(0)]<<20|e[t.charCodeAt(1)]<<16|e[t.charCodeAt(2)]<<12|e[t.charCodeAt(3)]<<8|e[t.charCodeAt(4)]<<4|e[t.charCodeAt(5)],this.i1=e[t.charCodeAt(6)]<<20|e[t.charCodeAt(7)]<<16|e[t.charCodeAt(8)]<<12|e[t.charCodeAt(9)]<<8|e[t.charCodeAt(10)]<<4|e[t.charCodeAt(11)],this.i2=e[t.charCodeAt(12)]<<20|e[t.charCodeAt(13)]<<16|e[t.charCodeAt(14)]<<12|e[t.charCodeAt(15)]<<8|e[t.charCodeAt(16)]<<4|e[t.charCodeAt(17)],this.i3=e[t.charCodeAt(18)]<<20|e[t.charCodeAt(19)]<<16|e[t.charCodeAt(20)]<<12|e[t.charCodeAt(21)]<<8|e[t.charCodeAt(22)]<<4|e[t.charCodeAt(23)]}constructor(t,e){if(super(),"number"==typeof e)return void this.setFromBytes(t,e);let n;if("object"==typeof t&&t&&"id"in t){if(ie.is(t)&&"number"==typeof t.i0&&"number"==typeof t.i1&&"number"==typeof t.i2&&"number"==typeof t.i3)return this.i0=t.i0,this.i1=t.i1,this.i2=t.i2,void(this.i3=t.i3);if("string"!=typeof t.id&&!ArrayBuffer.isView(t.id))throw new A("Argument passed in must have an id that is of type string or Buffer");n="toHexString"in t&&"function"==typeof t.toHexString?mt.fromHex(t.toHexString()):t.id}else n=t;if(null==n){const t=Math.floor(Date.now()/1e3),e=ie.getInc(),n=ie.PROCESS_UNIQUE??=mt.randomBytes(5);this.i0=t>>>8&16777215,this.i1=(255&t)<<16|n[0]<<8|n[1],this.i2=n[2]<<16|n[3]<<8|n[4],this.i3=16777215&e}else if(ArrayBuffer.isView(n)&&12===n.byteLength)this.setFromBytes(n instanceof Uint8Array?n:mt.toLocalBufferType(n));else{if("string"!=typeof n)throw new A("Argument passed in does not match the accepted types");if(!ie.validateHexString(n))throw new A("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.setFromHex(n),ie.cacheHexString&&te.set(this,n)}}get id(){const t=mt.allocateUnsafe(12);return t[0]=this.i0>>>16&255,t[1]=this.i0>>>8&255,t[2]=255&this.i0,t[3]=this.i1>>>16&255,t[4]=this.i1>>>8&255,t[5]=255&this.i1,t[6]=this.i2>>>16&255,t[7]=this.i2>>>8&255,t[8]=255&this.i2,t[9]=this.i3>>>16&255,t[10]=this.i3>>>8&255,t[11]=255&this.i3,t}set id(t){const e=t instanceof Uint8Array?t:mt.toLocalBufferType(t);this.setFromBytes(e),ie.cacheHexString&&te.set(this,mt.toHex(e))}static validateHexString(t){if(24!==t?.length)return!1;for(let e=0;e<24;e++){const n=t.charCodeAt(e);if(!(n>=48&&n<=57||n>=97&&n<=102||n>=65&&n<=70))return!1}return!0}toHexString(){if(ie.cacheHexString){const t=te.get(this);if(t)return t}const t=this.i0,e=this.i1,n=this.i2,i=this.i3,l=ee[t>>>16&255]+ee[t>>>8&255]+ee[255&t]+ee[e>>>16&255]+ee[e>>>8&255]+ee[255&e]+ee[n>>>16&255]+ee[n>>>8&255]+ee[255&n]+ee[i>>>16&255]+ee[i>>>8&255]+ee[255&i];return ie.cacheHexString&&te.set(this,l),l}static getInc(){return ie.index=(ie.index+1)%16777216}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ie.getInc(),n=mt.allocateUnsafe(12);Gt.setInt32BE(n,0,t);const i=this.PROCESS_UNIQUE??=mt.randomBytes(5);return n[4]=i[0],n[5]=i[1],n[6]=i[2],n[7]=i[3],n[8]=i[4],n[11]=255&e,n[10]=e>>>8&255,n[9]=e>>>16&255,n}toString(t){return"base64"===t?mt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}static is(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"ObjectId"===t._bsontype}equals(t){if(null==t)return!1;if(ie.is(t)&&"number"==typeof t.i0&&"number"==typeof t.i1&&"number"==typeof t.i2&&"number"==typeof t.i3)return this.i3===t.i3&&this.i0===t.i0&&this.i1===t.i1&&this.i2===t.i2;if("string"==typeof t)return t.toLowerCase()===this.toHexString();if("object"==typeof t&&"function"==typeof t.toHexString){const e=t.toHexString(),n=this.toHexString();return"string"==typeof e&&e.toLowerCase()===n}return!1}getTimestamp(){const t=new Date,e=256*this.i0+(this.i1>>>16);return t.setTime(1e3*e),t}static createPk(){return new ie}serializeInto(t,e){return t[e]=this.i0>>>16&255,t[e+1]=this.i0>>>8&255,t[e+2]=255&this.i0,t[e+3]=this.i1>>>16&255,t[e+4]=this.i1>>>8&255,t[e+5]=255&this.i1,t[e+6]=this.i2>>>16&255,t[e+7]=this.i2>>>8&255,t[e+8]=255&this.i2,t[e+9]=this.i3>>>16&255,t[e+10]=this.i3>>>8&255,t[e+11]=255&this.i3,12}static createFromTime(t){const e=mt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Gt.setInt32BE(e,0,t),new ie(e)}static createFromHexString(t){if(24!==t?.length)throw new A("hex string must be 24 characters");return new ie(mt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new A("base64 string must be 16 characters");return new ie(mt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ie.validateHexString(t);try{return new ie(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ie(t.$oid)}isCached(){return ie.cacheHexString&&te.has(this)}inspect(t,e,n){return n??=y,`new ObjectId(${n(this.toHexString(),e)})`}}function le(t,e,n=!1,i=!1,l=!1,o,c){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+mt.utf8ByteLength(t)+1+4+mt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=S&&e<=Y&&e>=f&&e<=W?mt.utf8ByteLength(t)+1+5:mt.utf8ByteLength(t)+1+9;case"undefined":return i||!l?mt.utf8ByteLength(t)+1+1:0;case"boolean":return mt.utf8ByteLength(t)+1+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[V]!==G)throw new $;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return mt.utf8ByteLength(t)+1+1;if("ObjectId"===e._bsontype)return mt.utf8ByteLength(t)+1+13;if(e instanceof Date||X(e))return mt.utf8ByteLength(t)+1+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||u(e))return mt.utf8ByteLength(t)+1+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return mt.utf8ByteLength(t)+1+9;if("Decimal128"===e._bsontype)return mt.utf8ByteLength(t)+1+17;if("Int32"===e._bsontype)return mt.utf8ByteLength(t)+1+5;if("Code"===e._bsontype){if(null!=e.scope&&Object.keys(e.scope).length>0){if(c.has(e.scope))throw new A("Cannot convert circular structure to BSON");return o.push({object:e.scope,ignoreUndefined:l,exit:!1}),mt.utf8ByteLength(t)+1+1+4+4+mt.utf8ByteLength(e.code.toString())+1}return mt.utf8ByteLength(t)+1+1+4+mt.utf8ByteLength(e.code.toString())+1}if("Binary"===e._bsontype){const n=e;return n.sub_type===Vt.SUBTYPE_BYTE_ARRAY?mt.utf8ByteLength(t)+1+(n.position+1+4+1+4):mt.utf8ByteLength(t)+1+(n.position+1+4+1)}if("BSONSymbol"===e._bsontype)return mt.utf8ByteLength(t)+1+mt.utf8ByteLength(e.value)+4+1+1;if("DBRef"===e._bsontype){const n=Object.assign({$ref:e.collection,$id:e.oid},e.fields);return null!=e.db&&(n.$db=e.db),o.push({object:n,ignoreUndefined:!0,exit:!1}),mt.utf8ByteLength(t)+1+1}if(e instanceof RegExp||h(e))return mt.utf8ByteLength(t)+1+1+mt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1;if("BSONRegExp"===e._bsontype)return mt.utf8ByteLength(t)+1+1+mt.utf8ByteLength(e.pattern)+1+mt.utf8ByteLength(e.options)+1;if(c.has(e))throw new A("Cannot convert circular structure to BSON");return o.push({object:e,ignoreUndefined:l,exit:!1}),mt.utf8ByteLength(t)+1+1;case"function":return n?mt.utf8ByteLength(t)+1+1+4+mt.utf8ByteLength(e.toString())+1:0;case"bigint":return mt.utf8ByteLength(t)+1+9;case"symbol":return 0;default:throw new A("Unrecognized JS type: "+typeof e)}}class oe extends ht{get _bsontype(){return"BSONRegExp"}pattern;options;constructor(t,e){if(super(),this.pattern=t,this.options=(e??"").split("").sort().join(""),-1!==this.pattern.indexOf("\0"))throw new A(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new A(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);for(let t=0;t<this.options.length;t++)if("i"!==this.options[t]&&"m"!==this.options[t]&&"x"!==this.options[t]&&"l"!==this.options[t]&&"s"!==this.options[t]&&"u"!==this.options[t])throw new A(`The regular expression option [${this.options[t]}] is not supported`)}static parseOptions(t){return t?t.split("").sort().join(""):""}toExtendedJSON(t){return(t=t||{}).legacy?{$regex:this.pattern,$options:this.options}:{$regularExpression:{pattern:this.pattern,options:this.options}}}static fromExtendedJSON(t){if("$regex"in t){if("string"==typeof t.$regex)return new oe(t.$regex,oe.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new oe(t.$regularExpression.pattern,oe.parseOptions(t.$regularExpression.options));throw new A(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`)}inspect(t,e,n){const i=function(t){if(null!=t&&"object"==typeof t&&"stylize"in t&&"function"==typeof t.stylize)return t.stylize}(e)??(t=>t);n??=y;return`new BSONRegExp(${i(n(this.pattern),"regexp")}, ${i(n(this.options),"regexp")})`}}class ce extends ht{get _bsontype(){return"BSONSymbol"}value;constructor(t){super(),this.value=t}valueOf(){return this.value}toString(){return this.value}toJSON(){return this.value}toExtendedJSON(){return{$symbol:this.value}}static fromExtendedJSON(t){return new ce(t.$symbol)}inspect(t,e,n){return n??=y,`new BSONSymbol(${n(this.value,e)})`}}const se=wt;class ae extends se{get _bsontype(){return"Timestamp"}get[ut](){return"Timestamp"}static MAX_VALUE=wt.MAX_UNSIGNED_VALUE;get i(){return this.low>>>0}get t(){return this.high>>>0}constructor(t){if(null==t)super(0,0,!0);else if("bigint"==typeof t)super(t,!0);else if(wt.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new A("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");{if("number"!=typeof t.t&&("object"!=typeof t.t||"Int32"!==t.t._bsontype))throw new A("Timestamp constructed from { t, i } must provide t as a number");if("number"!=typeof t.i&&("object"!=typeof t.i||"Int32"!==t.i._bsontype))throw new A("Timestamp constructed from { t, i } must provide i as a number");const e=Number(t.t),n=Number(t.i);if(e<0||Number.isNaN(e))throw new A("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new A("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new A("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new A("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");super(n,e,!0)}}}toJSON(){return{$timestamp:this.toString()}}static fromInt(t){return new ae(wt.fromInt(t,!0))}static fromNumber(t){return new ae(wt.fromNumber(t,!0))}static fromBits(t,e){return new ae({i:t,t:e})}static fromString(t,e){return new ae(wt.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=wt.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=wt.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new ae({t:n,i:e})}inspect(t,e,n){n??=y;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=wt.fromNumber(Y),be=wt.fromNumber(S);function re(t,e,n){const i=(e=null==e?{}:e)&&e.index?e.index:0,l=Gt.getInt32LE(t,i);if(l<5)throw new A(`bson size must be >= 5, is ${l}`);if(e.allowObjectSmallerThanBufferSize&&t.length<l)throw new A(`buffer length ${t.length} must be >= bson size ${l}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==l)throw new A(`buffer length ${t.length} must === bson size ${l}`);if(l+i>t.byteLength)throw new A(`(bson size ${l} + options.index ${i} must be <= buffer length ${t.byteLength})`);if(0!==t[i+l-1])throw new A("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return function(t,e,n,i=!1){n={...n};const l=null==n.fieldsAsRaw?null:n.fieldsAsRaw,o=null!=n.raw&&n.raw,c="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,a=n.promoteLongs??!0,d=n.promoteValues??!0,b=n.useBigInt64??!1;if(b&&!d)throw new A("Must either request bigint or Long for int64 deserialization");if(b&&!a)throw new A("Must either request bigint or Long for int64 deserialization");const r=null==n.validation?{utf8:!0}:n.validation;let Z,m,u=!0;const h=r.utf8;if("boolean"==typeof h)Z=h;else{u=!1;const t=Object.keys(h).map((function(t){return h[t]}));if(0===t.length)throw new A("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new A("Invalid UTF-8 validation option, must specify boolean values");if(Z=t[0],!t.every((t=>t===Z)))throw new A("Invalid UTF-8 validation option - keys must be all true or all false")}if(!u){m=new Set;for(const t of Object.keys(h))m.add(t)}const p=e;if(t.length<5)throw new A("corrupt bson message < 5 bytes long");const X=Gt.getInt32LE(t,e);if(e+=4,X<5||X>t.length)throw new A("corrupt bson message");const y=i?[]:{};let G=0,V=!i&&null,W=null,f=y,g=i;for(;;){const n=t[e++];if(0===n){if(W){if(e===W.lastIndex){const t=W;W=t.prev,null===W?(f=y,g=i):(f=W.holdingDocument,g=W.isArray);let e=t.holdingDocument;switch(t.elementType){case x:t.isPossibleDBRef&&(e=ue(e));break;case K:break;case C:e=new Yt(t.functionString,t.holdingDocument);break;default:throw new A("Unexpected element type in frame stack")}me(f,t.propertyName,e);continue}if(W.elementType===K)throw new A("corrupted array bson");throw new A("Bad BSON Document: object not properly terminated")}break}let r=e;for(;0!==t[r]&&r<t.length;)r++;if(r>=t.byteLength)throw new A("Bad BSON Document: illegal CString");const h=g?null!==W?W.arrayIndex++:G++:mt.toUTF8(t,e,r,!1);let p,X;p=null!==W?W.validationSetting:u||m?.has(h)?Z:!Z,null!==W?!1!==W.isPossibleDBRef&&"string"==typeof h&&"$"===h[0]&&(W.isPossibleDBRef=Ze.test(h)):!1!==V&&"$"===h[0]&&(V=Ze.test(h));let I=!1;if(e=r+1,n===R){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");X=mt.toUTF8(t,e,e+n-1,p),e+=n}else if(n===U)X=new ie(t,e),e+=12;else if(n===v&&!1===d)X=new At(Gt.getInt32LE(t,e)),e+=4;else if(n===v)X=Gt.getInt32LE(t,e),e+=4;else if(n===J)X=Gt.getFloat64LE(t,e),e+=8,!1===d&&(X=new Dt(X));else if(n===z){const n=Gt.getInt32LE(t,e),i=Gt.getInt32LE(t,e+4);e+=8,X=new Date(new wt(n,i).toNumber())}else if(n===N){if(0!==t[e]&&1!==t[e])throw new A("illegal boolean type value");X=1===t[e++]}else if(n===x){const n=Gt.getInt32LE(t,e);if(n<5||n>t.length-e)throw new A("bad embedded document length in bson");if(o||W?.raw)X=t.subarray(e,e+n),e+=n;else{I=!0;const t={holdingDocument:{},elementType:x,propertyName:h,functionString:null,lastIndex:e+n,isArray:!1,arrayIndex:0,raw:!1,isPossibleDBRef:null,validationSetting:p,prev:W};W=t,f=t.holdingDocument,g=!1,e+=4}}else if(n===K){const n=Gt.getInt32LE(t,e);if(n<5||n>t.length-e)throw new A("bad embedded array length in bson");const i=e+n,o=!(!l||!l[h])||(W?.raw??!1);I=!0;const c={holdingDocument:[],elementType:K,propertyName:h,functionString:null,lastIndex:i,isArray:!0,arrayIndex:0,raw:o,isPossibleDBRef:!1,validationSetting:p,prev:W};W=c,f=c.holdingDocument,g=!0,e+=4}else if(n===T)X=void 0;else if(n===w)X=null;else if(n===P)if(b)X=Gt.getBigInt64LE(t,e),e+=8;else{const n=Gt.getInt32LE(t,e),i=Gt.getInt32LE(t,e+4);e+=8;const l=new wt(n,i);X=a&&!0===d&&l.lessThanOrEqual(de)&&l.greaterThanOrEqual(be)?l.toNumber():l}else if(n===F){const n=mt.allocateUnsafe(16);for(let i=0;i<16;i++)n[i]=t[e+i];e+=16,X=new _t(n)}else if(n===L){let n=Gt.getInt32LE(t,e);e+=4;const i=n,l=t[e++];if(n<0)throw new A("Negative binary type element size found");if(n>t.byteLength)throw new A("Binary type size larger than document size");if(l===Vt.SUBTYPE_BYTE_ARRAY){if(n=Gt.getInt32LE(t,e),e+=4,n<0)throw new A("Negative binary type element size found for subtype 0x02");if(n>i-4)throw new A("Binary type with subtype 0x02 contains too long binary size");if(n<i-4)throw new A("Binary type with subtype 0x02 contains too short binary size")}s&&d?X=mt.toLocalBufferType(t.subarray(e,e+n)):(X=new Vt(t.subarray(e,e+n),l),l===_&&It.isValid(X)&&(X=X.toUUID())),e+=n}else if(n===k&&!1===c){for(r=e;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,r,!1);for(r=e=r+1;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const i=mt.toUTF8(t,e,r,!1);e=r+1;const l=new Array(i.length);for(r=0;r<i.length;r++)switch(i[r]){case"m":l[r]="m";break;case"s":l[r]="g";break;case"i":l[r]="i"}X=new RegExp(n,l.join(""))}else if(n===k&&!0===c){for(r=e;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,r,!1);for(r=e=r+1;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const i=mt.toUTF8(t,e,r,!1);e=r+1,X=new oe(n,i)}else if(n===j){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);X=d?i:new ce(i),e+=n}else if(n===M)X=new ae({i:Gt.getUint32LE(t,e),t:Gt.getUint32LE(t,e+4)}),e+=8;else if(n===Q)X=new qt;else if(n===E)X=new $t;else if(n===B){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);X=new Yt(i),e+=n}else if(n===C){const n=Gt.getInt32LE(t,e);if(e+=4,n<13)throw new A("code_w_scope total size shorter minimum expected length");const i=Gt.getInt32LE(t,e);if(e+=4,i<=0||i>t.length-e||0!==t[e+i-1])throw new A("bad string length in bson");const l=mt.toUTF8(t,e,e+i-1,p),o=e+=i,c=Gt.getInt32LE(t,e);if(c<5||c>t.length-e)throw new A("bad scope document size in code_w_scope");if(n<8+c+i)throw new A("code_w_scope total size is too short, truncating scope");if(n>8+c+i)throw new A("code_w_scope total size is too long, clips outer document");I=!0;const s={holdingDocument:{},elementType:C,propertyName:h,functionString:l,lastIndex:o+c,isArray:!1,arrayIndex:0,raw:!1,isPossibleDBRef:null,validationSetting:p,prev:W};W=s,f=s.holdingDocument,g=!1,e+=4}else{if(n!==H)throw new A(`Detected unknown BSON type ${n.toString(16)} for fieldname "${h}"`);{const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);e+=n;const l=mt.allocateUnsafe(12);for(let n=0;n<12;n++)l[n]=t[e+n];const o=new ie(l);e+=12,X=new Jt(i,o)}}I||me(f,h,X)}if(null!==W)throw new A("corrupted bson, more objects expected based on the current document size");const I=y;if(X!==e-p){if(i)throw new A("corrupt array bson");throw new A("corrupt object bson")}return V?ue(I):I}(t,i,e,n)}const Ze=/^\$ref$|^\$id$|^\$db$/;function me(t,e,n){"__proto__"===e?Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0}):t[e]=n}function ue(t){if(St(t)){const{$ref:e,$id:n,$db:i,...l}=t;return new Jt(e,n,i,l)}return t}const he=/\x00/,pe=new Set(["$db","$ref","$id","$clusterTime"]);function Xe(t,e,n,i){t[i++]=R;t[(i=i+mt.encodeUTF8Into(t,e,i)+1)-1]=0;const l=mt.encodeUTF8Into(t,n,i+4);return Gt.setInt32LE(t,i,l+1),i=i+4+l,t[i++]=0,i}function ye(t,e,n,i){const l=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=W&&n>=f?v:J;t[i++]=l;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=l===v?Gt.setInt32LE(t,i,n):Gt.setFloat64LE(t,i,n)}function Ge(t,e,n,i){t[i++]=P;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setBigInt64LE(t,i,n)}function Ve(t,e,n,i){t[i++]=w;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i}function We(t,e,n,i){t[i++]=N;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,t[i++]=n?1:0,i}function fe(t,e,n,i){t[i++]=z;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=wt.fromNumber(n.getTime()),o=l.getLowBits(),c=l.getHighBits();return i+=Gt.setInt32LE(t,i,o),i+=Gt.setInt32LE(t,i,c)}function ge(t,e,n,i){t[i++]=k;if(i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,n.source&&null!=n.source.match(he))throw new A("value "+n.source+" must not contain null bytes");return i+=mt.encodeUTF8Into(t,n.source,i),t[i++]=0,n.ignoreCase&&(t[i++]=105),n.global&&(t[i++]=115),n.multiline&&(t[i++]=109),t[i++]=0,i}function Ie(t,e,n,i){t[i++]=k;if(i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,null!=n.pattern.match(he))throw new A("pattern "+n.pattern+" must not contain null bytes");i+=mt.encodeUTF8Into(t,n.pattern,i),t[i++]=0;const l=n.options.split("").sort().join("");return i+=mt.encodeUTF8Into(t,l,i),t[i++]=0,i}function Ye(t,e,n,i){null===n?t[i++]=w:"MinKey"===n[ut]?t[i++]=Q:t[i++]=E;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Se(t,e,n,i){t[i++]=U;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=n.serializeInto(t,i)}function Je(t,e,n,i){t[i++]=L;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.length;if(i+=Gt.setInt32LE(t,i,l),t[i++]=O,l<=16)for(let e=0;e<l;e++)t[i+e]=n[e];else t.set(n,i);return i+=l}function Re(t,e,n,i){t[i++]=F;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;for(let e=0;e<16;e++)t[i+e]=n.bytes[e];return i+16}function xe(t,e,n,i){t[i++]="Long"===n[ut]?P:M;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.getLowBits(),o=n.getHighBits();return i+=Gt.setInt32LE(t,i,l),i+=Gt.setInt32LE(t,i,o)}function Ke(t,e,n,i){n=n.valueOf(),t[i++]=v;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setInt32LE(t,i,n)}function Le(t,e,n,i){t[i++]=J;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setFloat64LE(t,i,n.value)}function Te(t,e,n,i){t[i++]=B;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.toString(),o=mt.encodeUTF8Into(t,l,i+4)+1;return Gt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0,i}function Ue(t,e,n,i){t[i++]=L;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.buffer;let o=n.position;if(n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o+=4),i+=Gt.setInt32LE(t,i,o),t[i++]=n.sub_type,n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o-=4,i+=Gt.setInt32LE(t,i,o)),n.sub_type===Vt.SUBTYPE_VECTOR&&Wt(n),o<=16)for(let e=0;e<o;e++)t[i+e]=l[e];else t.set(l,i);return i+=n.position}function Ne(t,e,n,i){t[i++]=j;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=mt.encodeUTF8Into(t,n.value,i+4)+1;return Gt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0,i}function ze(t,e,n,i,l,o){if(Array.isArray(t))return{sourceObject:t,isArray:!0,objectSizeIndex:e,codeSizeIndex:n,iterTarget:t,keys:null,keyIndex:0,mapIterator:null,prev:i,checkKeys:l,ignoreUndefined:o};if(t instanceof Map||p(t))return{sourceObject:t,isArray:!1,objectSizeIndex:e,codeSizeIndex:n,iterTarget:t,keys:null,keyIndex:0,mapIterator:t.entries(),prev:i,checkKeys:l,ignoreUndefined:o};let c=t;if("function"==typeof c?.toBSON&&(c=c.toBSON(),null!=c&&"object"!=typeof c))throw new A("toBSON function did not return an object");return{sourceObject:t,isArray:!1,objectSizeIndex:e,codeSizeIndex:n,iterTarget:c,keys:Object.keys(c),keyIndex:0,mapIterator:null,prev:i,checkKeys:l,ignoreUndefined:o}}function we(t,e,n,i,l,o,c){if(null==c){if(null==e)return t[0]=5,t[1]=0,t[2]=0,t[3]=0,t[4]=0,5;if(Array.isArray(e))throw new A("serialize does not support an array as the root input");if("object"!=typeof e)throw new A("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new A("BSON types cannot be serialized as a document");if(X(e)||h(e)||m(e)||u(e))throw new A("date, regexp, typedarray, and arraybuffer cannot be BSON documents");c=new Set}c.add(e);let s=ze(e,i,null,null,n,o),a=i+4;for(;null!==s;){const e=s;let n,i;if(null!==e.mapIterator){const l=e.mapIterator.next();if(l.done){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}n=l.value[0],i=l.value[1]}else if(null!==e.keys){if(e.keyIndex>=e.keys.length){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}n=e.keys[e.keyIndex++],i=e.iterTarget[n]}else{const l=e.iterTarget;if(e.keyIndex>=l.length){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}const o=e.keyIndex++;n=String(o),i=l[o]}if("function"==typeof i?.toBSON&&(i=i.toBSON()),!(e.isArray||"string"!=typeof n||"$"===n[0]&&pe.has(n))){if(he.test(n))throw new A("key "+n+" must not contain null bytes");if(e.checkKeys){if("$"===n[0])throw new A("key "+n+" must not start with '$'");if(n.includes("."))throw new A("key "+n+" must not contain '.'")}}const o=typeof i;if(void 0===i)(e.isArray||!1===e.ignoreUndefined)&&(a=Ve(t,n,0,a));else if(null===i)a=Ve(t,n,0,a);else if("string"===o)a=Xe(t,n,i,a);else if("number"===o)a=ye(t,n,i,a);else if("bigint"===o)a=Ge(t,n,i,a);else if("boolean"===o)a=We(t,n,i,a);else if("object"===o&&null==i._bsontype)if(i instanceof Date||X(i))a=fe(t,n,i,a);else if(i instanceof Uint8Array||m(i))a=Je(t,n,i,a);else if(i instanceof RegExp||h(i))a=ge(t,n,i,a);else{if(c.has(i))throw new A("Cannot convert circular structure to BSON");const l=Array.isArray(i);t[a++]=l?K:x,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const o=a;c.add(i),s=ze(i,o,null,e,e.checkKeys,e.ignoreUndefined),a+=4}else if("object"===o){if(i[V]!==G)throw new $;const l=i[ut];if("ObjectId"===l)a=Se(t,n,i,a);else if("Decimal128"===l)a=Re(t,n,i,a);else if("Long"===l||"Timestamp"===l)a=xe(t,n,i,a);else if("Double"===l)a=Le(t,n,i,a);else if("Code"===l){const l=i;if(l.scope&&"object"==typeof l.scope){t[a++]=C,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const i=a;a+=4;const o=l.code,d=mt.encodeUTF8Into(t,o,a+4)+1;Gt.setInt32LE(t,a,d),t[a+4+d-1]=0,a=a+d+4;const b=l.scope;if(c.has(b))throw new A("Cannot convert circular structure to BSON");c.add(b),s=ze(b,a,i,e,e.checkKeys,e.ignoreUndefined),a+=4}else{t[a++]=B,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const e=l.code.toString(),i=mt.encodeUTF8Into(t,e,a+4)+1;Gt.setInt32LE(t,a,i),a=a+4+i-1,t[a++]=0}}else if("Binary"===l)a=Ue(t,n,i,a);else if("BSONSymbol"===l)a=Ne(t,n,i,a);else if("DBRef"===l){const l=i,o=Object.assign({$ref:l.collection,$id:l.oid},null!=l.db?{$db:l.db}:null,l.fields);t[a++]=x,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0,c.add(o),s=ze(o,a,null,e,!1,!0),a+=4}else if("BSONRegExp"===l)a=Ie(t,n,i,a);else if("Int32"===l)a=Ke(t,n,i,a);else if("MinKey"===l||"MaxKey"===l)a=Ye(t,n,i,a);else if(void 0!==i._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(i._bsontype)}`)}else"function"===o&&l&&(a=Te(t,n,i,a))}return a}const ke={$oid:ie,$binary:Vt,$uuid:Vt,$symbol:ce,$numberInt:At,$numberDecimal:_t,$numberDouble:Dt,$numberLong:wt,$minKey:qt,$maxKey:$t,$regex:oe,$regularExpression:oe,$timestamp:ae};function He(t,e={}){if("number"==typeof t){const n=t<=W&&t>=f,i=t<=g&&t>=I;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new At(t);if(i)return e.useBigInt64?BigInt(t):wt.fromNumber(t)}return new Dt(t)}if(null==t||"object"!=typeof t)return t;if(t.$undefined)return null;const n=Object.keys(t).filter((e=>e.startsWith("$")&&null!=t[e]));for(let i=0;i<n.length;i++){const l=ke[n[i]];if(l)return l.fromExtendedJSON(t,e)}if(null!=t.$date){const n=t.$date,i=new Date;if(e.legacy)if("number"==typeof n)i.setTime(n);else if("string"==typeof n)i.setTime(Date.parse(n));else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}else if("string"==typeof n)i.setTime(Date.parse(n));else if(wt.isLong(n))i.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)i.setTime(n);else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}return i}if(null!=t.$code){const e=Object.assign({},t);return t.$scope&&(e.$scope=He(t.$scope)),Yt.fromExtendedJSON(t)}if(St(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof Jt)return e;const n=Object.keys(e).filter((t=>t.startsWith("$")));let i=!0;if(n.forEach((t=>{-1===["$ref","$id","$db"].indexOf(t)&&(i=!1)})),i)return Jt.fromExtendedJSON(e)}return t}function Be(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function je(t,e){if(t instanceof Map||p(t)){const n=Object.create(null);for(const[e,i]of t){if("string"!=typeof e)throw new A("Can only serialize maps with string keys");n[e]=i}return je(n,e)}if(("object"==typeof t||"function"==typeof t)&&null!==t){const n=e.seenObjects.findIndex((e=>e.obj===t));if(-1!==n){const t=e.seenObjects.map((t=>t.propertyName)),i=t.slice(0,n).map((t=>`${t} -> `)).join(""),l=t[n],o=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),c=t[t.length-1],s=" ".repeat(i.length+l.length/2),a="-".repeat(o.length+(l.length+c.length)/2-1);throw new A(`Converting circular structure to EJSON:\n ${i}${l}${o}${c}\n ${s}\\${a}/`)}e.seenObjects[e.seenObjects.length-1].obj=t}if(Array.isArray(t))return function(t,e){return t.map(((t,n)=>{e.seenObjects.push({propertyName:`index ${n}`,obj:null});try{return je(t,e)}finally{e.seenObjects.pop()}}))}(t,e);if(void 0===t)return e.ignoreUndefined?void 0:null;if(t instanceof Date||X(t)){const n=t.getTime(),i=n>-1&&n<2534023008e5;return e.legacy?e.relaxed&&i?{$date:t.getTime()}:{$date:Be(t)}:e.relaxed&&i?{$date:Be(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=f&&t<=W)return{$numberInt:t.toString()};if(t>=I&&t<=g)return{$numberLong:t.toString()}}return{$numberDouble:Object.is(t,-0)?"-0.0":t.toString()}}if("bigint"==typeof t)return e.relaxed?Number(BigInt.asIntN(64,t)):{$numberLong:BigInt.asIntN(64,t).toString()};if(t instanceof RegExp||h(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new oe(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new A("not an object instance");const n=t._bsontype;if(void 0===n){const n={};for(const i of Object.keys(t)){e.seenObjects.push({propertyName:i,obj:null});try{const l=je(t[i],e);"__proto__"===i?Object.defineProperty(n,i,{value:l,writable:!0,enumerable:!0,configurable:!0}):n[i]=l}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[V]!==G)throw new $;if(function(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"string"==typeof t._bsontype}(t)){let i=t;if("function"!=typeof i.toExtendedJSON){const e=Ce[t._bsontype];if(!e)throw new A("Unrecognized or invalid _bsontype: "+t._bsontype);i=e(i)}return"Code"===n&&i.scope?i=new Yt(i.code,je(i.scope,e)):"DBRef"===n&&i.oid&&(i=new Jt(je(i.collection,e),je(i.oid,e),je(i.db,e),je(i.fields,e))),i.toExtendedJSON(e)}throw new A("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const Ce={Binary:t=>new Vt(t.value(),t.sub_type),Code:t=>new Yt(t.code,t.scope),DBRef:t=>new Jt(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new _t(t.bytes),Double:t=>new Dt(t.value),Int32:t=>new At(t.value),Long:t=>wt.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new $t,MinKey:()=>new qt,ObjectId:t=>new ie(t),BSONRegExp:t=>new oe(t.pattern,t.options),BSONSymbol:t=>new ce(t.value),Timestamp:t=>ae.fromBits(t.low,t.high)};function ve(t,e){const n={useBigInt64:e?.useBigInt64??!1,relaxed:e?.relaxed??!0,legacy:e?.legacy??!1};return JSON.parse(t,((t,e)=>{if(-1!==t.indexOf("\0"))throw new A(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return He(e,n)}))}function Me(t,e,n,i){null!=n&&"object"==typeof n&&(i=n,n=void 0),null==e||"object"!=typeof e||Array.isArray(e)||(i=e,e=void 0);const l=je(t,Object.assign({relaxed:!0,legacy:!1},i,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(l,e,n)}const Pe=Object.create(null);Pe.parse=ve,Pe.stringify=Me,Pe.serialize=function(t,e){return e=e||{},JSON.parse(Me(t,e))},Pe.deserialize=function(t,e){return e=e||{},ve(JSON.stringify(t),e)},Object.freeze(Pe);const Fe=1,Qe=2,Ee=3,Oe=4,_e=5,De=6,Ae=7,$e=8,qe=9,tn=10,en=11,nn=12,ln=13,on=14,cn=15,sn=16,an=17,dn=18,bn=19,rn=255,Zn=127;function mn(t,e){try{return Gt.getNonnegativeInt32LE(t,e)}catch(t){throw new tt("BSON size cannot be negative",e,{cause:t})}}function un(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new tt("Null terminator not found",e);return n}const hn=Object.create(null);hn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new tt(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=mn(t,e);if(n>t.length-e)throw new tt(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new tt("BSON documents must end in 0x00",e+n);const i=[];let l=e+4;for(;l<=n+e;){const o=t[l];if(l+=1,0===o){if(l-e!==n)throw new tt("Invalid 0x00 type byte",l);break}const c=l,s=un(t,l)-c;let a;if(l+=s+1,o===Fe||o===dn||o===qe||o===an)a=8;else if(o===sn)a=4;else if(o===Ae)a=12;else if(o===bn)a=16;else if(o===$e)a=1;else if(o===tn||o===De||o===Zn||o===rn)a=0;else if(o===en)a=un(t,un(t,l)+1)+1-l;else if(o===Ee||o===Oe||o===cn)a=mn(t,l);else{if(o!==Qe&&o!==_e&&o!==nn&&o!==ln&&o!==on)throw new tt(`Invalid 0x${o.toString(16).padStart(2,"0")} type byte`,l);a=mn(t,l)+4,o===_e&&(a+=1),o===nn&&(a+=12)}if(a>n)throw new tt("value reports length larger than document",l);i.push([o,c,s,l,a]),l+=a}return i},hn.ByteUtils=mt,hn.NumberUtils=Gt,Object.freeze(hn);const pn=17825792;let Xn=mt.allocate(pn);var yn=Object.freeze({__proto__:null,BSONError:A,BSONOffsetError:tt,BSONRegExp:oe,BSONRuntimeError:q,BSONSymbol:ce,BSONType:D,BSONValue:ht,BSONVersionError:$,Binary:Vt,ByteUtils:mt,Code:Yt,DBRef:Jt,Decimal128:_t,Double:Dt,EJSON:Pe,Int32:At,Long:wt,MaxKey:$t,MinKey:qt,NumberUtils:Gt,ObjectId:ie,Timestamp:ae,UUID:It,bsonType:ut,calculateObjectSize:function(t,e={}){return function(t,e,n){const i=[{object:t,ignoreUndefined:n??!1,exit:!1}],l=new Set;let o=0;for(;i.length>0;){const t=i.pop();if(t.exit){l.delete(t.object);continue}const{object:n,ignoreUndefined:c}=t;l.add(n),t.exit=!0,i.push(t),o+=5;const s=Array.isArray(n),a=!s&&(n instanceof Map||p(n));let d=n;if(s||a||"function"!=typeof n?.toBSON||(d=n.toBSON()),s){const t=d;for(let n=0;n<t.length;n++)o+=le(n.toString(),t[n],e,!0,c,i,l)}else if(a)for(const[t,n]of d)o+=le(t,n,e,!1,c,i,l);else for(const t of Object.keys(d))o+=le(t,d[t],e,!1,c,i,l)}return o}(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return re(mt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,i,l,o){const c=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},o),s=mt.toLocalBufferType(t);let a=e;for(let t=0;t<n;t++){const e=Gt.getInt32LE(s,a);c.index=a,i[l+t]=re(s,c),a+=e}return a},onDemand:hn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,i="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,l="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,o="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:pn;Xn.length<o&&(Xn=mt.allocate(o));const c=we(Xn,t,n,0,i,l,null),s=mt.allocateUnsafe(c);return s.set(Xn.subarray(0,c),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const i="boolean"==typeof n.checkKeys&&n.checkKeys,l="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,o="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,c="number"==typeof n.index?n.index:0,s=we(Xn,t,i,0,l,o,null);return e.set(Xn.subarray(0,s),c),c+s-1},setInternalBufferSize:function(t){Xn.length<t&&(Xn=mt.allocate(t))}});function Gn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function Vn({client:t,limit:e,page_token:i}){const l="/user/factory/finishes"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Wn({client:t,limit:e,page_token:i}){const l="/user/factory/materials"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function fn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/factory/jobs"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function gn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/factory/jobs"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function In({client:t,limit:e,page_token:i,sort_by:l}){const c="/ml/conversations"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Yn({client:t,limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}){const d="/user/text-to-cad"+n({limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}),b=(t?.baseUrl||"https://api.zoo.dev")+d,r=t&&t.token||"",Z={};r&&(Z.Authorization=`Bearer ${r}`);const m={method:"GET",headers:Z},u=t?.fetch||fetch,h=await u(b,m);await o(h);return await h.json()}class Sn{constructor(){}static urlConstructFrom(t){const e="/ws/modeling/commands"+n({video_res_width:t.video_res_width,video_res_height:t.video_res_height,fps:t.fps,unlocked_framerate:t.unlocked_framerate,post_effect:t.post_effect,webrtc:t.webrtc,geometry_only:t.geometry_only,pool:t.pool,show_grid:t.show_grid,replay:t.replay,api_call_id:t.api_call_id,order_independent_transparency:t.order_independent_transparency,kcl_version:t.kcl_version,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}}async function Jn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Rn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function xn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Kn({client:t,id:e,limit:i,page_token:l,sort_by:c,filter:s,q:a,phase:d}){const b=`/org/datasets/${e}/conversions`+n({limit:i,page_token:l,sort_by:c,filter:s,q:a,phase:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);await o(p);return await p.json()}async function Ln({client:t,limit:e,page_token:i,lookup_enabled:l,sort_by:c}){const s="/org/datasets"+n({limit:e,page_token:i,lookup_enabled:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function Tn({client:t,limit:e,page_token:i,sort_by:l,role:c}){const s="/org/members"+n({limit:e,page_token:i,sort_by:l,role:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function Un({client:t,limit:e,page_token:i}){const l="/org/skills"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Nn({client:t,id:e,limit:i,page_token:l,q:c,sort_by:s,filter:a,phase:d}){const b=`/org/datasets/${e}/search/conversions`+n({limit:i,page_token:l,q:c,sort_by:s,filter:a,phase:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);await o(p);return await p.json()}async function zn({client:t,limit:e,page_token:i}){const l="/org/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function wn({client:t,limit:e,page_token:i}){const l="/user/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function kn({client:t,limit:e,page_token:i}){const l="/org/payment/methods"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Hn({client:t,limit:e,page_token:i}){const l="/user/payment/methods"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Bn({client:t,id:e,limit:i,page_token:l}){const c=`/user/projects/${e}/share-links`+n({limit:i,page_token:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function jn({client:t,id:e,limit:i,page_token:l}){const c=`/user/projects/${e}/versions`+n({limit:i,page_token:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Cn({client:t,limit:e,page_token:i}){const l="/projects/public"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function vn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/service-accounts"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Mn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}var Pn=null;try{var Fn="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");Pn=Fn.Worker}catch(t){}function Qn(t,e,n){var i=void 0===e?null:e,l=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:"");return function(t){return new Pn(c,Object.assign({},t,{eval:!0}))}}function En(t,e,n){var i=void 0===e?null:e,l=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),l=0,o=n.length;l<o;++l)i[l]=n.charCodeAt(l);return new TextDecoder("utf-16le").decode(new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:""),s=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(s)}var On="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function _n(t,e,n){return On?Qn(t,e,n):function(t,e,n){var i;return function(l){return i=i||En(t,e,n),new Worker(i,l)}}(t,e,n)}var Dn=_n("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGx7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGwoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1fKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBmKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBiKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpkKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgseD1NYXRoLnBvdygyLDYzKS0xLEI9LU1hdGgucG93KDIsNjMpLFU9TWF0aC5wb3coMiw1MyksRT0tTWF0aC5wb3coMiw1MyksST0xLE89MixOPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxqPTksUj0xMCxGPTExLGs9MTIsej0xMyxDPTE0LEQ9MTUsVj0xNixNPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5OmYsdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IF9lPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxsZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Zix0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFsZS50ZXN0KHIpKWJyZWFrO2lmKCFsZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6X2Usc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sZmU9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBkZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGJlPW5ldyBVaW50OEFycmF5KGRlLmJ1ZmZlciwwLDgpO2RlWzBdPS0xO2NvbnN0IHdlPTA9PT1iZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGJlWzddPWVbdF0sYmVbNl09ZVt0KzFdLGJlWzVdPWVbdCsyXSxiZVs0XT1lW3QrM10sYmVbM109ZVt0KzRdLGJlWzJdPWVbdCs1XSxiZVsxXT1lW3QrNl0sYmVbMF09ZVt0KzddLGRlWzBdKTooZSx0KT0+KGJlWzBdPWVbdF0sYmVbMV09ZVt0KzFdLGJlWzJdPWVbdCsyXSxiZVszXT1lW3QrM10sYmVbNF09ZVt0KzRdLGJlWzVdPWVbdCs1XSxiZVs2XT1lW3QrNl0sYmVbN109ZVt0KzddLGRlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oZGVbMF09bixlW3RdPWJlWzddLGVbdCsxXT1iZVs2XSxlW3QrMl09YmVbNV0sZVt0KzNdPWJlWzRdLGVbdCs0XT1iZVszXSxlW3QrNV09YmVbMl0sZVt0KzZdPWJlWzFdLGVbdCs3XT1iZVswXSw4KTooZSx0LG4pPT4oZGVbMF09bixlW3RdPWJlWzBdLGVbdCsxXT1iZVsxXSxlW3QrMl09YmVbMl0sZVt0KzNdPWJlWzNdLGVbdCs0XT1iZVs0XSxlW3QrNV09YmVbNV0sZVt0KzZdPWJlWzZdLGVbdCs3XT1iZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPTI1NSYodD8/eWUuQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUKSxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1mZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9mZS5mcm9tTnVtYmVyQXJyYXkoZSk6ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1mZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KGZlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gZmUudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP2ZlLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9mZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpmZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1mZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyBCZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiAoJHt0eXBlb2YgdGhpcy5zdWJfdHlwZX0pIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbnZlcnRpbmcgdG8gVVVJRC4gT25seSAweCR7eWUuU1VCVFlQRV9VVUlELnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCl9c3RhdGljIGNyZWF0ZUZyb21IZXhTdHJpbmcoZSx0KXtyZXR1cm4gbmV3IHllKGZlLmZyb21IZXgoZSksdCl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSx0KXtyZXR1cm4gbmV3IHllKGZlLmZyb21CYXNlNjQoZSksdCl9c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtsZXQgbixyO2lmKHQ9dHx8e30sIiRiaW5hcnkiaW4gZT90LmxlZ2FjeSYmInN0cmluZyI9PXR5cGVvZiBlLiRiaW5hcnkmJiIkdHlwZSJpbiBlPyhyPWUuJHR5cGU/cGFyc2VJbnQoZS4kdHlwZSwxNik6MCxuPWZlLmZyb21CYXNlNjQoZS4kYmluYXJ5KSk6InN0cmluZyIhPXR5cGVvZiBlLiRiaW5hcnkmJihyPWUuJGJpbmFyeS5zdWJUeXBlP3BhcnNlSW50KGUuJGJpbmFyeS5zdWJUeXBlLDE2KTowLG49ZmUuZnJvbUJhc2U2NChlLiRiaW5hcnkuYmFzZTY0KSk6IiR1dWlkImluIGUmJihyPTQsbj1CZS5ieXRlc0Zyb21TdHJpbmcoZS4kdXVpZCkpLCFuKXRocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJpbmFyeSBFeHRlbmRlZCBKU09OIGZvcm1hdCAke0pTT04uc3RyaW5naWZ5KGUpfWApO3JldHVybiByPT09SD9uZXcgQmUobik6bmV3IHllKG4scil9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYEJpbmFyeS5jcmVhdGVGcm9tQmFzZTY0KCR7bihmZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKSx0KX0sICR7bih0aGlzLnN1Yl90eXBlLHQpfSlgfXRvSW50OEFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuSW50OCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBJbnQ4Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBJbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKX10b0Zsb2F0MzJBcnJheSgpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzIpdGhyb3cgbmV3IFooIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgRmxvYXQzMiIpO21lKHRoaXMpO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKTtyZXR1cm4gcGUuaXNCaWdFbmRpYW4mJmZlLnN3YXAzMihlKSxuZXcgRmxvYXQzMkFycmF5KGUuYnVmZmVyKX10b1BhY2tlZEJpdHMoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQpdGhyb3cgbmV3IFooIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgcGFja2VkIGJpdCIpO3JldHVybiBtZSh0aGlzKSxuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7bWUodGhpcyk7Y29uc3QgZT04Kih0aGlzLmxlbmd0aCgpLTIpLXRoaXMuYnVmZmVyWzFdLHQ9bmV3IEludDhBcnJheShlKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgbj1lLzh8MCxyPXRoaXMuYnVmZmVyW24rMl0+PjctZSU4JjE7dFtlXT1yfXJldHVybiB0fXN0YXRpYyBmcm9tSW50OEFycmF5KGUpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuSW50OCx0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUZsb2F0MzJBcnJheShlKXtjb25zdCB0PWZlLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTt0WzBdPXllLlZFQ1RPUl9UWVBFLkZsb2F0MzIsdFsxXT0wO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7dC5zZXQobiwyKSxwZS5pc0JpZ0VuZGlhbiYmZmUuc3dhcDMyKG5ldyBVaW50OEFycmF5KHQuYnVmZmVyLDIpKTtjb25zdCByPW5ldyB0aGlzKHQsdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIG1lKHIpLHJ9c3RhdGljIGZyb21QYWNrZWRCaXRzKGUsdD0wKXtjb25zdCBuPWZlLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTtuWzBdPXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCxuWzFdPXQsbi5zZXQoZSwyKTtjb25zdCByPW5ldyB0aGlzKG4sdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIG1lKHIpLHJ9c3RhdGljIGZyb21CaXRzKGUpe2NvbnN0IHQ9ZS5sZW5ndGgrNz4+PjMsbj1uZXcgVWludDhBcnJheSh0KzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0O2NvbnN0IHI9ZS5sZW5ndGglODtuWzFdPTA9PT1yPzA6OC1yO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCByPXQ+Pj4zLGk9ZVt0XTtpZigwIT09aSYmMSE9PWkpdGhyb3cgbmV3IFooYEludmFsaWQgYml0IHZhbHVlIGF0ICR7dH06IG11c3QgYmUgMCBvciAxLCBmb3VuZCAke2VbdF19YCk7aWYoMD09PWkpY29udGludWU7Y29uc3Qgbz03LXQlODtuW3IrMl18PWk8PG99cmV0dXJuIG5ldyB0aGlzKG4seWUuU1VCVFlQRV9WRUNUT1IpfX1mdW5jdGlvbiBtZShlKXtpZihlLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpcmV0dXJuO2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUuYnVmZmVyWzBdLHI9ZS5idWZmZXJbMV07aWYoKG49PT15ZS5WRUNUT1JfVFlQRS5GbG9hdDMyfHxuPT09eWUuVkVDVE9SX1RZUEUuSW50OCkmJjAhPT1yKXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIGludDggYW5kIGZsb2F0MzIgdmVjdG9ycyIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5GbG9hdDMyJiYwIT09dCYmdC0yIT0wJiYodC0yKSU0IT0wKXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogRmxvYXQzMiB2ZWN0b3IgbXVzdCBjb250YWluIGEgbXVsdGlwbGUgb2YgNCBieXRlcyIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJjAhPT1yJiYyPT09dCl0aHJvdyBuZXcgWigiSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSB6ZXJvIGZvciBwYWNrZWQgYml0IHZlY3RvcnMgdGhhdCBhcmUgZW1wdHkiKTtpZihuPT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0JiZyPjcpdGhyb3cgbmV3IFooYEludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDcuIGZvdW5kOiAke3J9YCl9Y29uc3QgU2U9L15bMC05QS1GXXszMn0kL2kseGU9L15bMC05QS1GXXs4fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXsxMn0kL2k7Y2xhc3MgQmUgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3RvcihlKXtsZXQgdDtpZihudWxsPT1lKXQ9QmUuZ2VuZXJhdGUoKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBCZSl0PWZlLnRvTG9jYWxCdWZmZXJUeXBlKG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSk7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJjE2PT09ZS5ieXRlTGVuZ3RoKXQ9ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIkFyZ3VtZW50IHBhc3NlZCBpbiBVVUlEIGNvbnN0cnVjdG9yIG11c3QgYmUgYSBVVUlELCBhIDE2IGJ5dGUgQnVmZmVyIG9yIGEgMzIvMzYgY2hhcmFjdGVyIGhleCBzdHJpbmcgKGRhc2hlcyBleGNsdWRlZC9pbmNsdWRlZCwgZm9ybWF0OiB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgpLiIpO3Q9QmUuYnl0ZXNGcm9tU3RyaW5nKGUpfXN1cGVyKHQsSCl9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lfXRvSGV4U3RyaW5nKGU9ITApe3JldHVybiBlP1tmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLDQpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg0LDYpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg2LDgpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg4LDEwKSksZmUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoMTAsMTYpKV0uam9pbigiLSIpOmZlLnRvSGV4KHRoaXMuYnVmZmVyKX10b1N0cmluZyhlKXtyZXR1cm4iaGV4Ij09PWU/ZmUudG9IZXgodGhpcy5pZCk6ImJhc2U2NCI9PT1lP2ZlLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfWVxdWFscyhlKXtpZighZSlyZXR1cm4hMTtpZihlIGluc3RhbmNlb2YgQmUpcmV0dXJuIGZlLmVxdWFscyhlLmlkLHRoaXMuaWQpO3RyeXtyZXR1cm4gZmUuZXF1YWxzKG5ldyBCZShlKS5pZCx0aGlzLmlkKX1jYXRjaHtyZXR1cm4hMX19dG9CaW5hcnkoKXtyZXR1cm4gbmV3IHllKHRoaXMuaWQseWUuU1VCVFlQRV9VVUlEKX1zdGF0aWMgZ2VuZXJhdGUoKXtjb25zdCBlPWZlLnJhbmRvbUJ5dGVzKDE2KTtyZXR1cm4gZVs2XT0xNSZlWzZdfDY0LGVbOF09NjMmZVs4XXwxMjgsZX1zdGF0aWMgaXNWYWxpZChlKXtyZXR1cm4hIWUmJigic3RyaW5nIj09dHlwZW9mIGU/QmUuaXNWYWxpZFVVSURTdHJpbmcoZSk6ZihlKT8xNj09PWUuYnl0ZUxlbmd0aDoiQmluYXJ5Ij09PWUuX2Jzb250eXBlJiZlLnN1Yl90eXBlPT09dGhpcy5TVUJUWVBFX1VVSUQmJjE2PT09ZS5idWZmZXIuYnl0ZUxlbmd0aCl9c3RhdGljIGNyZWF0ZUZyb21IZXhTdHJpbmcoZSl7Y29uc3QgdD1CZS5ieXRlc0Zyb21TdHJpbmcoZSk7cmV0dXJuIG5ldyBCZSh0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlKXtyZXR1cm4gbmV3IEJlKGZlLmZyb21CYXNlNjQoZSkpfXN0YXRpYyBieXRlc0Zyb21TdHJpbmcoZSl7aWYoIUJlLmlzVmFsaWRVVUlEU3RyaW5nKGUpKXRocm93IG5ldyBaKCJVVUlEIHN0cmluZyByZXByZXNlbnRhdGlvbiBtdXN0IGJlIDMyIGhleCBkaWdpdHMgb3IgY2Fub25pY2FsIGh5cGhlbmF0ZWQgcmVwcmVzZW50YXRpb24iKTtyZXR1cm4gZmUuZnJvbUhleChlLnJlcGxhY2UoLy0vZywiIikpfXN0YXRpYyBpc1ZhbGlkVVVJRFN0cmluZyhlKXtyZXR1cm4gU2UudGVzdChlKXx8eGUudGVzdChlKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PXcsYG5ldyBVVUlEKCR7bih0aGlzLnRvSGV4U3RyaW5nKCksdCl9KWB9fWNsYXNzIFVlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJDb2RlIn1jb2RlO3Njb3BlO2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvZGU9ZS50b1N0cmluZygpLHRoaXMuc2NvcGU9dD8/bnVsbH10b0pTT04oKXtyZXR1cm4gbnVsbCE9dGhpcy5zY29wZT97Y29kZTp0aGlzLmNvZGUsc2NvcGU6dGhpcy5zY29wZX06e2NvZGU6dGhpcy5jb2RlfX10b0V4dGVuZGVkSlNPTigpe3JldHVybiB0aGlzLnNjb3BlP3skY29kZTp0aGlzLmNvZGUsJHNjb3BlOnRoaXMuc2NvcGV9OnskY29kZTp0aGlzLmNvZGV9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe3JldHVybiBuZXcgVWUoZS4kY29kZSxlLiRzY29wZSl9aW5zcGVjdChlLHQsbil7bj8/PXc7bGV0IHI9bih0aGlzLmNvZGUsdCk7Y29uc3QgaT1yLmluY2x1ZGVzKCJcbiIpO251bGwhPXRoaXMuc2NvcGUmJihyKz1gLCR7aT8iXG4iOiIgIn0ke24odGhpcy5zY29wZSx0KX1gKTtyZXR1cm5gbmV3IENvZGUoJHtpPyJcbiI6IiJ9JHtyfSR7aSYmbnVsbD09PXRoaXMuc2NvcGU/IlxuIjoiIn0pYH19ZnVuY3Rpb24gRWUoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIiRpZCJpbiBlJiZudWxsIT1lLiRpZCYmIiRyZWYiaW4gZSYmInN0cmluZyI9PXR5cGVvZiBlLiRyZWYmJighKCIkZGIiaW4gZSl8fCIkZGIiaW4gZSYmInN0cmluZyI9PXR5cGVvZiBlLiRkYil9Y2xhc3MgSWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRCUmVmIn1jb2xsZWN0aW9uO29pZDtkYjtmaWVsZHM7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoKTtjb25zdCBpPWUuc3BsaXQoIi4iKTsyPT09aS5sZW5ndGgmJihuPWkuc2hpZnQoKSxlPWkuc2hpZnQoKSksdGhpcy5jb2xsZWN0aW9uPWUsdGhpcy5vaWQ9dCx0aGlzLmRiPW4sdGhpcy5maWVsZHM9cnx8e319Z2V0IG5hbWVzcGFjZSgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2V0IG5hbWVzcGFjZShlKXt0aGlzLmNvbGxlY3Rpb249ZX10b0pTT04oKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oeyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH0sdGhpcy5maWVsZHMpO3JldHVybiBudWxsIT10aGlzLmRiJiYoZS4kZGI9dGhpcy5kYiksZX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9O2xldCB0PXskcmVmOnRoaXMuY29sbGVjdGlvbiwkaWQ6dGhpcy5vaWR9O3JldHVybiBlLmxlZ2FjeXx8KHRoaXMuZGImJih0LiRkYj10aGlzLmRiKSx0PU9iamVjdC5hc3NpZ24odCx0aGlzLmZpZWxkcykpLHR9c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBkZWxldGUgdC4kcmVmLGRlbGV0ZSB0LiRpZCxkZWxldGUgdC4kZGIsbmV3IEllKGUuJHJlZixlLiRpZCxlLiRkYix0KX1pbnNwZWN0KGUsdCxuKXtuPz89dztjb25zdCByPVtuKHRoaXMubmFtZXNwYWNlLHQpLG4odGhpcy5vaWQsdCksLi4udGhpcy5kYj9bbih0aGlzLmRiLHQpXTpbXSwuLi5PYmplY3Qua2V5cyh0aGlzLmZpZWxkcykubGVuZ3RoPjA/W24odGhpcy5maWVsZHMsdCldOltdXTtyZXR1cm4gclsxXT1uPT09dz9gbmV3IE9iamVjdElkKCR7clsxXX0pYDpyWzFdLGBuZXcgREJSZWYoJHtyLmpvaW4oIiwgIil9KWB9fWZ1bmN0aW9uIE9lKGUpe2lmKCIiPT09ZSlyZXR1cm4gZTtsZXQgdD0wO2NvbnN0IG49Ii0iPT09ZVt0XSxyPSIrIj09PWVbdF07KHJ8fG4pJiYodCs9MSk7bGV0IGk9ITE7Zm9yKDt0PGUubGVuZ3RoJiYiMCI9PT1lW3RdOysrdClpPSEwO3JldHVybiBpP2Ake24/Ii0iOiIifSR7ZS5sZW5ndGg9PT10PyIwIjplLnNsaWNlKHQpfWA6cj9lLnNsaWNlKDEpOmV9bGV0IE5lO3RyeXtOZT1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSwxMywyLDk2LDAsMSwxMjcsOTYsNCwxMjcsMTI3LDEyNywxMjcsMSwxMjcsMyw3LDYsMCwxLDEsMSwxLDEsNiw2LDEsMTI3LDEsNjUsMCwxMSw3LDUwLDYsMywxMDksMTE3LDEwOCwwLDEsNSwxMDAsMTA1LDExOCw5NSwxMTUsMCwyLDUsMTAwLDEwNSwxMTgsOTUsMTE3LDAsMyw1LDExNCwxMDEsMTA5LDk1LDExNSwwLDQsNSwxMTQsMTAxLDEwOSw5NSwxMTcsMCw1LDgsMTAzLDEwMSwxMTYsOTUsMTA0LDEwNSwxMDMsMTA0LDAsMCwxMCwxOTEsMSw2LDQsMCwzNSwwLDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNiwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjcsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI4LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyOSwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMzAsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTFdKSkse30pLmV4cG9ydHN9Y2F0Y2h7fWNvbnN0IHZlPTQyOTQ5NjcyOTYsVGU9MHgxMDAwMDAwMDAwMDAwMDAwMCwkZT1UZS8yLExlPXt9LEFlPXt9LGplPS9eKFwrPzB8KFwrfC0pP1sxLTldWzAtOV0qKSQvO2NsYXNzIFJlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJMb25nIn1nZXQgX19pc0xvbmdfXygpe3JldHVybiEwfWhpZ2g7bG93O3Vuc2lnbmVkO2NvbnN0cnVjdG9yKGU9MCx0LG4pe3N1cGVyKCk7Y29uc3Qgcj0iYm9vbGVhbiI9PXR5cGVvZiB0P3Q6Qm9vbGVhbihuKSxpPSJudW1iZXIiPT10eXBlb2YgdD90OjAsbz0ic3RyaW5nIj09dHlwZW9mIGU/UmUuZnJvbVN0cmluZyhlLHIpOiJiaWdpbnQiPT10eXBlb2YgZT9SZS5mcm9tQmlnSW50KGUscik6e2xvdzowfGUsaGlnaDowfGksdW5zaWduZWQ6cn07dGhpcy5sb3c9by5sb3csdGhpcy5oaWdoPW8uaGlnaCx0aGlzLnVuc2lnbmVkPW8udW5zaWduZWR9c3RhdGljIFRXT19QV1JfMjQ9UmUuZnJvbUludCgxNjc3NzIxNik7c3RhdGljIE1BWF9VTlNJR05FRF9WQUxVRT1SZS5mcm9tQml0cygtMSwtMSwhMCk7c3RhdGljIFpFUk89UmUuZnJvbUludCgwKTtzdGF0aWMgVVpFUk89UmUuZnJvbUludCgwLCEwKTtzdGF0aWMgT05FPVJlLmZyb21JbnQoMSk7c3RhdGljIFVPTkU9UmUuZnJvbUludCgxLCEwKTtzdGF0aWMgTkVHX09ORT1SZS5mcm9tSW50KC0xKTtzdGF0aWMgTUFYX1ZBTFVFPVJlLmZyb21CaXRzKC0xLDIxNDc0ODM2NDcsITEpO3N0YXRpYyBNSU5fVkFMVUU9UmUuZnJvbUJpdHMoMCwtMjE0NzQ4MzY0OCwhMSk7c3RhdGljIGZyb21CaXRzKGUsdCxuKXtyZXR1cm4gbmV3IFJlKGUsdCxuKX1zdGF0aWMgZnJvbUludChlLHQpe2xldCBuLHIsaTtyZXR1cm4gdD8oaT0wPD0oZT4+Pj0wKSYmZTwyNTYpJiYocj1BZVtlXSxyKT9yOihuPVJlLmZyb21CaXRzKGUsKDB8ZSk8MD8tMTowLCEwKSxpJiYoQWVbZV09biksbik6KGk9LTEyODw9KGV8PTApJiZlPDEyOCkmJihyPUxlW2VdLHIpP3I6KG49UmUuZnJvbUJpdHMoZSxlPDA/LTE6MCwhMSksaSYmKExlW2VdPW4pLG4pfXN0YXRpYyBmcm9tTnVtYmVyKGUsdCl7aWYoaXNOYU4oZSkpcmV0dXJuIHQ/UmUuVVpFUk86UmUuWkVSTztpZih0KXtpZihlPDApcmV0dXJuIFJlLlVaRVJPO2lmKGU+PVRlKXJldHVybiBSZS5NQVhfVU5TSUdORURfVkFMVUV9ZWxzZXtpZihlPD0tJGUpcmV0dXJuIFJlLk1JTl9WQUxVRTtpZihlKzE+PSRlKXJldHVybiBSZS5NQVhfVkFMVUV9cmV0dXJuIGU8MD9SZS5mcm9tTnVtYmVyKC1lLHQpLm5lZygpOlJlLmZyb21CaXRzKGUldmV8MCxlL3ZlfDAsdCl9c3RhdGljIGZyb21CaWdJbnQoZSx0KXtjb25zdCBuPTB4ZmZmZmZmZmZuO3JldHVybiBuZXcgUmUoTnVtYmVyKGUmbiksTnVtYmVyKGU+PjMybiZuKSx0KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiZW1wdHkgc3RyaW5nIik7aWYobjwyfHwzNjxuKXRocm93IG5ldyBaKCJyYWRpeCIpO2xldCByO2lmKChyPWUuaW5kZXhPZigiLSIpKT4wKXRocm93IG5ldyBaKCJpbnRlcmlvciBoeXBoZW4iKTtpZigwPT09cilyZXR1cm4gUmUuX2Zyb21TdHJpbmcoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtjb25zdCBpPVJlLmZyb21OdW1iZXIoTWF0aC5wb3cobiw4KSk7bGV0IG89UmUuWkVSTztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTgpe2NvbnN0IHI9TWF0aC5taW4oOCxlLmxlbmd0aC10KSxzPXBhcnNlSW50KGUuc3Vic3RyaW5nKHQsdCtyKSxuKTtpZihyPDgpe2NvbnN0IGU9UmUuZnJvbU51bWJlcihNYXRoLnBvdyhuLHIpKTtvPW8ubXVsKGUpLmFkZChSZS5mcm9tTnVtYmVyKHMpKX1lbHNlIG89by5tdWwoaSksbz1vLmFkZChSZS5mcm9tTnVtYmVyKHMpKX1yZXR1cm4gby51bnNpZ25lZD10LG99c3RhdGljIGZyb21TdHJpbmdTdHJpY3QoZSx0LG4pe2xldCByPSExO2lmKCJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCxlLnRyaW0oKSE9PWUpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZWApO2lmKCFmdW5jdGlvbihlLHQpe2NvbnN0IG49IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc2xpY2UoMCx0PXQ/PzEwKTtyZXR1cm4hbmV3IFJlZ0V4cChgW14tKyR7bn1dYCwiaSIpLnRlc3QoZSkmJmV9KGUsbikpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGZvciByYWRpeDogJHtufWApO2NvbnN0IGk9T2UoZSksbz1SZS5fZnJvbVN0cmluZyhpLHIsbik7aWYoby50b1N0cmluZyhuKS50b0xvd2VyQ2FzZSgpIT09aS50b0xvd2VyQ2FzZSgpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyAke28udW5zaWduZWQ/ImFuIHVuc2lnbmVkIjoiYSBzaWduZWQifSA2NC1iaXQgTG9uZyAke251bGwhPW4/YHdpdGggcmFkaXg6ICR7bn1gOiIifWApO3JldHVybiBvfXN0YXRpYyBmcm9tU3RyaW5nKGUsdCxuKXtsZXQgcj0hMTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTpyPSEhdCxuPz89MTAsIk5hTiI9PT1lJiZuPDI0fHwoIkluZmluaXR5Ij09PWV8fCIrSW5maW5pdHkiPT09ZXx8Ii1JbmZpbml0eSI9PT1lKSYmbjwzNT9SZS5aRVJPOlJlLl9mcm9tU3RyaW5nKGUscixuKX1zdGF0aWMgZnJvbUJ5dGVzKGUsdCxuKXtyZXR1cm4gbj9SZS5mcm9tQnl0ZXNMRShlLHQpOlJlLmZyb21CeXRlc0JFKGUsdCl9c3RhdGljIGZyb21CeXRlc0xFKGUsdCl7cmV0dXJuIG5ldyBSZShlWzBdfGVbMV08PDh8ZVsyXTw8MTZ8ZVszXTw8MjQsZVs0XXxlWzVdPDw4fGVbNl08PDE2fGVbN108PDI0LHQpfXN0YXRpYyBmcm9tQnl0ZXNCRShlLHQpe3JldHVybiBuZXcgUmUoZVs0XTw8MjR8ZVs1XTw8MTZ8ZVs2XTw8OHxlWzddLGVbMF08PDI0fGVbMV08PDE2fGVbMl08PDh8ZVszXSx0KX1zdGF0aWMgaXNMb25nKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJfX2lzTG9uZ19fImluIGUmJiEwPT09ZS5fX2lzTG9uZ19ffXN0YXRpYyBmcm9tVmFsdWUoZSx0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/UmUuZnJvbU51bWJlcihlLHQpOiJzdHJpbmciPT10eXBlb2YgZT9SZS5mcm9tU3RyaW5nKGUsdCk6UmUuZnJvbUJpdHMoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1hZGQoZSl7UmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpO2NvbnN0IHQ9dGhpcy5oaWdoPj4+MTYsbj02NTUzNSZ0aGlzLmhpZ2gscj10aGlzLmxvdz4+PjE2LGk9NjU1MzUmdGhpcy5sb3csbz1lLmhpZ2g+Pj4xNixzPTY1NTM1JmUuaGlnaCxhPWUubG93Pj4+MTY7bGV0IGM9MCxfPTAsbD0wLHU9MDtyZXR1cm4gdSs9aSsoNjU1MzUmZS5sb3cpLGwrPXU+Pj4xNix1Jj02NTUzNSxsKz1yK2EsXys9bD4+PjE2LGwmPTY1NTM1LF8rPW4rcyxjKz1fPj4+MTYsXyY9NjU1MzUsYys9dCtvLGMmPTY1NTM1LFJlLmZyb21CaXRzKGw8PDE2fHUsYzw8MTZ8Xyx0aGlzLnVuc2lnbmVkKX1hbmQoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxSZS5mcm9tQml0cyh0aGlzLmxvdyZlLmxvdyx0aGlzLmhpZ2gmZS5oaWdoLHRoaXMudW5zaWduZWQpfWNvbXBhcmUoZSl7aWYoUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLHRoaXMuZXEoZSkpcmV0dXJuIDA7Y29uc3QgdD10aGlzLmlzTmVnYXRpdmUoKSxuPWUuaXNOZWdhdGl2ZSgpO3JldHVybiB0JiYhbj8tMTohdCYmbj8xOnRoaXMudW5zaWduZWQ/ZS5oaWdoPj4+MD50aGlzLmhpZ2g+Pj4wfHxlLmhpZ2g9PT10aGlzLmhpZ2gmJmUubG93Pj4+MD50aGlzLmxvdz4+PjA/LTE6MTp0aGlzLnN1YihlKS5pc05lZ2F0aXZlKCk/LTE6MX1jb21wKGUpe3JldHVybiB0aGlzLmNvbXBhcmUoZSl9ZGl2aWRlKGUpe2lmKFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxlLmlzWmVybygpKXRocm93IG5ldyBaKCJkaXZpc2lvbiBieSB6ZXJvIik7aWYoTmUpe2lmKCF0aGlzLnVuc2lnbmVkJiYtMjE0NzQ4MzY0OD09PXRoaXMuaGlnaCYmLTE9PT1lLmxvdyYmLTE9PT1lLmhpZ2gpcmV0dXJuIHRoaXM7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9OZS5kaXZfdTpOZS5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIFJlLmZyb21CaXRzKHQsTmUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1pZih0aGlzLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP1JlLlVaRVJPOlJlLlpFUk87bGV0IHQsbixyO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiBSZS5VWkVSTztpZihlLmd0KHRoaXMuc2hydSgxKSkpcmV0dXJuIFJlLlVPTkU7cj1SZS5VWkVST31lbHNle2lmKHRoaXMuZXEoUmUuTUlOX1ZBTFVFKSl7aWYoZS5lcShSZS5PTkUpfHxlLmVxKFJlLk5FR19PTkUpKXJldHVybiBSZS5NSU5fVkFMVUU7aWYoZS5lcShSZS5NSU5fVkFMVUUpKXJldHVybiBSZS5PTkU7cmV0dXJuIHQ9dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSx0LmVxKFJlLlpFUk8pP2UuaXNOZWdhdGl2ZSgpP1JlLk9ORTpSZS5ORUdfT05FOihuPXRoaXMuc3ViKGUubXVsKHQpKSxyPXQuYWRkKG4uZGl2KGUpKSxyKX1pZihlLmVxKFJlLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMudW5zaWduZWQ/UmUuVVpFUk86UmUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO3I9UmUuWkVST31mb3Iobj10aGlzO24uZ3RlKGUpOyl7dD1NYXRoLm1heCgxLE1hdGguZmxvb3Iobi50b051bWJlcigpL2UudG9OdW1iZXIoKSkpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSxvPWk8PTQ4PzE6TWF0aC5wb3coMixpLTQ4KTtsZXQgcz1SZS5mcm9tTnVtYmVyKHQpLGE9cy5tdWwoZSk7Zm9yKDthLmlzTmVnYXRpdmUoKXx8YS5ndChuKTspdC09byxzPVJlLmZyb21OdW1iZXIodCx0aGlzLnVuc2lnbmVkKSxhPXMubXVsKGUpO3MuaXNaZXJvKCkmJihzPVJlLk9ORSkscj1yLmFkZChzKSxuPW4uc3ViKGEpfXJldHVybiByfWRpdihlKXtyZXR1cm4gdGhpcy5kaXZpZGUoZSl9ZXF1YWxzKGUpe3JldHVybiBSZS5pc0xvbmcoZSl8fChlPVJlLmZyb21WYWx1ZShlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiYodGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93KX1lcShlKXtyZXR1cm4gdGhpcy5lcXVhbHMoZSl9Z2V0SGlnaEJpdHMoKXtyZXR1cm4gdGhpcy5oaWdofWdldEhpZ2hCaXRzVW5zaWduZWQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1nZXRMb3dCaXRzKCl7cmV0dXJuIHRoaXMubG93fWdldExvd0JpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0TnVtQml0c0Ficygpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxKFJlLk1JTl9WQUxVRSk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Y29uc3QgZT0wIT09dGhpcy5oaWdoP3RoaXMuaGlnaDp0aGlzLmxvdztsZXQgdDtmb3IodD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT09dGhpcy5oaWdoP3QrMzM6dCsxfWdyZWF0ZXJUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH1ndChlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbihlKX1ncmVhdGVyVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKT49MH1ndGUoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWdlKGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuT3JFcXVhbChlKX1pc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy5sb3cpfWlzTmVnYXRpdmUoKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9aXNPZGQoKXtyZXR1cm4hKDEmfnRoaXMubG93KX1pc1Bvc2l0aXZlKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH1pc1plcm8oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fWxlc3NUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH1sdChlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbihlKX1sZXNzVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH1sdGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfW1vZHVsbyhlKXtpZihSZS5pc0xvbmcoZSl8fChlPVJlLmZyb21WYWx1ZShlKSksTmUpe2NvbnN0IHQ9KHRoaXMudW5zaWduZWQ/TmUucmVtX3U6TmUucmVtX3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBSZS5mcm9tQml0cyh0LE5lLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9cmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9bW9kKGUpe3JldHVybiB0aGlzLm1vZHVsbyhlKX1yZW0oZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfW11bHRpcGx5KGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIFJlLlpFUk87aWYoUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLE5lKXtjb25zdCB0PU5lLm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gUmUuZnJvbUJpdHModCxOZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKGUuaXNaZXJvKCkpcmV0dXJuIFJlLlpFUk87aWYodGhpcy5lcShSZS5NSU5fVkFMVUUpKXJldHVybiBlLmlzT2RkKCk/UmUuTUlOX1ZBTFVFOlJlLlpFUk87aWYoZS5lcShSZS5NSU5fVkFMVUUpKXJldHVybiB0aGlzLmlzT2RkKCk/UmUuTUlOX1ZBTFVFOlJlLlpFUk87aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KFJlLlRXT19QV1JfMjQpJiZlLmx0KFJlLlRXT19QV1JfMjQpKXJldHVybiBSZS5mcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNixjPTY1NTM1JmUubG93O2xldCBfPTAsbD0wLHU9MCxmPTA7cmV0dXJuIGYrPWkqYyx1Kz1mPj4+MTYsZiY9NjU1MzUsdSs9cipjLGwrPXU+Pj4xNix1Jj02NTUzNSx1Kz1pKmEsbCs9dT4+PjE2LHUmPTY1NTM1LGwrPW4qYyxfKz1sPj4+MTYsbCY9NjU1MzUsbCs9ciphLF8rPWw+Pj4xNixsJj02NTUzNSxsKz1pKnMsXys9bD4+PjE2LGwmPTY1NTM1LF8rPXQqYytuKmErcipzK2kqbyxfJj02NTUzNSxSZS5mcm9tQml0cyh1PDwxNnxmLF88PDE2fGwsdGhpcy51bnNpZ25lZCl9bXVsKGUpe3JldHVybiB0aGlzLm11bHRpcGx5KGUpfW5lZ2F0ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKFJlLk1JTl9WQUxVRSk/UmUuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKFJlLk9ORSl9bmVnKCl7cmV0dXJuIHRoaXMubmVnYXRlKCl9bm90KCl7cmV0dXJuIFJlLmZyb21CaXRzKH50aGlzLmxvdyx+dGhpcy5oaWdoLHRoaXMudW5zaWduZWQpfW5vdEVxdWFscyhlKXtyZXR1cm4hdGhpcy5lcXVhbHMoZSl9bmVxKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1uZShlKXtyZXR1cm4gdGhpcy5ub3RFcXVhbHMoZSl9b3IoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxSZS5mcm9tQml0cyh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfXNoaWZ0TGVmdChlKXtyZXR1cm4gUmUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP1JlLmZyb21CaXRzKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6UmUuZnJvbUJpdHMoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX1zaGwoZSl7cmV0dXJuIHRoaXMuc2hpZnRMZWZ0KGUpfXNoaWZ0UmlnaHQoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9SZS5mcm9tQml0cyh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpSZS5mcm9tQml0cyh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9c2hyKGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHQoZSl9c2hpZnRSaWdodFVuc2lnbmVkKGUpe2lmKFJlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT09KGUmPTYzKSlyZXR1cm4gdGhpczt7Y29uc3QgdD10aGlzLmhpZ2g7aWYoZTwzMil7Y29uc3Qgbj10aGlzLmxvdztyZXR1cm4gUmUuZnJvbUJpdHMobj4+PmV8dDw8MzItZSx0Pj4+ZSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gMzI9PT1lP1JlLmZyb21CaXRzKHQsMCx0aGlzLnVuc2lnbmVkKTpSZS5mcm9tQml0cyh0Pj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfX1zaHJfdShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c2hydShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c3VidHJhY3QoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSx0aGlzLmFkZChlLm5lZygpKX1zdWIoZSl7cmV0dXJuIHRoaXMuc3VidHJhY3QoZSl9dG9JbnQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9dG9OdW1iZXIoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqdmUrKHRoaXMubG93Pj4+MCk6dGhpcy5oaWdoKnZlKyh0aGlzLmxvdz4+PjApfXRvQmlnSW50KCl7cmV0dXJuIEJpZ0ludCh0aGlzLnRvU3RyaW5nKCkpfXRvQnl0ZXMoZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfXRvQnl0ZXNMRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuWzI1NSZ0LHQ+Pj44JjI1NSx0Pj4+MTYmMjU1LHQ+Pj4yNCwyNTUmZSxlPj4+OCYyNTUsZT4+PjE2JjI1NSxlPj4+MjRdfXRvQnl0ZXNCRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfXRvU2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/UmUuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCExKTp0aGlzfXRvU3RyaW5nKGUpe2lmKChlPWV8fDEwKTwyfHwzNjxlKXRocm93IG5ldyBaKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIjAiO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZih0aGlzLmVxKFJlLk1JTl9WQUxVRSkpe2NvbnN0IHQ9UmUuZnJvbU51bWJlcihlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4iLSIrdGhpcy5uZWcoKS50b1N0cmluZyhlKX1jb25zdCB0PVJlLmZyb21OdW1iZXIoTWF0aC5wb3coZSw2KSx0aGlzLnVuc2lnbmVkKTtsZXQgbj10aGlzLHI9IiI7Zm9yKDs7KXtjb25zdCBpPW4uZGl2KHQpO2xldCBvPShuLnN1YihpLm11bCh0KSkudG9JbnQoKT4+PjApLnRvU3RyaW5nKGUpO2lmKG49aSxuLmlzWmVybygpKXJldHVybiBvK3I7Zm9yKDtvLmxlbmd0aDw2OylvPSIwIitvO3I9IiIrbytyfX10b1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpczpSZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITApfXhvcihlKXtyZXR1cm4gUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLFJlLmZyb21CaXRzKHRoaXMubG93XmUubG93LHRoaXMuaGlnaF5lLmhpZ2gsdGhpcy51bnNpZ25lZCl9ZXF6KCl7cmV0dXJuIHRoaXMuaXNaZXJvKCl9bGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiZlLnJlbGF4ZWQ/dGhpcy50b051bWJlcigpOnskbnVtYmVyTG9uZzp0aGlzLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7Y29uc3R7dXNlQmlnSW50NjQ6bj0hMSxyZWxheGVkOnI9ITB9PXsuLi50fTtpZihlLiRudW1iZXJMb25nLmxlbmd0aD4yMCl0aHJvdyBuZXcgWigiJG51bWJlckxvbmcgc3RyaW5nIGlzIHRvbyBsb25nIik7aWYoIWplLnRlc3QoZS4kbnVtYmVyTG9uZykpdGhyb3cgbmV3IFooYCRudW1iZXJMb25nIHN0cmluZyAiJHtlLiRudW1iZXJMb25nfSIgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXRgKTtpZihuKXtjb25zdCB0PUJpZ0ludChlLiRudW1iZXJMb25nKTtyZXR1cm4gQmlnSW50LmFzSW50Tig2NCx0KX1jb25zdCBpPVJlLmZyb21TdHJpbmcoZS4kbnVtYmVyTG9uZyk7cmV0dXJuIHI/aS50b051bWJlcigpOml9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYG5ldyBMb25nKCR7bih0aGlzLnRvU3RyaW5nKCksdCl9JHt0aGlzLnVuc2lnbmVkP2AsICR7bih0aGlzLnVuc2lnbmVkLHQpfWA6IiJ9KWB9fWNvbnN0IEZlPS9eKFwrfC0pPyhcZCt8KFxkKlwuXGQqKSk/KEV8ZSk/KFstK10pPyhcZCspPyQvLGtlPS9eKFwrfC0pPyhJbmZpbml0eXxpbmYpJC9pLHplPS9eKFwrfC0pP05hTiQvaSxDZT02MTExLERlPS02MTc2LFZlPWZlLmZyb21OdW1iZXJBcnJheShbMTI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLE1lPWZlLmZyb21OdW1iZXJBcnJheShbMjQ4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLFBlPWZlLmZyb21OdW1iZXJBcnJheShbMTIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLEplPS9eKFstK10pPyhcZCspPyQvO2Z1bmN0aW9uIFdlKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9ZnVuY3Rpb24gWWUoZSl7Y29uc3QgdD1SZS5mcm9tTnVtYmVyKDFlOSk7bGV0IG49UmUuZnJvbU51bWJlcigwKTtpZighKGUucGFydHNbMF18fGUucGFydHNbMV18fGUucGFydHNbMl18fGUucGFydHNbM10pKXJldHVybntxdW90aWVudDplLHJlbTpufTtmb3IobGV0IHI9MDtyPD0zO3IrKyluPW4uc2hpZnRMZWZ0KDMyKSxuPW4uYWRkKG5ldyBSZShlLnBhcnRzW3JdLDApKSxlLnBhcnRzW3JdPW4uZGl2KHQpLmxvdyxuPW4ubW9kdWxvKHQpO3JldHVybntxdW90aWVudDplLHJlbTpufX1mdW5jdGlvbiBxZShlLHQpe3Rocm93IG5ldyBaKGAiJHtlfSIgaXMgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcgLSAke3R9YCl9Y2xhc3MgSGUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRlY2ltYWwxMjgifWJ5dGVzO2NvbnN0cnVjdG9yKGUpe2lmKHN1cGVyKCksInN0cmluZyI9PXR5cGVvZiBlKXRoaXMuYnl0ZXM9SGUuZnJvbVN0cmluZyhlKS5ieXRlcztlbHNle2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGYoZSkpKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvciBzdHJpbmciKTtpZigxNiE9PWUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiRGVjaW1hbDEyOCBtdXN0IHRha2UgYSBCdWZmZXIgb2YgMTYgYnl0ZXMiKTt0aGlzLmJ5dGVzPWV9fXN0YXRpYyBmcm9tU3RyaW5nKGUpe3JldHVybiBIZS5fZnJvbVN0cmluZyhlLHthbGxvd1JvdW5kaW5nOiExfSl9c3RhdGljIGZyb21TdHJpbmdXaXRoUm91bmRpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITB9KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0KXtsZXQgbj0hMSxyPSExLGk9ITEsbz0hMSxzPTAsYT0wLGM9MCxfPTAsbD0wO2NvbnN0IHU9WzBdO2xldCBmPTAsZz0wLGg9MCxkPTAsYj1uZXcgUmUoMCwwKSx3PW5ldyBSZSgwLDApLHA9MCx5PTA7aWYoZS5sZW5ndGg+PTdlMyl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtjb25zdCBtPWUubWF0Y2goRmUpLFM9ZS5tYXRjaChrZSkseD1lLm1hdGNoKHplKTtpZighbSYmIVMmJiF4fHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYobSl7Y29uc3QgdD1tWzJdLG49bVs0XSxyPW1bNV0saT1tWzZdO24mJnZvaWQgMD09PWkmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgcG93ZXIiKSxuJiZ2b2lkIDA9PT10JiZxZShlLCJtaXNzaW5nIGV4cG9uZW50IGJhc2UiKSx2b2lkIDA9PT1uJiYocnx8aSkmJnFlKGUsIm1pc3NpbmcgZSBiZWZvcmUgZXhwb25lbnQiKX1pZigiKyIhPT1lW3ldJiYiLSIhPT1lW3ldfHwocj0hMCxuPSItIj09PWVbeSsrXSksIVdlKGVbeV0pJiYiLiIhPT1lW3ldKXtpZigiaSI9PT1lW3ldfHwiSSI9PT1lW3ldKXJldHVybiBuZXcgSGUobj9NZTpQZSk7aWYoIk4iPT09ZVt5XSlyZXR1cm4gbmV3IEhlKFZlKX1mb3IoO1dlKGVbeV0pfHwiLiI9PT1lW3ldOykiLiIhPT1lW3ldPyhmPDM0JiYoIjAiIT09ZVt5XXx8bykmJihvfHwobD1hKSxvPSEwLHVbZysrXT1wYXJzZUludChlW3ldLDEwKSxmKz0xKSxvJiYoYys9MSksaSYmKF8rPTEpLGErPTEseSs9MSk6KGkmJnFlKGUsImNvbnRhaW5zIG11bHRpcGxlIHBlcmlvZHMiKSxpPSEwLHkrPTEpO2lmKGkmJiFhKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2lmKCJlIj09PWVbeV18fCJFIj09PWVbeV0pe2NvbnN0IHQ9ZS5zdWJzdHIoKyt5KS5tYXRjaChKZSk7aWYoIXR8fCF0WzJdKXJldHVybiBuZXcgSGUoVmUpO2Q9cGFyc2VJbnQodFswXSwxMCkseSs9dFswXS5sZW5ndGh9aWYoZVt5XSlyZXR1cm4gbmV3IEhlKFZlKTtpZihmKXtpZihoPWYtMSxzPWMsMSE9PXMpZm9yKDsiMCI9PT1lW2wrcy0xK051bWJlcihyKStOdW1iZXIoaSldOylzLT0xfWVsc2UgdVswXT0wLGM9MSxmPTEscz0wO2ZvcihkPD1fJiZfPmQrMTYzODQ/ZD1EZTpkLT1fO2Q+Q2U7KXtpZihoKz0xLGg+PTM0KXtpZigwPT09cyl7ZD1DZTticmVha31xZShlLCJvdmVyZmxvdyIpfWQtPTF9aWYodC5hbGxvd1JvdW5kaW5nKXtmb3IoO2Q8RGV8fGY8Yzspe2lmKDA9PT1oJiZzPGYpe2Q9RGUscz0wO2JyZWFrfWlmKGY8Yz9jLT0xOmgtPTEsZDxDZSlkKz0xO2Vsc2V7aWYodS5qb2luKCIiKS5tYXRjaCgvXjArJC8pKXtkPUNlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9fWlmKGgrMTxzKXtsZXQgdD1hO2kmJihsKz0xLHQrPTEpLHImJihsKz0xLHQrPTEpO2NvbnN0IG89cGFyc2VJbnQoZVtsK2grMV0sMTApO2xldCBzPTA7aWYobz49NSYmKHM9MSw1PT09bykpe3M9dVtoXSUyPT0xPzE6MDtmb3IobGV0IG49bCtoKzI7bjx0O24rKylpZihwYXJzZUludChlW25dLDEwKSl7cz0xO2JyZWFrfX1pZihzKXtsZXQgZT1oO2Zvcig7ZT49MCYmKyt1W2VdPjk7ZS0tKWlmKHVbZV09MCwwPT09ZSl7aWYoIShkPENlKSlyZXR1cm4gbmV3IEhlKG4/TWU6UGUpO2QrPTEsdVtlXT0xfX19fWVsc2V7Zm9yKDtkPERlfHxmPGM7KXtpZigwPT09aCl7aWYoMD09PXMpe2Q9RGU7YnJlYWt9cWUoZSwiZXhwb25lbnQgdW5kZXJmbG93Iil9ZjxjPygiMCIhPT1lW2MtMStOdW1iZXIocikrTnVtYmVyKGkpXSYmMCE9PXMmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKSxjLT0xKTooMCE9PXVbaF0mJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKSxoLT0xKSxkPENlP2QrPTE6cWUoZSwib3ZlcmZsb3ciKX1pZihoKzE8cyl7aSYmKGwrPTEpLHImJihsKz0xKTswIT09cGFyc2VJbnQoZVtsK2grMV0sMTApJiZxZShlLCJpbmV4YWN0IHJvdW5kaW5nIil9fWlmKGI9UmUuZnJvbU51bWJlcigwKSx3PVJlLmZyb21OdW1iZXIoMCksMD09PXMpYj1SZS5mcm9tTnVtYmVyKDApLHc9UmUuZnJvbU51bWJlcigwKTtlbHNlIGlmKGg8MTcpe2xldCBlPTA7Zm9yKHc9UmUuZnJvbU51bWJlcih1W2UrK10pLGI9bmV3IFJlKDAsMCk7ZTw9aDtlKyspdz13Lm11bHRpcGx5KFJlLmZyb21OdW1iZXIoMTApKSx3PXcuYWRkKFJlLmZyb21OdW1iZXIodVtlXSkpfWVsc2V7bGV0IGU9MDtmb3IoYj1SZS5mcm9tTnVtYmVyKHVbZSsrXSk7ZTw9aC0xNztlKyspYj1iLm11bHRpcGx5KFJlLmZyb21OdW1iZXIoMTApKSxiPWIuYWRkKFJlLmZyb21OdW1iZXIodVtlXSkpO2Zvcih3PVJlLmZyb21OdW1iZXIodVtlKytdKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoUmUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoUmUuZnJvbU51bWJlcih1W2VdKSl9Y29uc3QgQj1mdW5jdGlvbihlLHQpe2lmKCFlJiYhdClyZXR1cm57aGlnaDpSZS5mcm9tTnVtYmVyKDApLGxvdzpSZS5mcm9tTnVtYmVyKDApfTtjb25zdCBuPWUuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxyPW5ldyBSZShlLmdldExvd0JpdHMoKSwwKSxpPXQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxvPW5ldyBSZSh0LmdldExvd0JpdHMoKSwwKTtsZXQgcz1uLm11bHRpcGx5KGkpLGE9bi5tdWx0aXBseShvKTtjb25zdCBjPXIubXVsdGlwbHkoaSk7bGV0IF89ci5tdWx0aXBseShvKTtyZXR1cm4gcz1zLmFkZChhLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLGE9bmV3IFJlKGEuZ2V0TG93Qml0cygpLDApLmFkZChjKS5hZGQoXy5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksXz1hLnNoaWZ0TGVmdCgzMikuYWRkKG5ldyBSZShfLmdldExvd0JpdHMoKSwwKSkse2hpZ2g6cyxsb3c6X319KGIsUmUuZnJvbVN0cmluZygiMTAwMDAwMDAwMDAwMDAwMDAwIikpO0IubG93PUIubG93LmFkZCh3KSxmdW5jdGlvbihlLHQpe2NvbnN0IG49ZS5oaWdoPj4+MCxyPXQuaGlnaD4+PjA7aWYobjxyKXJldHVybiEwO2lmKG49PT1yJiZlLmxvdz4+PjA8dC5sb3c+Pj4wKXJldHVybiEwO3JldHVybiExfShCLmxvdyx3KSYmKEIuaGlnaD1CLmhpZ2guYWRkKFJlLmZyb21OdW1iZXIoMSkpKSxwPWQrNjE3Njtjb25zdCBVPXtsb3c6UmUuZnJvbU51bWJlcigwKSxoaWdoOlJlLmZyb21OdW1iZXIoMCl9O0IuaGlnaC5zaGlmdFJpZ2h0VW5zaWduZWQoNDkpLmFuZChSZS5mcm9tTnVtYmVyKDEpKS5lcXVhbHMoUmUuZnJvbU51bWJlcigxKSk/KFUuaGlnaD1VLmhpZ2gub3IoUmUuZnJvbU51bWJlcigzKS5zaGlmdExlZnQoNjEpKSxVLmhpZ2g9VS5oaWdoLm9yKFJlLmZyb21OdW1iZXIocCkuYW5kKFJlLmZyb21OdW1iZXIoMTYzODMpLnNoaWZ0TGVmdCg0NykpKSxVLmhpZ2g9VS5oaWdoLm9yKEIuaGlnaC5hbmQoUmUuZnJvbU51bWJlcigweDdmZmZmZmZmZmZmZikpKSk6KFUuaGlnaD1VLmhpZ2gub3IoUmUuZnJvbU51bWJlcigxNjM4MyZwKS5zaGlmdExlZnQoNDkpKSxVLmhpZ2g9VS5oaWdoLm9yKEIuaGlnaC5hbmQoUmUuZnJvbU51bWJlcig1NjI5NDk5NTM0MjEzMTEpKSkpLFUubG93PUIubG93LG4mJihVLmhpZ2g9VS5oaWdoLm9yKFJlLmZyb21TdHJpbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSkpO2NvbnN0IEU9ZmUuYWxsb2NhdGVVbnNhZmUoMTYpO3JldHVybiB5PTAsRVt5KytdPTI1NSZVLmxvdy5sb3csRVt5KytdPVUubG93Lmxvdz4+OCYyNTUsRVt5KytdPVUubG93Lmxvdz4+MTYmMjU1LEVbeSsrXT1VLmxvdy5sb3c+PjI0JjI1NSxFW3krK109MjU1JlUubG93LmhpZ2gsRVt5KytdPVUubG93LmhpZ2g+PjgmMjU1LEVbeSsrXT1VLmxvdy5oaWdoPj4xNiYyNTUsRVt5KytdPVUubG93LmhpZ2g+PjI0JjI1NSxFW3krK109MjU1JlUuaGlnaC5sb3csRVt5KytdPVUuaGlnaC5sb3c+PjgmMjU1LEVbeSsrXT1VLmhpZ2gubG93Pj4xNiYyNTUsRVt5KytdPVUuaGlnaC5sb3c+PjI0JjI1NSxFW3krK109MjU1JlUuaGlnaC5oaWdoLEVbeSsrXT1VLmhpZ2guaGlnaD4+OCYyNTUsRVt5KytdPVUuaGlnaC5oaWdoPj4xNiYyNTUsRVt5KytdPVUuaGlnaC5oaWdoPj4yNCYyNTUsbmV3IEhlKEUpfXRvU3RyaW5nKCl7bGV0IGUsdD0wO2NvbnN0IG49bmV3IEFycmF5KDM2KTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdPTA7bGV0IHIsaSxvLHM9MCxhPSExLGM9e3BhcnRzOlswLDAsMCwwXX07Y29uc3QgXz1bXTtzPTA7Y29uc3QgbD10aGlzLmJ5dGVzLHU9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsZj1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxnPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGg9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQ7cz0wOyh7bG93Om5ldyBSZSh1LGYpLGhpZ2g6bmV3IFJlKGcsaCl9KS5oaWdoLmxlc3NUaGFuKFJlLlpFUk8pJiZfLnB1c2goIi0iKTtjb25zdCBkPWg+PjI2JjMxO2lmKGQ+PjM9PTMpe2lmKDMwPT09ZClyZXR1cm4gXy5qb2luKCIiKSsiSW5maW5pdHkiO2lmKDMxPT09ZClyZXR1cm4iTmFOIjtlPWg+PjE1JjE2MzgzLHI9OCsoaD4+MTQmMSl9ZWxzZSByPWg+PjE0JjcsZT1oPj4xNyYxNjM4Mztjb25zdCBiPWUtNjE3NjtpZihjLnBhcnRzWzBdPSgxNjM4MyZoKSsoKDE1JnIpPDwxNCksYy5wYXJ0c1sxXT1nLGMucGFydHNbMl09ZixjLnBhcnRzWzNdPXUsMD09PWMucGFydHNbMF0mJjA9PT1jLnBhcnRzWzFdJiYwPT09Yy5wYXJ0c1syXSYmMD09PWMucGFydHNbM10pYT0hMDtlbHNlIGZvcihvPTM7bz49MDtvLS0pe2xldCBlPTA7Y29uc3QgdD1ZZShjKTtpZihjPXQucXVvdGllbnQsZT10LnJlbS5sb3csZSlmb3IoaT04O2k+PTA7aS0tKW5bOSpvK2ldPWUlMTAsZT1NYXRoLmZsb29yKGUvMTApfWlmKGEpdD0xLG5bc109MDtlbHNlIGZvcih0PTM2OyFuW3NdOyl0LT0xLHMrPTE7Y29uc3Qgdz10LTErYjtpZih3Pj0zNHx8dzw9LTd8fGI+MCl7aWYodD4zNClyZXR1cm4gXy5wdXNoKCIwIiksYj4wP18ucHVzaChgRSske2J9YCk6YjwwJiZfLnB1c2goYEUke2J9YCksXy5qb2luKCIiKTtfLnB1c2goYCR7bltzKytdfWApLHQtPTEsdCYmXy5wdXNoKCIuIik7Zm9yKGxldCBlPTA7ZTx0O2UrKylfLnB1c2goYCR7bltzKytdfWApO18ucHVzaCgiRSIpLHc+MD9fLnB1c2goYCske3d9YCk6Xy5wdXNoKGAke3d9YCl9ZWxzZSBpZihiPj0wKWZvcihsZXQgZT0wO2U8dDtlKyspXy5wdXNoKGAke25bcysrXX1gKTtlbHNle2xldCBlPXQrYjtpZihlPjApZm9yKGxldCB0PTA7dDxlO3QrKylfLnB1c2goYCR7bltzKytdfWApO2Vsc2UgXy5wdXNoKCIwIik7Zm9yKF8ucHVzaCgiLiIpO2UrKzwwOylfLnB1c2goIjAiKTtmb3IobGV0IHI9MDtyPHQtTWF0aC5tYXgoZS0xLDApO3IrKylfLnB1c2goYCR7bltzKytdfWApfXJldHVybiBfLmpvaW4oIiIpfXRvSlNPTigpe3JldHVybnskbnVtYmVyRGVjaW1hbDp0aGlzLnRvU3RyaW5nKCl9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIEhlLmZyb21TdHJpbmcoZS4kbnVtYmVyRGVjaW1hbCl9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYG5ldyBEZWNpbWFsMTI4KCR7bih0aGlzLnRvU3RyaW5nKCksdCl9KWB9fWNsYXNzIEtlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEb3VibGUifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1OdW1iZXIoZSk7aWYoIk5hTiI9PT1lKXJldHVybiBuZXcgS2UoTmFOKTtpZigiSW5maW5pdHkiPT09ZSlyZXR1cm4gbmV3IEtlKDEvMCk7aWYoIi1JbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoLTEvMCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSl0aHJvdyBuZXcgWihgSW5wdXQ6ICR7ZX0gaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSBEb3VibGVgKTtpZihlLnRyaW0oKSE9PWUpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgd2hpdGVzcGFjZWApO2lmKCIiPT09ZSl0aHJvdyBuZXcgWigiSW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nIik7aWYoL1teLTAtOS4rZUVdLy50ZXN0KGUpKXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBpbiBkZWNpbWFsIG9yIGV4cG9uZW50aWFsIG5vdGF0aW9uYCk7cmV0dXJuIG5ldyBLZSh0KX12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9KU09OKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9TdHJpbmcoZSl7cmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJihlLmxlZ2FjeXx8ZS5yZWxheGVkJiZpc0Zpbml0ZSh0aGlzLnZhbHVlKSk/dGhpcy52YWx1ZTpPYmplY3QuaXMoTWF0aC5zaWduKHRoaXMudmFsdWUpLC0wKT97JG51bWJlckRvdWJsZToiLTAuMCJ9OnskbnVtYmVyRG91YmxlOk51bWJlci5pc0ludGVnZXIodGhpcy52YWx1ZSk/dGhpcy52YWx1ZS50b0ZpeGVkKDEpOnRoaXMudmFsdWUudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdCBuPXBhcnNlRmxvYXQoZS4kbnVtYmVyRG91YmxlKTtyZXR1cm4gdCYmdC5yZWxheGVkP246bmV3IEtlKG4pfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IERvdWJsZSgke24odGhpcy52YWx1ZSx0KX0pYH19Y2xhc3MgWmUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkludDMyIn12YWx1ZTtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLGUgaW5zdGFuY2VvZiBOdW1iZXImJihlPWUudmFsdWVPZigpKSx0aGlzLnZhbHVlPTB8K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1PZShlKSxuPU51bWJlcihlKTtpZihtPG4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgZm9yIEludDMyYCk7aWYoUz5uKXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZighTnVtYmVyLmlzU2FmZUludGVnZXIobikpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7aWYobi50b1N0cmluZygpIT09dCl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSB2YWxpZCBJbnQzMiBzdHJpbmdgKTtyZXR1cm4gbmV3IFplKG4pfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUucmVsYXhlZHx8ZS5sZWdhY3kpP3RoaXMudmFsdWU6eyRudW1iZXJJbnQ6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe3JldHVybiB0JiZ0LnJlbGF4ZWQ/cGFyc2VJbnQoZS4kbnVtYmVySW50LDEwKTpuZXcgWmUoZS4kbnVtYmVySW50KX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PXcsYG5ldyBJbnQzMigke24odGhpcy52YWx1ZSx0KX0pYH19Y2xhc3MgR2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk1heEtleSJ9dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG1heEtleToxfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTigpe3JldHVybiBuZXcgR2V9aW5zcGVjdCgpe3JldHVybiJuZXcgTWF4S2V5KCkifX1jbGFzcyBYZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWluS2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWluS2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBYZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNaW5LZXkoKSJ9fWNvbnN0IFFlPW5ldyBXZWFrTWFwLGV0PVtdO2ZvcihsZXQgZT0wO2U8MjU2O2UrKylldC5wdXNoKGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSk7Y29uc3QgdHQ9bmV3IEludDhBcnJheSgxMDMpO2ZvcihsZXQgZT00ODtlPD01NztlKyspdHRbZV09ZS00ODtmb3IobGV0IGU9NjU7ZTw9NzA7ZSsrKXR0W2VdPWUtNTU7Zm9yKGxldCBlPTk3O2U8PTEwMjtlKyspdHRbZV09ZS04NztjbGFzcyBudCBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iT2JqZWN0SWQifXN0YXRpYyBpbmRleD0wO3N0YXRpYyBQUk9DRVNTX1VOSVFVRT1udWxsO3N0YXRpYyByZXNldFN0YXRlPSgpPT57dGhpcy5pbmRleD1NYXRoLmZsb29yKDE2Nzc3MjE2Kk1hdGgucmFuZG9tKCkpLHRoaXMuUFJPQ0VTU19VTklRVUU9bnVsbH07c3RhdGlje3RoaXMucmVzZXRTdGF0ZSgpO2NvbnN0e3N0YXJ0dXBTbmFwc2hvdDplfT1nbG9iYWxUaGlzPy5wcm9jZXNzPy5nZXRCdWlsdGluTW9kdWxlPy4oInY4Iik/P3t9O2U/LmlzQnVpbGRpbmdTbmFwc2hvdD8uKCkmJmU/LmFkZERlc2VyaWFsaXplQ2FsbGJhY2s/Lih0aGlzLnJlc2V0U3RhdGUpfXN0YXRpYyBjYWNoZUhleFN0cmluZztpMDtpMTtpMjtpMztzZXRGcm9tQnl0ZXMoZSx0PTApe3RoaXMuaTA9ZVt0XTw8MTZ8ZVt0KzFdPDw4fGVbdCsyXSx0aGlzLmkxPWVbdCszXTw8MTZ8ZVt0KzRdPDw4fGVbdCs1XSx0aGlzLmkyPWVbdCs2XTw8MTZ8ZVt0KzddPDw4fGVbdCs4XSx0aGlzLmkzPWVbdCs5XTw8MTZ8ZVt0KzEwXTw8OHxlW3QrMTFdfXNldEZyb21IZXgoZSl7Y29uc3QgdD10dDt0aGlzLmkwPXRbZS5jaGFyQ29kZUF0KDApXTw8MjB8dFtlLmNoYXJDb2RlQXQoMSldPDwxNnx0W2UuY2hhckNvZGVBdCgyKV08PDEyfHRbZS5jaGFyQ29kZUF0KDMpXTw8OHx0W2UuY2hhckNvZGVBdCg0KV08PDR8dFtlLmNoYXJDb2RlQXQoNSldLHRoaXMuaTE9dFtlLmNoYXJDb2RlQXQoNildPDwyMHx0W2UuY2hhckNvZGVBdCg3KV08PDE2fHRbZS5jaGFyQ29kZUF0KDgpXTw8MTJ8dFtlLmNoYXJDb2RlQXQoOSldPDw4fHRbZS5jaGFyQ29kZUF0KDEwKV08PDR8dFtlLmNoYXJDb2RlQXQoMTEpXSx0aGlzLmkyPXRbZS5jaGFyQ29kZUF0KDEyKV08PDIwfHRbZS5jaGFyQ29kZUF0KDEzKV08PDE2fHRbZS5jaGFyQ29kZUF0KDE0KV08PDEyfHRbZS5jaGFyQ29kZUF0KDE1KV08PDh8dFtlLmNoYXJDb2RlQXQoMTYpXTw8NHx0W2UuY2hhckNvZGVBdCgxNyldLHRoaXMuaTM9dFtlLmNoYXJDb2RlQXQoMTgpXTw8MjB8dFtlLmNoYXJDb2RlQXQoMTkpXTw8MTZ8dFtlLmNoYXJDb2RlQXQoMjApXTw8MTJ8dFtlLmNoYXJDb2RlQXQoMjEpXTw8OHx0W2UuY2hhckNvZGVBdCgyMildPDw0fHRbZS5jaGFyQ29kZUF0KDIzKV19Y29uc3RydWN0b3IoZSx0KXtpZihzdXBlcigpLCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdm9pZCB0aGlzLnNldEZyb21CeXRlcyhlLHQpO2xldCBuO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZSYmImlkImluIGUpe2lmKG50LmlzKGUpJiYibnVtYmVyIj09dHlwZW9mIGUuaTAmJiJudW1iZXIiPT10eXBlb2YgZS5pMSYmIm51bWJlciI9PXR5cGVvZiBlLmkyJiYibnVtYmVyIj09dHlwZW9mIGUuaTMpcmV0dXJuIHRoaXMuaTA9ZS5pMCx0aGlzLmkxPWUuaTEsdGhpcy5pMj1lLmkyLHZvaWQodGhpcy5pMz1lLmkzKTtpZigic3RyaW5nIiE9dHlwZW9mIGUuaWQmJiFBcnJheUJ1ZmZlci5pc1ZpZXcoZS5pZCkpdGhyb3cgbmV3IFooIkFyZ3VtZW50IHBhc3NlZCBpbiBtdXN0IGhhdmUgYW4gaWQgdGhhdCBpcyBvZiB0eXBlIHN0cmluZyBvciBCdWZmZXIiKTtuPSJ0b0hleFN0cmluZyJpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b0hleFN0cmluZz9mZS5mcm9tSGV4KGUudG9IZXhTdHJpbmcoKSk6ZS5pZH1lbHNlIG49ZTtpZihudWxsPT1uKXtjb25zdCBlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpLHQ9bnQuZ2V0SW5jKCksbj1udC5QUk9DRVNTX1VOSVFVRT8/PWZlLnJhbmRvbUJ5dGVzKDUpO3RoaXMuaTA9ZT4+PjgmMTY3NzcyMTUsdGhpcy5pMT0oMjU1JmUpPDwxNnxuWzBdPDw4fG5bMV0sdGhpcy5pMj1uWzJdPDwxNnxuWzNdPDw4fG5bNF0sdGhpcy5pMz0xNjc3NzIxNSZ0fWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KG4pJiYxMj09PW4uYnl0ZUxlbmd0aCl0aGlzLnNldEZyb21CeXRlcyhuIGluc3RhbmNlb2YgVWludDhBcnJheT9uOmZlLnRvTG9jYWxCdWZmZXJUeXBlKG4pKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCFudC52YWxpZGF0ZUhleFN0cmluZyhuKSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLnNldEZyb21IZXgobiksbnQuY2FjaGVIZXhTdHJpbmcmJlFlLnNldCh0aGlzLG4pfX1nZXQgaWQoKXtjb25zdCBlPWZlLmFsbG9jYXRlVW5zYWZlKDEyKTtyZXR1cm4gZVswXT10aGlzLmkwPj4+MTYmMjU1LGVbMV09dGhpcy5pMD4+PjgmMjU1LGVbMl09MjU1JnRoaXMuaTAsZVszXT10aGlzLmkxPj4+MTYmMjU1LGVbNF09dGhpcy5pMT4+PjgmMjU1LGVbNV09MjU1JnRoaXMuaTEsZVs2XT10aGlzLmkyPj4+MTYmMjU1LGVbN109dGhpcy5pMj4+PjgmMjU1LGVbOF09MjU1JnRoaXMuaTIsZVs5XT10aGlzLmkzPj4+MTYmMjU1LGVbMTBdPXRoaXMuaTM+Pj44JjI1NSxlWzExXT0yNTUmdGhpcy5pMyxlfXNldCBpZChlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7dGhpcy5zZXRGcm9tQnl0ZXModCksbnQuY2FjaGVIZXhTdHJpbmcmJlFlLnNldCh0aGlzLGZlLnRvSGV4KHQpKX1zdGF0aWMgdmFsaWRhdGVIZXhTdHJpbmcoZSl7aWYoMjQhPT1lPy5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCB0PTA7dDwyNDt0Kyspe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHQpO2lmKCEobj49NDgmJm48PTU3fHxuPj05NyYmbjw9MTAyfHxuPj02NSYmbjw9NzApKXJldHVybiExfXJldHVybiEwfXRvSGV4U3RyaW5nKCl7aWYobnQuY2FjaGVIZXhTdHJpbmcpe2NvbnN0IGU9UWUuZ2V0KHRoaXMpO2lmKGUpcmV0dXJuIGV9Y29uc3QgZT10aGlzLmkwLHQ9dGhpcy5pMSxuPXRoaXMuaTIscj10aGlzLmkzLGk9ZXRbZT4+PjE2JjI1NV0rZXRbZT4+PjgmMjU1XStldFsyNTUmZV0rZXRbdD4+PjE2JjI1NV0rZXRbdD4+PjgmMjU1XStldFsyNTUmdF0rZXRbbj4+PjE2JjI1NV0rZXRbbj4+PjgmMjU1XStldFsyNTUmbl0rZXRbcj4+PjE2JjI1NV0rZXRbcj4+PjgmMjU1XStldFsyNTUmcl07cmV0dXJuIG50LmNhY2hlSGV4U3RyaW5nJiZRZS5zZXQodGhpcyxpKSxpfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gbnQuaW5kZXg9KG50LmluZGV4KzEpJTE2Nzc3MjE2fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PW50LmdldEluYygpLG49ZmUuYWxsb2NhdGVVbnNhZmUoMTIpO3BlLnNldEludDMyQkUobiwwLGUpO2NvbnN0IHI9dGhpcy5QUk9DRVNTX1VOSVFVRT8/PWZlLnJhbmRvbUJ5dGVzKDUpO3JldHVybiBuWzRdPXJbMF0sbls1XT1yWzFdLG5bNl09clsyXSxuWzddPXJbM10sbls4XT1yWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+Pj44JjI1NSxuWzldPXQ+Pj4xNiYyNTUsbn10b1N0cmluZyhlKXtyZXR1cm4iYmFzZTY0Ij09PWU/ZmUudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9c3RhdGljIGlzKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJfYnNvbnR5cGUiaW4gZSYmIk9iamVjdElkIj09PWUuX2Jzb250eXBlfWVxdWFscyhlKXtpZihudWxsPT1lKXJldHVybiExO2lmKG50LmlzKGUpJiYibnVtYmVyIj09dHlwZW9mIGUuaTAmJiJudW1iZXIiPT10eXBlb2YgZS5pMSYmIm51bWJlciI9PXR5cGVvZiBlLmkyJiYibnVtYmVyIj09dHlwZW9mIGUuaTMpcmV0dXJuIHRoaXMuaTM9PT1lLmkzJiZ0aGlzLmkwPT09ZS5pMCYmdGhpcy5pMT09PWUuaTEmJnRoaXMuaTI9PT1lLmkyO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9MjU2KnRoaXMuaTArKHRoaXMuaTE+Pj4xNik7cmV0dXJuIGUuc2V0VGltZSgxZTMqdCksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IG50fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmkwPj4+MTYmMjU1LGVbdCsxXT10aGlzLmkwPj4+OCYyNTUsZVt0KzJdPTI1NSZ0aGlzLmkwLGVbdCszXT10aGlzLmkxPj4+MTYmMjU1LGVbdCs0XT10aGlzLmkxPj4+OCYyNTUsZVt0KzVdPTI1NSZ0aGlzLmkxLGVbdCs2XT10aGlzLmkyPj4+MTYmMjU1LGVbdCs3XT10aGlzLmkyPj4+OCYyNTUsZVt0KzhdPTI1NSZ0aGlzLmkyLGVbdCs5XT10aGlzLmkzPj4+MTYmMjU1LGVbdCsxMF09dGhpcy5pMz4+PjgmMjU1LGVbdCsxMV09MjU1JnRoaXMuaTMsMTJ9c3RhdGljIGNyZWF0ZUZyb21UaW1lKGUpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUoMTIpO2ZvcihsZXQgZT0xMTtlPj00O2UtLSl0W2VdPTA7cmV0dXJuIHBlLnNldEludDMyQkUodCwwLGUpLG5ldyBudCh0KX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtpZigyNCE9PWU/Lmxlbmd0aCl0aHJvdyBuZXcgWigiaGV4IHN0cmluZyBtdXN0IGJlIDI0IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IG50KGZlLmZyb21IZXgoZSkpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe2lmKDE2IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJiYXNlNjQgc3RyaW5nIG11c3QgYmUgMTYgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgbnQoZmUuZnJvbUJhc2U2NChlKSl9c3RhdGljIGlzVmFsaWQoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIG50LnZhbGlkYXRlSGV4U3RyaW5nKGUpO3RyeXtyZXR1cm4gbmV3IG50KGUpLCEwfWNhdGNoe3JldHVybiExfX10b0V4dGVuZGVkSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nP3skb2lkOnRoaXMudG9IZXhTdHJpbmcoKX06eyRvaWQ6dGhpcy50b1N0cmluZygiaGV4Iil9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe3JldHVybiBuZXcgbnQoZS4kb2lkKX1pc0NhY2hlZCgpe3JldHVybiBudC5jYWNoZUhleFN0cmluZyYmUWUuaGFzKHRoaXMpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IE9iamVjdElkKCR7bih0aGlzLnRvSGV4U3RyaW5nKCksdCl9KWB9fWZ1bmN0aW9uIHJ0KGUsdCxuPSExLHI9ITEsaT0hMSxvLHMpe3N3aXRjaCgiZnVuY3Rpb24iPT10eXBlb2YgdD8udG9CU09OJiYodD10LnRvQlNPTigpKSx0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOnJldHVybiAxK2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErNCtmZS51dGY4Qnl0ZUxlbmd0aCh0KSsxO2Nhc2UibnVtYmVyIjpyZXR1cm4gTWF0aC5mbG9vcih0KT09PXQmJnQ+PUUmJnQ8PVUmJnQ+PVMmJnQ8PW0/ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSs1OmZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErOTtjYXNlInVuZGVmaW5lZCI6cmV0dXJuIHJ8fCFpP2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMTowO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxO2lmKCJPYmplY3RJZCI9PT10Ll9ic29udHlwZSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxMztpZih0IGluc3RhbmNlb2YgRGF0ZXx8Yih0KSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzYrdC5ieXRlTGVuZ3RoO2lmKCJMb25nIj09PXQuX2Jzb250eXBlfHwiRG91YmxlIj09PXQuX2Jzb250eXBlfHwiVGltZXN0YW1wIj09PXQuX2Jzb250eXBlKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzk7aWYoIkRlY2ltYWwxMjgiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMTc7aWYoIkludDMyIj09PXQuX2Jzb250eXBlKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzU7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpe2lmKG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wKXtpZihzLmhhcyh0LnNjb3BlKSl0aHJvdyBuZXcgWigiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTtyZXR1cm4gby5wdXNoKHtvYmplY3Q6dC5zY29wZSxpZ25vcmVVbmRlZmluZWQ6aSxleGl0OiExfSksZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrNCtmZS51dGY4Qnl0ZUxlbmd0aCh0LmNvZGUudG9TdHJpbmcoKSkrMX1yZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrZmUudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzF9aWYoIkJpbmFyeSI9PT10Ll9ic29udHlwZSl7Y29uc3Qgbj10O3JldHVybiBuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZP2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErKG4ucG9zaXRpb24rMSs0KzErNCk6ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsobi5wb3NpdGlvbisxKzQrMSl9aWYoIkJTT05TeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErZmUudXRmOEJ5dGVMZW5ndGgodC52YWx1ZSkrNCsxKzE7aWYoIkRCUmVmIj09PXQuX2Jzb250eXBlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oeyRyZWY6dC5jb2xsZWN0aW9uLCRpZDp0Lm9pZH0sdC5maWVsZHMpO3JldHVybiBudWxsIT10LmRiJiYobi4kZGI9dC5kYiksby5wdXNoKHtvYmplY3Q6bixpZ25vcmVVbmRlZmluZWQ6ITAsZXhpdDohMX0pLGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMX1pZih0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzErZmUudXRmOEJ5dGVMZW5ndGgodC5zb3VyY2UpKzErKHQuZ2xvYmFsPzE6MCkrKHQuaWdub3JlQ2FzZT8xOjApKyh0Lm11bHRpbGluZT8xOjApKzE7aWYoIkJTT05SZWdFeHAiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMStmZS51dGY4Qnl0ZUxlbmd0aCh0LnBhdHRlcm4pKzErZmUudXRmOEJ5dGVMZW5ndGgodC5vcHRpb25zKSsxO2lmKHMuaGFzKHQpKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO3JldHVybiBvLnB1c2goe29iamVjdDp0LGlnbm9yZVVuZGVmaW5lZDppLGV4aXQ6ITF9KSxmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzE7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIG4/ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrZmUudXRmOEJ5dGVMZW5ndGgodC50b1N0cmluZygpKSsxOjA7Y2FzZSJiaWdpbnQiOnJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PVJlO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPVJlLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihSZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChSZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KFJlLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoUmUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9UmUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPVJlLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9UmUuZnJvbU51bWJlcihVKSxfdD1SZS5mcm9tTnVtYmVyKEUpO2Z1bmN0aW9uIGx0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBmdW5jdGlvbihlLHQsbixyPSExKXtuPXsuLi5ufTtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxfPW4ucHJvbW90ZVZhbHVlcz8/ITAsbD1uLnVzZUJpZ0ludDY0Pz8hMTtpZihsJiYhXyl0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2NvbnN0IHU9bnVsbD09bi52YWxpZGF0aW9uP3t1dGY4OiEwfTpuLnZhbGlkYXRpb247bGV0IGYsZyxoPSEwO2NvbnN0IGQ9dS51dGY4O2lmKCJib29sZWFuIj09dHlwZW9mIGQpZj1kO2Vsc2V7aD0hMTtjb25zdCBlPU9iamVjdC5rZXlzKGQpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGRbZV19KSk7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJVVEYtOCB2YWxpZGF0aW9uIHNldHRpbmcgY2Fubm90IGJlIGVtcHR5Iik7aWYoImJvb2xlYW4iIT10eXBlb2YgZVswXSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiwgbXVzdCBzcGVjaWZ5IGJvb2xlYW4gdmFsdWVzIik7aWYoZj1lWzBdLCFlLmV2ZXJ5KChlPT5lPT09ZikpKXRocm93IG5ldyBaKCJJbnZhbGlkIFVURi04IHZhbGlkYXRpb24gb3B0aW9uIC0ga2V5cyBtdXN0IGJlIGFsbCB0cnVlIG9yIGFsbCBmYWxzZSIpfWlmKCFoKXtnPW5ldyBTZXQ7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMoZCkpZy5hZGQoZSl9Y29uc3QgYj10O2lmKGUubGVuZ3RoPDUpdGhyb3cgbmV3IFooImNvcnJ1cHQgYnNvbiBtZXNzYWdlIDwgNSBieXRlcyBsb25nIik7Y29uc3Qgdz1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCx3PDV8fHc+ZS5sZW5ndGgpdGhyb3cgbmV3IFooImNvcnJ1cHQgYnNvbiBtZXNzYWdlIik7Y29uc3QgcD1yP1tdOnt9O2xldCB5PTAsbT0hciYmbnVsbCxTPW51bGwseD1wLEI9cjtmb3IoOzspe2NvbnN0IG49ZVt0KytdO2lmKDA9PT1uKXtpZihTKXtpZih0PT09Uy5sYXN0SW5kZXgpe2NvbnN0IGU9UztTPWUucHJldixudWxsPT09Uz8oeD1wLEI9cik6KHg9Uy5ob2xkaW5nRG9jdW1lbnQsQj1TLmlzQXJyYXkpO2xldCB0PWUuaG9sZGluZ0RvY3VtZW50O3N3aXRjaChlLmVsZW1lbnRUeXBlKXtjYXNlIE46ZS5pc1Bvc3NpYmxlREJSZWYmJih0PWd0KHQpKTticmVhaztjYXNlIHY6YnJlYWs7Y2FzZSBEOnQ9bmV3IFVlKGUuZnVuY3Rpb25TdHJpbmcsZS5ob2xkaW5nRG9jdW1lbnQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVuZXhwZWN0ZWQgZWxlbWVudCB0eXBlIGluIGZyYW1lIHN0YWNrIil9ZnQoeCxlLnByb3BlcnR5TmFtZSx0KTtjb250aW51ZX1pZihTLmVsZW1lbnRUeXBlPT09dil0aHJvdyBuZXcgWigiY29ycnVwdGVkIGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IG9iamVjdCBub3QgcHJvcGVybHkgdGVybWluYXRlZCIpfWJyZWFrfWxldCB1PXQ7Zm9yKDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IGQ9Qj9udWxsIT09Uz9TLmFycmF5SW5kZXgrKzp5Kys6ZmUudG9VVEY4KGUsdCx1LCExKTtsZXQgYix3O2I9bnVsbCE9PVM/Uy52YWxpZGF0aW9uU2V0dGluZzpofHxnPy5oYXMoZCk/ZjohZixudWxsIT09Uz8hMSE9PVMuaXNQb3NzaWJsZURCUmVmJiYic3RyaW5nIj09dHlwZW9mIGQmJiIkIj09PWRbMF0mJihTLmlzUG9zc2libGVEQlJlZj11dC50ZXN0KGQpKTohMSE9PW0mJiIkIj09PWRbMF0mJihtPXV0LnRlc3QoZCkpO2xldCBVPSExO2lmKHQ9dSsxLG49PT1PKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7dz1mZS50b1VURjgoZSx0LHQrbi0xLGIpLHQrPW59ZWxzZSBpZihuPT09TCl3PW5ldyBudChlLHQpLHQrPTEyO2Vsc2UgaWYobj09PVYmJiExPT09Xyl3PW5ldyBaZShwZS5nZXRJbnQzMkxFKGUsdCkpLHQrPTQ7ZWxzZSBpZihuPT09Vil3PXBlLmdldEludDMyTEUoZSx0KSx0Kz00O2Vsc2UgaWYobj09PUkpdz1wZS5nZXRGbG9hdDY0TEUoZSx0KSx0Kz04LCExPT09XyYmKHc9bmV3IEtlKHcpKTtlbHNlIGlmKG49PT1qKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KSxyPXBlLmdldEludDMyTEUoZSx0KzQpO3QrPTgsdz1uZXcgRGF0ZShuZXcgUmUobixyKS50b051bWJlcigpKX1lbHNlIGlmKG49PT1BKXtpZigwIT09ZVt0XSYmMSE9PWVbdF0pdGhyb3cgbmV3IFooImlsbGVnYWwgYm9vbGVhbiB0eXBlIHZhbHVlIik7dz0xPT09ZVt0KytdfWVsc2UgaWYobj09PU4pe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKG48NXx8bj5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvfHxTPy5yYXcpdz1lLnN1YmFycmF5KHQsdCtuKSx0Kz1uO2Vsc2V7VT0hMDtjb25zdCBlPXtob2xkaW5nRG9jdW1lbnQ6e30sZWxlbWVudFR5cGU6Tixwcm9wZXJ0eU5hbWU6ZCxmdW5jdGlvblN0cmluZzpudWxsLGxhc3RJbmRleDp0K24saXNBcnJheTohMSxhcnJheUluZGV4OjAscmF3OiExLGlzUG9zc2libGVEQlJlZjpudWxsLHZhbGlkYXRpb25TZXR0aW5nOmIscHJldjpTfTtTPWUseD1lLmhvbGRpbmdEb2N1bWVudCxCPSExLHQrPTR9fWVsc2UgaWYobj09PXYpe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKG48NXx8bj5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgYXJyYXkgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXQrbixvPSEoIWl8fCFpW2RdKXx8KFM/LnJhdz8/ITEpO1U9ITA7Y29uc3Qgcz17aG9sZGluZ0RvY3VtZW50OltdLGVsZW1lbnRUeXBlOnYscHJvcGVydHlOYW1lOmQsZnVuY3Rpb25TdHJpbmc6bnVsbCxsYXN0SW5kZXg6cixpc0FycmF5OiEwLGFycmF5SW5kZXg6MCxyYXc6byxpc1Bvc3NpYmxlREJSZWY6ITEsdmFsaWRhdGlvblNldHRpbmc6YixwcmV2OlN9O1M9cyx4PXMuaG9sZGluZ0RvY3VtZW50LEI9ITAsdCs9NH1lbHNlIGlmKG49PT0kKXc9dm9pZCAwO2Vsc2UgaWYobj09PVIpdz1udWxsO2Vsc2UgaWYobj09PVApaWYobCl3PXBlLmdldEJpZ0ludDY0TEUoZSx0KSx0Kz04O2Vsc2V7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04O2NvbnN0IGk9bmV3IFJlKG4scik7dz1jJiYhMD09PV8mJmkubGVzc1RoYW5PckVxdWFsKGN0KSYmaS5ncmVhdGVyVGhhbk9yRXF1YWwoX3QpP2kudG9OdW1iZXIoKTppfWVsc2UgaWYobj09PUope2NvbnN0IG49ZmUuYWxsb2NhdGVVbnNhZmUoMTYpO2ZvcihsZXQgcj0wO3I8MTY7cisrKW5bcl09ZVt0K3JdO3QrPTE2LHc9bmV3IEhlKG4pfWVsc2UgaWYobj09PVQpe2xldCBuPXBlLmdldEludDMyTEUoZSx0KTt0Kz00O2NvbnN0IHI9bixpPWVbdCsrXTtpZihuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCIpO2lmKG4+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJCaW5hcnkgdHlwZSBzaXplIGxhcmdlciB0aGFuIGRvY3VtZW50IHNpemUiKTtpZihpPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZKXtpZihuPXBlLmdldEludDMyTEUoZSx0KSx0Kz00LG48MCl0aHJvdyBuZXcgWigiTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kIGZvciBzdWJ0eXBlIDB4MDIiKTtpZihuPnItNCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIGxvbmcgYmluYXJ5IHNpemUiKTtpZihuPHItNCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIHNob3J0IGJpbmFyeSBzaXplIil9YSYmXz93PWZlLnRvTG9jYWxCdWZmZXJUeXBlKGUuc3ViYXJyYXkodCx0K24pKToodz1uZXcgeWUoZS5zdWJhcnJheSh0LHQrbiksaSksaT09PUgmJkJlLmlzVmFsaWQodykmJih3PXcudG9VVUlEKCkpKSx0Kz1ufWVsc2UgaWYobj09PUYmJiExPT09cyl7Zm9yKHU9dDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj1mZS50b1VURjgoZSx0LHUsITEpO2Zvcih1PXQ9dSsxOzAhPT1lW3VdJiZ1PGUubGVuZ3RoOyl1Kys7aWYodT49ZS5sZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdSwhMSk7dD11KzE7Y29uc3QgaT1uZXcgQXJyYXkoci5sZW5ndGgpO2Zvcih1PTA7dTxyLmxlbmd0aDt1Kyspc3dpdGNoKHJbdV0pe2Nhc2UibSI6aVt1XT0ibSI7YnJlYWs7Y2FzZSJzIjppW3VdPSJnIjticmVhaztjYXNlImkiOmlbdV09ImkifXc9bmV3IFJlZ0V4cChuLGkuam9pbigiIikpfWVsc2UgaWYobj09PUYmJiEwPT09cyl7Zm9yKHU9dDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj1mZS50b1VURjgoZSx0LHUsITEpO2Zvcih1PXQ9dSsxOzAhPT1lW3VdJiZ1PGUubGVuZ3RoOyl1Kys7aWYodT49ZS5sZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdSwhMSk7dD11KzEsdz1uZXcgaXQobixyKX1lbHNlIGlmKG49PT1DKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1mZS50b1VURjgoZSx0LHQrbi0xLGIpO3c9Xz9yOm5ldyBvdChyKSx0Kz1ufWVsc2UgaWYobj09PU0pdz1uZXcgYXQoe2k6cGUuZ2V0VWludDMyTEUoZSx0KSx0OnBlLmdldFVpbnQzMkxFKGUsdCs0KX0pLHQrPTg7ZWxzZSBpZihuPT09Vyl3PW5ldyBYZTtlbHNlIGlmKG49PT1ZKXc9bmV3IEdlO2Vsc2UgaWYobj09PXope2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdCtuLTEsYik7dz1uZXcgVWUociksdCs9bn1lbHNlIGlmKG49PT1EKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48MTMpdGhyb3cgbmV3IFooImNvZGVfd19zY29wZSB0b3RhbCBzaXplIHNob3J0ZXIgbWluaW11bSBleHBlY3RlZCBsZW5ndGgiKTtjb25zdCByPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LHI8PTB8fHI+ZS5sZW5ndGgtdHx8MCE9PWVbdCtyLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3QgaT1mZS50b1VURjgoZSx0LHQrci0xLGIpLG89dCs9cixzPXBlLmdldEludDMyTEUoZSx0KTtpZihzPDV8fHM+ZS5sZW5ndGgtdCl0aHJvdyBuZXcgWigiYmFkIHNjb3BlIGRvY3VtZW50IHNpemUgaW4gY29kZV93X3Njb3BlIik7aWYobjw4K3Mrcil0aHJvdyBuZXcgWigiY29kZV93X3Njb3BlIHRvdGFsIHNpemUgaXMgdG9vIHNob3J0LCB0cnVuY2F0aW5nIHNjb3BlIik7aWYobj44K3Mrcil0aHJvdyBuZXcgWigiY29kZV93X3Njb3BlIHRvdGFsIHNpemUgaXMgdG9vIGxvbmcsIGNsaXBzIG91dGVyIGRvY3VtZW50Iik7VT0hMDtjb25zdCBhPXtob2xkaW5nRG9jdW1lbnQ6e30sZWxlbWVudFR5cGU6RCxwcm9wZXJ0eU5hbWU6ZCxmdW5jdGlvblN0cmluZzppLGxhc3RJbmRleDpvK3MsaXNBcnJheTohMSxhcnJheUluZGV4OjAscmF3OiExLGlzUG9zc2libGVEQlJlZjpudWxsLHZhbGlkYXRpb25TZXR0aW5nOmIscHJldjpTfTtTPWEseD1hLmhvbGRpbmdEb2N1bWVudCxCPSExLHQrPTR9ZWxzZXtpZihuIT09ayl0aHJvdyBuZXcgWihgRGV0ZWN0ZWQgdW5rbm93biBCU09OIHR5cGUgJHtuLnRvU3RyaW5nKDE2KX0gZm9yIGZpZWxkbmFtZSAiJHtkfSJgKTt7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9ZmUudG9VVEY4KGUsdCx0K24tMSxiKTt0Kz1uO2NvbnN0IGk9ZmUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgbj0wO248MTI7bisrKWlbbl09ZVt0K25dO2NvbnN0IG89bmV3IG50KGkpO3QrPTEyLHc9bmV3IEllKHIsbyl9fVV8fGZ0KHgsZCx3KX1pZihudWxsIT09Uyl0aHJvdyBuZXcgWigiY29ycnVwdGVkIGJzb24sIG1vcmUgb2JqZWN0cyBleHBlY3RlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudCBzaXplIik7Y29uc3QgVT1wO2lmKHchPT10LWIpe2lmKHIpdGhyb3cgbmV3IFooImNvcnJ1cHQgYXJyYXkgYnNvbiIpO3Rocm93IG5ldyBaKCJjb3JydXB0IG9iamVjdCBic29uIil9cmV0dXJuIG0/Z3QoVSk6VX0oZSxyLHQsbil9Y29uc3QgdXQ9L15cJHJlZiR8XlwkaWQkfF5cJGRiJC87ZnVuY3Rpb24gZnQoZSx0LG4peyJfX3Byb3RvX18iPT09dD9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6ZVt0XT1ufWZ1bmN0aW9uIGd0KGUpe2lmKEVlKGUpKXtjb25zdHskcmVmOnQsJGlkOm4sJGRiOnIsLi4uaX09ZTtyZXR1cm4gbmV3IEllKHQsbixyLGkpfXJldHVybiBlfWNvbnN0IGh0PS9ceDAwLyxkdD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109TztlWyhyPXIrZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1mZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gd3QoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9WOkk7ZVtyKytdPWk7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09Vj9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHB0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24geXQoZSx0LG4scil7ZVtyKytdPVI7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIG10KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPWo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9UmUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24geHQoZSx0LG4scil7ZVtyKytdPUY7aWYocis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChodCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9ZmUuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGh0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPWZlLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1SOiJNaW5LZXkiPT09bltnZV0/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gSXQoZSx0LG4scil7ZVtyKytdPVQ7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scil7ZVtyKytdPUo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIE50KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uW2dlXT9QOk07cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPVY7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109STtyZXR1cm4gcis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89ZmUuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scil7ZVtyKytdPVQ7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPUM7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9ZmUuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8pe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJue3NvdXJjZU9iamVjdDplLGlzQXJyYXk6ITAsb2JqZWN0U2l6ZUluZGV4OnQsY29kZVNpemVJbmRleDpuLGl0ZXJUYXJnZXQ6ZSxrZXlzOm51bGwsa2V5SW5kZXg6MCxtYXBJdGVyYXRvcjpudWxsLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b307aWYoZSBpbnN0YW5jZW9mIE1hcHx8ZChlKSlyZXR1cm57c291cmNlT2JqZWN0OmUsaXNBcnJheTohMSxvYmplY3RTaXplSW5kZXg6dCxjb2RlU2l6ZUluZGV4Om4saXRlclRhcmdldDplLGtleXM6bnVsbCxrZXlJbmRleDowLG1hcEl0ZXJhdG9yOmUuZW50cmllcygpLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b307bGV0IHM9ZTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcz8udG9CU09OJiYocz1zLnRvQlNPTigpLG51bGwhPXMmJiJvYmplY3QiIT10eXBlb2YgcykpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtyZXR1cm57c291cmNlT2JqZWN0OmUsaXNBcnJheTohMSxvYmplY3RTaXplSW5kZXg6dCxjb2RlU2l6ZUluZGV4Om4saXRlclRhcmdldDpzLGtleXM6T2JqZWN0LmtleXMocyksa2V5SW5kZXg6MCxtYXBJdGVyYXRvcjpudWxsLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b319ZnVuY3Rpb24gUnQoZSx0LG4scixpLG8scyl7aWYobnVsbD09cyl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihiKHQpfHxoKHQpfHxmKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTtzPW5ldyBTZXR9cy5hZGQodCk7bGV0IGE9anQodCxyLG51bGwsbnVsbCxuLG8pLGM9cis0O2Zvcig7bnVsbCE9PWE7KXtjb25zdCB0PWE7bGV0IG4scjtpZihudWxsIT09dC5tYXBJdGVyYXRvcil7Y29uc3QgaT10Lm1hcEl0ZXJhdG9yLm5leHQoKTtpZihpLmRvbmUpe2VbYysrXT0wLHBlLnNldEludDMyTEUoZSx0Lm9iamVjdFNpemVJbmRleCxjLXQub2JqZWN0U2l6ZUluZGV4KSxudWxsIT09dC5jb2RlU2l6ZUluZGV4JiZwZS5zZXRJbnQzMkxFKGUsdC5jb2RlU2l6ZUluZGV4LGMtdC5jb2RlU2l6ZUluZGV4KSxzLmRlbGV0ZSh0LnNvdXJjZU9iamVjdCksYT10LnByZXY7Y29udGludWV9bj1pLnZhbHVlWzBdLHI9aS52YWx1ZVsxXX1lbHNlIGlmKG51bGwhPT10LmtleXMpe2lmKHQua2V5SW5kZXg+PXQua2V5cy5sZW5ndGgpe2VbYysrXT0wLHBlLnNldEludDMyTEUoZSx0Lm9iamVjdFNpemVJbmRleCxjLXQub2JqZWN0U2l6ZUluZGV4KSxudWxsIT09dC5jb2RlU2l6ZUluZGV4JiZwZS5zZXRJbnQzMkxFKGUsdC5jb2RlU2l6ZUluZGV4LGMtdC5jb2RlU2l6ZUluZGV4KSxzLmRlbGV0ZSh0LnNvdXJjZU9iamVjdCksYT10LnByZXY7Y29udGludWV9bj10LmtleXNbdC5rZXlJbmRleCsrXSxyPXQuaXRlclRhcmdldFtuXX1lbHNle2NvbnN0IGk9dC5pdGVyVGFyZ2V0O2lmKHQua2V5SW5kZXg+PWkubGVuZ3RoKXtlW2MrK109MCxwZS5zZXRJbnQzMkxFKGUsdC5vYmplY3RTaXplSW5kZXgsYy10Lm9iamVjdFNpemVJbmRleCksbnVsbCE9PXQuY29kZVNpemVJbmRleCYmcGUuc2V0SW50MzJMRShlLHQuY29kZVNpemVJbmRleCxjLXQuY29kZVNpemVJbmRleCkscy5kZWxldGUodC5zb3VyY2VPYmplY3QpLGE9dC5wcmV2O2NvbnRpbnVlfWNvbnN0IG89dC5rZXlJbmRleCsrO249U3RyaW5nKG8pLHI9aVtvXX1pZigiZnVuY3Rpb24iPT10eXBlb2Ygcj8udG9CU09OJiYocj1yLnRvQlNPTigpKSwhKHQuaXNBcnJheXx8InN0cmluZyIhPXR5cGVvZiBufHwiJCI9PT1uWzBdJiZkdC5oYXMobikpKXtpZihodC50ZXN0KG4pKXRocm93IG5ldyBaKCJrZXkgIituKyIgbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIik7aWYodC5jaGVja0tleXMpe2lmKCIkIj09PW5bMF0pdGhyb3cgbmV3IFooImtleSAiK24rIiBtdXN0IG5vdCBzdGFydCB3aXRoICckJyIpO2lmKG4uaW5jbHVkZXMoIi4iKSl0aHJvdyBuZXcgWigia2V5ICIrbisiIG11c3Qgbm90IGNvbnRhaW4gJy4nIil9fWNvbnN0IG89dHlwZW9mIHI7aWYodm9pZCAwPT09cikodC5pc0FycmF5fHwhMT09PXQuaWdub3JlVW5kZWZpbmVkKSYmKGM9eXQoZSxuLDAsYykpO2Vsc2UgaWYobnVsbD09PXIpYz15dChlLG4sMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09byljPWJ0KGUsbixyLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1vKWM9d3QoZSxuLHIsYyk7ZWxzZSBpZigiYmlnaW50Ij09PW8pYz1wdChlLG4scixjKTtlbHNlIGlmKCJib29sZWFuIj09PW8pYz1tdChlLG4scixjKTtlbHNlIGlmKCJvYmplY3QiPT09byYmbnVsbD09ci5fYnNvbnR5cGUpaWYociBpbnN0YW5jZW9mIERhdGV8fGIocikpYz1TdChlLG4scixjKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxmKHIpKWM9SXQoZSxuLHIsYyk7ZWxzZSBpZihyIGluc3RhbmNlb2YgUmVnRXhwfHxoKHIpKWM9eHQoZSxuLHIsYyk7ZWxzZXtpZihzLmhhcyhyKSl0aHJvdyBuZXcgWigiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTtjb25zdCBpPUFycmF5LmlzQXJyYXkocik7ZVtjKytdPWk/djpOLGMrPWZlLmVuY29kZVVURjhJbnRvKGUsbixjKSxlW2MrK109MDtjb25zdCBvPWM7cy5hZGQociksYT1qdChyLG8sbnVsbCx0LHQuY2hlY2tLZXlzLHQuaWdub3JlVW5kZWZpbmVkKSxjKz00fWVsc2UgaWYoIm9iamVjdCI9PT1vKXtpZihyW3ldIT09cCl0aHJvdyBuZXcgRztjb25zdCBpPXJbZ2VdO2lmKCJPYmplY3RJZCI9PT1pKWM9RXQoZSxuLHIsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1pKWM9T3QoZSxuLHIsYyk7ZWxzZSBpZigiTG9uZyI9PT1pfHwiVGltZXN0YW1wIj09PWkpYz1OdChlLG4scixjKTtlbHNlIGlmKCJEb3VibGUiPT09aSljPVR0KGUsbixyLGMpO2Vsc2UgaWYoIkNvZGUiPT09aSl7Y29uc3QgaT1yO2lmKGkuc2NvcGUmJiJvYmplY3QiPT10eXBlb2YgaS5zY29wZSl7ZVtjKytdPUQsYys9ZmUuZW5jb2RlVVRGOEludG8oZSxuLGMpLGVbYysrXT0wO2NvbnN0IHI9YztjKz00O2NvbnN0IG89aS5jb2RlLF89ZmUuZW5jb2RlVVRGOEludG8oZSxvLGMrNCkrMTtwZS5zZXRJbnQzMkxFKGUsYyxfKSxlW2MrNCtfLTFdPTAsYz1jK18rNDtjb25zdCBsPWkuc2NvcGU7aWYocy5oYXMobCkpdGhyb3cgbmV3IFooIkNhbm5vdCBjb252ZXJ0IGNpcmN1bGFyIHN0cnVjdHVyZSB0byBCU09OIik7cy5hZGQobCksYT1qdChsLGMscix0LHQuY2hlY2tLZXlzLHQuaWdub3JlVW5kZWZpbmVkKSxjKz00fWVsc2V7ZVtjKytdPXosYys9ZmUuZW5jb2RlVVRGOEludG8oZSxuLGMpLGVbYysrXT0wO2NvbnN0IHQ9aS5jb2RlLnRvU3RyaW5nKCkscj1mZS5lbmNvZGVVVEY4SW50byhlLHQsYys0KSsxO3BlLnNldEludDMyTEUoZSxjLHIpLGM9Yys0K3ItMSxlW2MrK109MH19ZWxzZSBpZigiQmluYXJ5Ij09PWkpYz1MdChlLG4scixjKTtlbHNlIGlmKCJCU09OU3ltYm9sIj09PWkpYz1BdChlLG4scixjKTtlbHNlIGlmKCJEQlJlZiI9PT1pKXtjb25zdCBpPXIsbz1PYmplY3QuYXNzaWduKHskcmVmOmkuY29sbGVjdGlvbiwkaWQ6aS5vaWR9LG51bGwhPWkuZGI/eyRkYjppLmRifTpudWxsLGkuZmllbGRzKTtlW2MrK109TixjKz1mZS5lbmNvZGVVVEY4SW50byhlLG4sYyksZVtjKytdPTAscy5hZGQobyksYT1qdChvLGMsbnVsbCx0LCExLCEwKSxjKz00fWVsc2UgaWYoIkJTT05SZWdFeHAiPT09aSljPUJ0KGUsbixyLGMpO2Vsc2UgaWYoIkludDMyIj09PWkpYz12dChlLG4scixjKTtlbHNlIGlmKCJNaW5LZXkiPT09aXx8Ik1heEtleSI9PT1pKWM9VXQoZSxuLHIsYyk7ZWxzZSBpZih2b2lkIDAhPT1yLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhyLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT1vJiZpJiYoYz0kdChlLG4scixjKSl9cmV0dXJuIGN9Y29uc3QgRnQ9eyRvaWQ6bnQsJGJpbmFyeTp5ZSwkdXVpZDp5ZSwkc3ltYm9sOm90LCRudW1iZXJJbnQ6WmUsJG51bWJlckRlY2ltYWw6SGUsJG51bWJlckRvdWJsZTpLZSwkbnVtYmVyTG9uZzpSZSwkbWluS2V5OlhlLCRtYXhLZXk6R2UsJHJlZ2V4Oml0LCRyZWd1bGFyRXhwcmVzc2lvbjppdCwkdGltZXN0YW1wOmF0fTtmdW5jdGlvbiBrdChlLHQ9e30pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7Y29uc3Qgbj1lPD1tJiZlPj1TLHI9ZTw9eCYmZT49QjtpZih0LnJlbGF4ZWR8fHQubGVnYWN5KXJldHVybiBlO2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKG4pcmV0dXJuIG5ldyBaZShlKTtpZihyKXJldHVybiB0LnVzZUJpZ0ludDY0P0JpZ0ludChlKTpSZS5mcm9tTnVtYmVyKGUpfXJldHVybiBuZXcgS2UoZSl9aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiBlO2lmKGUuJHVuZGVmaW5lZClyZXR1cm4gbnVsbDtjb25zdCBuPU9iamVjdC5rZXlzKGUpLmZpbHRlcigodD0+dC5zdGFydHNXaXRoKCIkIikmJm51bGwhPWVbdF0pKTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7Y29uc3QgaT1GdFtuW3JdXTtpZihpKXJldHVybiBpLmZyb21FeHRlbmRlZEpTT04oZSx0KX1pZihudWxsIT1lLiRkYXRlKXtjb25zdCBuPWUuJGRhdGUscj1uZXcgRGF0ZTtpZih0LmxlZ2FjeSlpZigibnVtYmVyIj09dHlwZW9mIG4pci5zZXRUaW1lKG4pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgWCgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNlIGlmKFJlLmlzTG9uZyhuKSlyLnNldFRpbWUobi50b051bWJlcigpKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdC5yZWxheGVkKXIuc2V0VGltZShuKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgWCgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfXJldHVybiByfWlmKG51bGwhPWUuJGNvZGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gZS4kc2NvcGUmJih0LiRzY29wZT1rdChlLiRzY29wZSkpLFVlLmZyb21FeHRlbmRlZEpTT04oZSl9aWYoRWUoZSl8fGUuJGRiUG9pbnRlcil7Y29uc3QgdD1lLiRyZWY/ZTplLiRkYlBvaW50ZXI7aWYodCBpbnN0YW5jZW9mIEllKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmtleXModCkuZmlsdGVyKChlPT5lLnN0YXJ0c1dpdGgoIiQiKSkpO2xldCByPSEwO2lmKG4uZm9yRWFjaCgoZT0+ey0xPT09WyIkcmVmIiwiJGlkIiwiJGRiIl0uaW5kZXhPZihlKSYmKHI9ITEpfSkpLHIpcmV0dXJuIEllLmZyb21FeHRlbmRlZEpTT04odCl9cmV0dXJuIGV9ZnVuY3Rpb24genQoZSl7Y29uc3QgdD1lLnRvSVNPU3RyaW5nKCk7cmV0dXJuIDAhPT1lLmdldFVUQ01pbGxpc2Vjb25kcygpP3Q6dC5zbGljZSgwLC01KSsiWiJ9ZnVuY3Rpb24gQ3QoZSx0KXtpZihlIGluc3RhbmNlb2YgTWFwfHxkKGUpKXtjb25zdCBuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Qscl1vZiBlKXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooIkNhbiBvbmx5IHNlcmlhbGl6ZSBtYXBzIHdpdGggc3RyaW5nIGtleXMiKTtuW3RdPXJ9cmV0dXJuIEN0KG4sdCl9aWYoKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZudWxsIT09ZSl7Y29uc3Qgbj10LnNlZW5PYmplY3RzLmZpbmRJbmRleCgodD0+dC5vYmo9PT1lKSk7aWYoLTEhPT1uKXtjb25zdCBlPXQuc2Vlbk9iamVjdHMubWFwKChlPT5lLnByb3BlcnR5TmFtZSkpLHI9ZS5zbGljZSgwLG4pLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLGk9ZVtuXSxvPSIgLT4gIitlLnNsaWNlKG4rMSxlLmxlbmd0aC0xKS5tYXAoKGU9PmAke2V9IC0+IGApKS5qb2luKCIiKSxzPWVbZS5sZW5ndGgtMV0sYT0iICIucmVwZWF0KHIubGVuZ3RoK2kubGVuZ3RoLzIpLGM9Ii0iLnJlcGVhdChvLmxlbmd0aCsoaS5sZW5ndGgrcy5sZW5ndGgpLzItMSk7dGhyb3cgbmV3IFooYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEVKU09OOlxuICAgICR7cn0ke2l9JHtvfSR7c31cbiAgICAke2F9XFwke2N9L2ApfXQuc2Vlbk9iamVjdHNbdC5zZWVuT2JqZWN0cy5sZW5ndGgtMV0ub2JqPWV9aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoKChlLG4pPT57dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6YGluZGV4ICR7bn1gLG9iajpudWxsfSk7dHJ5e3JldHVybiBDdChlLHQpfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19KSl9KGUsdCk7aWYodm9pZCAwPT09ZSlyZXR1cm4gdC5pZ25vcmVVbmRlZmluZWQ/dm9pZCAwOm51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGV8fGIoZSkpe2NvbnN0IG49ZS5nZXRUaW1lKCkscj1uPi0xJiZuPDI1MzQwMjMwMDhlNTtyZXR1cm4gdC5sZWdhY3k/dC5yZWxheGVkJiZyP3skZGF0ZTplLmdldFRpbWUoKX06eyRkYXRlOnp0KGUpfTp0LnJlbGF4ZWQmJnI/eyRkYXRlOnp0KGUpfTp7JGRhdGU6eyRudW1iZXJMb25nOmUuZ2V0VGltZSgpLnRvU3RyaW5nKCl9fX1pZighKCJudW1iZXIiIT10eXBlb2YgZXx8dC5yZWxheGVkJiZpc0Zpbml0ZShlKSkpe2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKGU+PVMmJmU8PW0pcmV0dXJueyRudW1iZXJJbnQ6ZS50b1N0cmluZygpfTtpZihlPj1CJiZlPD14KXJldHVybnskbnVtYmVyTG9uZzplLnRvU3RyaW5nKCl9fXJldHVybnskbnVtYmVyRG91YmxlOk9iamVjdC5pcyhlLC0wKT8iLTAuMCI6ZS50b1N0cmluZygpfX1pZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuIHQucmVsYXhlZD9OdW1iZXIoQmlnSW50LmFzSW50Tig2NCxlKSk6eyRudW1iZXJMb25nOkJpZ0ludC5hc0ludE4oNjQsZSkudG9TdHJpbmcoKX07aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cHx8aChlKSl7bGV0IG49ZS5mbGFncztpZih2b2lkIDA9PT1uKXtjb25zdCB0PWUudG9TdHJpbmcoKS5tYXRjaCgvW2dpbXV5XSokLyk7dCYmKG49dFswXSl9cmV0dXJuIG5ldyBpdChlLnNvdXJjZSxuKS50b0V4dGVuZGVkSlNPTih0KX1yZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2Z1bmN0aW9uKGUsdCl7aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBaKCJub3QgYW4gb2JqZWN0IGluc3RhbmNlIik7Y29uc3Qgbj1lLl9ic29udHlwZTtpZih2b2lkIDA9PT1uKXtjb25zdCBuPXt9O2Zvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKGUpKXt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpyLG9iajpudWxsfSk7dHJ5e2NvbnN0IGk9Q3QoZVtyXSx0KTsiX19wcm90b19fIj09PXI/T2JqZWN0LmRlZmluZVByb3BlcnR5KG4scix7dmFsdWU6aSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOm5bcl09aX1maW5hbGx5e3Quc2Vlbk9iamVjdHMucG9wKCl9fXJldHVybiBufWlmKG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBlLl9ic29udHlwZSYmZVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9ic29udHlwZSJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlfShlKSl7bGV0IHI9ZTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygci50b0V4dGVuZGVkSlNPTil7Y29uc3QgdD1EdFtlLl9ic29udHlwZV07aWYoIXQpdGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogIitlLl9ic29udHlwZSk7cj10KHIpfXJldHVybiJDb2RlIj09PW4mJnIuc2NvcGU/cj1uZXcgVWUoci5jb2RlLEN0KHIuc2NvcGUsdCkpOiJEQlJlZiI9PT1uJiZyLm9pZCYmKHI9bmV3IEllKEN0KHIuY29sbGVjdGlvbix0KSxDdChyLm9pZCx0KSxDdChyLmRiLHQpLEN0KHIuZmllbGRzLHQpKSksci50b0V4dGVuZGVkSlNPTih0KX10aHJvdyBuZXcgWigiX2Jzb250eXBlIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCB3YXM6ICIrdHlwZW9mIG4pfShlLHQpOmV9Y29uc3QgRHQ9e0JpbmFyeTplPT5uZXcgeWUoZS52YWx1ZSgpLGUuc3ViX3R5cGUpLENvZGU6ZT0+bmV3IFVlKGUuY29kZSxlLnNjb3BlKSxEQlJlZjplPT5uZXcgSWUoZS5jb2xsZWN0aW9ufHxlLm5hbWVzcGFjZSxlLm9pZCxlLmRiLGUuZmllbGRzKSxEZWNpbWFsMTI4OmU9Pm5ldyBIZShlLmJ5dGVzKSxEb3VibGU6ZT0+bmV3IEtlKGUudmFsdWUpLEludDMyOmU9Pm5ldyBaZShlLnZhbHVlKSxMb25nOmU9PlJlLmZyb21CaXRzKG51bGwhPWUubG93P2UubG93OmUubG93XyxudWxsIT1lLmxvdz9lLmhpZ2g6ZS5oaWdoXyxudWxsIT1lLmxvdz9lLnVuc2lnbmVkOmUudW5zaWduZWRfKSxNYXhLZXk6KCk9Pm5ldyBHZSxNaW5LZXk6KCk9Pm5ldyBYZSxPYmplY3RJZDplPT5uZXcgbnQoZSksQlNPTlJlZ0V4cDplPT5uZXcgaXQoZS5wYXR0ZXJuLGUub3B0aW9ucyksQlNPTlN5bWJvbDplPT5uZXcgb3QoZS52YWx1ZSksVGltZXN0YW1wOmU9PmF0LmZyb21CaXRzKGUubG93LGUuaGlnaCl9O2Z1bmN0aW9uIFZ0KGUsdCl7Y29uc3Qgbj17dXNlQmlnSW50NjQ6dD8udXNlQmlnSW50NjQ/PyExLHJlbGF4ZWQ6dD8ucmVsYXhlZD8/ITAsbGVnYWN5OnQ/LmxlZ2FjeT8/ITF9O3JldHVybiBKU09OLnBhcnNlKGUsKChlLHQpPT57aWYoLTEhPT1lLmluZGV4T2YoIlwwIikpdGhyb3cgbmV3IFooYEJTT04gRG9jdW1lbnQgZmllbGQgbmFtZXMgY2Fubm90IGNvbnRhaW4gbnVsbCBieXRlcywgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIGt0KHQsbil9KSl9ZnVuY3Rpb24gTXQoZSx0LG4scil7bnVsbCE9biYmIm9iamVjdCI9PXR5cGVvZiBuJiYocj1uLG49dm9pZCAwKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDApO2NvbnN0IGk9Q3QoZSxPYmplY3QuYXNzaWduKHtyZWxheGVkOiEwLGxlZ2FjeTohMX0scix7c2Vlbk9iamVjdHM6W3twcm9wZXJ0eU5hbWU6Iihyb290KSIsb2JqOm51bGx9XX0pKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSx0LG4pfWNvbnN0IFB0PU9iamVjdC5jcmVhdGUobnVsbCk7UHQucGFyc2U9VnQsUHQuc3RyaW5naWZ5PU10LFB0LnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LEpTT04ucGFyc2UoTXQoZSx0KSl9LFB0LmRlc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8e30sVnQoSlNPTi5zdHJpbmdpZnkoZSksdCl9LE9iamVjdC5mcmVlemUoUHQpO2NvbnN0IEp0PTEsV3Q9MixZdD0zLHF0PTQsSHQ9NSxLdD02LFp0PTcsR3Q9OCxYdD05LFF0PTEwLGVuPTExLHRuPTEyLG5uPTEzLHJuPTE0LG9uPTE1LHNuPTE2LGFuPTE3LGNuPTE4LF9uPTE5LGxuPTI1NSx1bj0xMjc7ZnVuY3Rpb24gZm4oZSx0KXt0cnl7cmV0dXJuIHBlLmdldE5vbm5lZ2F0aXZlSW50MzJMRShlLHQpfWNhdGNoKGUpe3Rocm93IG5ldyBRKCJCU09OIHNpemUgY2Fubm90IGJlIG5lZ2F0aXZlIix0LHtjYXVzZTplfSl9fWZ1bmN0aW9uIGduKGUsdCl7bGV0IG49dDtmb3IoOzAhPT1lW25dO24rKyk7aWYobj09PWUubGVuZ3RoLTEpdGhyb3cgbmV3IFEoIk51bGwgdGVybWluYXRvciBub3QgZm91bmQiLHQpO3JldHVybiBufWNvbnN0IGhuPU9iamVjdC5jcmVhdGUobnVsbCk7aG4ucGFyc2VUb0VsZW1lbnRzPWZ1bmN0aW9uKGUsdD0wKXtpZih0Pz89MCxlLmxlbmd0aDw1KXRocm93IG5ldyBRKGBJbnB1dCBtdXN0IGJlIGF0IGxlYXN0IDUgYnl0ZXMsIGdvdCAke2UubGVuZ3RofSBieXRlc2AsdCk7Y29uc3Qgbj1mbihlLHQpO2lmKG4+ZS5sZW5ndGgtdCl0aHJvdyBuZXcgUShgUGFyc2VkIGRvY3VtZW50U2l6ZSAoJHtufSBieXRlcykgZG9lcyBub3QgbWF0Y2ggaW5wdXQgbGVuZ3RoICgke2UubGVuZ3RofSBieXRlcylgLHQpO2lmKDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgUSgiQlNPTiBkb2N1bWVudHMgbXVzdCBlbmQgaW4gMHgwMCIsdCtuKTtjb25zdCByPVtdO2xldCBpPXQrNDtmb3IoO2k8PW4rdDspe2NvbnN0IG89ZVtpXTtpZihpKz0xLDA9PT1vKXtpZihpLXQhPT1uKXRocm93IG5ldyBRKCJJbnZhbGlkIDB4MDAgdHlwZSBieXRlIixpKTticmVha31jb25zdCBzPWksYT1nbihlLGkpLXM7bGV0IGM7aWYoaSs9YSsxLG89PT1KdHx8bz09PWNufHxvPT09WHR8fG89PT1hbiljPTg7ZWxzZSBpZihvPT09c24pYz00O2Vsc2UgaWYobz09PVp0KWM9MTI7ZWxzZSBpZihvPT09X24pYz0xNjtlbHNlIGlmKG89PT1HdCljPTE7ZWxzZSBpZihvPT09UXR8fG89PT1LdHx8bz09PXVufHxvPT09bG4pYz0wO2Vsc2UgaWYobz09PWVuKWM9Z24oZSxnbihlLGkpKzEpKzEtaTtlbHNlIGlmKG89PT1ZdHx8bz09PXF0fHxvPT09b24pYz1mbihlLGkpO2Vsc2V7aWYobyE9PVd0JiZvIT09SHQmJm8hPT10biYmbyE9PW5uJiZvIT09cm4pdGhyb3cgbmV3IFEoYEludmFsaWQgMHgke28udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX0gdHlwZSBieXRlYCxpKTtjPWZuKGUsaSkrNCxvPT09SHQmJihjKz0xKSxvPT09dG4mJihjKz0xMil9aWYoYz5uKXRocm93IG5ldyBRKCJ2YWx1ZSByZXBvcnRzIGxlbmd0aCBsYXJnZXIgdGhhbiBkb2N1bWVudCIsaSk7ci5wdXNoKFtvLHMsYSxpLGNdKSxpKz1jfXJldHVybiByfSxobi5CeXRlVXRpbHM9ZmUsaG4uTnVtYmVyVXRpbHM9cGUsT2JqZWN0LmZyZWV6ZShobik7Y29uc3QgZG49MTc4MjU3OTI7bGV0IGJuPWZlLmFsbG9jYXRlKGRuKTt2YXIgd249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQlNPTkVycm9yOlosQlNPTk9mZnNldEVycm9yOlEsQlNPTlJlZ0V4cDppdCxCU09OUnVudGltZUVycm9yOlgsQlNPTlN5bWJvbDpvdCxCU09OVHlwZTpLLEJTT05WYWx1ZTpoZSxCU09OVmVyc2lvbkVycm9yOkcsQmluYXJ5OnllLEJ5dGVVdGlsczpmZSxDb2RlOlVlLERCUmVmOkllLERlY2ltYWwxMjg6SGUsRG91YmxlOktlLEVKU09OOlB0LEludDMyOlplLExvbmc6UmUsTWF4S2V5OkdlLE1pbktleTpYZSxOdW1iZXJVdGlsczpwZSxPYmplY3RJZDpudCxUaW1lc3RhbXA6YXQsVVVJRDpCZSxic29uVHlwZTpnZSxjYWxjdWxhdGVPYmplY3RTaXplOmZ1bmN0aW9uKGUsdD17fSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtjb25zdCByPVt7b2JqZWN0OmUsaWdub3JlVW5kZWZpbmVkOm4/PyExLGV4aXQ6ITF9XSxpPW5ldyBTZXQ7bGV0IG89MDtmb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBlPXIucG9wKCk7aWYoZS5leGl0KXtpLmRlbGV0ZShlLm9iamVjdCk7Y29udGludWV9Y29uc3R7b2JqZWN0Om4saWdub3JlVW5kZWZpbmVkOnN9PWU7aS5hZGQobiksZS5leGl0PSEwLHIucHVzaChlKSxvKz01O2NvbnN0IGE9QXJyYXkuaXNBcnJheShuKSxjPSFhJiYobiBpbnN0YW5jZW9mIE1hcHx8ZChuKSk7bGV0IF89bjtpZihhfHxjfHwiZnVuY3Rpb24iIT10eXBlb2Ygbj8udG9CU09OfHwoXz1uLnRvQlNPTigpKSxhKXtjb25zdCBlPV87Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspbys9cnQobi50b1N0cmluZygpLGVbbl0sdCwhMCxzLHIsaSl9ZWxzZSBpZihjKWZvcihjb25zdFtlLG5db2YgXylvKz1ydChlLG4sdCwhMSxzLHIsaSk7ZWxzZSBmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhfKSlvKz1ydChlLF9bZV0sdCwhMSxzLHIsaSl9cmV0dXJuIG99KGUsImJvb2xlYW4iPT10eXBlb2YodD10fHx7fSkuc2VyaWFsaXplRnVuY3Rpb25zJiZ0LnNlcmlhbGl6ZUZ1bmN0aW9ucywiYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQpfSxkZXNlcmlhbGl6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBsdChmZS50b0xvY2FsQnVmZmVyVHlwZShlKSx0KX0sZGVzZXJpYWxpemVTdHJlYW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe2NvbnN0IHM9T2JqZWN0LmFzc2lnbih7YWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemU6ITAsaW5kZXg6MH0sbyksYT1mZS50b0xvY2FsQnVmZmVyVHlwZShlKTtsZXQgYz10O2ZvcihsZXQgZT0wO2U8bjtlKyspe2NvbnN0IHQ9cGUuZ2V0SW50MzJMRShhLGMpO3MuaW5kZXg9YyxyW2krZV09bHQoYSxzKSxjKz10fXJldHVybiBjfSxvbkRlbWFuZDpobixzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtjb25zdCBuPSJib29sZWFuIj09dHlwZW9mIHQuY2hlY2tLZXlzJiZ0LmNoZWNrS2V5cyxyPSJib29sZWFuIj09dHlwZW9mIHQuc2VyaWFsaXplRnVuY3Rpb25zJiZ0LnNlcmlhbGl6ZUZ1bmN0aW9ucyxpPSJib29sZWFuIiE9dHlwZW9mIHQuaWdub3JlVW5kZWZpbmVkfHx0Lmlnbm9yZVVuZGVmaW5lZCxvPSJudW1iZXIiPT10eXBlb2YgdC5taW5JbnRlcm5hbEJ1ZmZlclNpemU/dC5taW5JbnRlcm5hbEJ1ZmZlclNpemU6ZG47Ym4ubGVuZ3RoPG8mJihibj1mZS5hbGxvY2F0ZShvKSk7Y29uc3Qgcz1SdChibixlLG4sMCxyLGksbnVsbCksYT1mZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQoYm4uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPVJ0KGJuLGUsciwwLGksbyxudWxsKTtyZXR1cm4gdC5zZXQoYm4uc3ViYXJyYXkoMCxhKSxzKSxzK2EtMX0sc2V0SW50ZXJuYWxCdWZmZXJTaXplOmZ1bmN0aW9uKGUpe2JuLmxlbmd0aDxlJiYoYm49ZmUuYWxsb2NhdGUoZSkpfX0pO2NsYXNzIHBue2NvbnN0cnVjdG9yKCl7fXN0YXRpYyB1cmxDb25zdHJ1Y3RGcm9tKGUpe2NvbnN0IHQ9Ii93cy9tb2RlbGluZy9jb21tYW5kcyIrZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBlIG9mIHIpdC5hcHBlbmQobixTdHJpbmcoZSkpO2Vsc2UgdC5hcHBlbmQobixTdHJpbmcocikpO2NvbnN0IG49dC50b1N0cmluZygpO3JldHVybiBuP2A/JHtufWA6IiJ9KHt2aWRlb19yZXNfd2lkdGg6ZS52aWRlb19yZXNfd2lkdGgsdmlkZW9fcmVzX2hlaWdodDplLnZpZGVvX3Jlc19oZWlnaHQsZnBzOmUuZnBzLHVubG9ja2VkX2ZyYW1lcmF0ZTplLnVubG9ja2VkX2ZyYW1lcmF0ZSxwb3N0X2VmZmVjdDplLnBvc3RfZWZmZWN0LHdlYnJ0YzplLndlYnJ0YyxnZW9tZXRyeV9vbmx5OmUuZ2VvbWV0cnlfb25seSxwb29sOmUucG9vbCxzaG93X2dyaWQ6ZS5zaG93X2dyaWQscmVwbGF5OmUucmVwbGF5LGFwaV9jYWxsX2lkOmUuYXBpX2NhbGxfaWQsb3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5OmUub3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5LGtjbF92ZXJzaW9uOmUua2NsX3ZlcnNpb24scHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gd24uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHduLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiB3bi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiB3bi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgeW57c3RhdGljIF9fd3JhcChlKXtlPj4+PTA7Y29uc3QgdD1PYmplY3QuY3JlYXRlKHluLnByb3RvdHlwZSk7cmV0dXJuIHQuX193YmdfcHRyPWUsQW4ucmVnaXN0ZXIodCx0Ll9fd2JnX3B0cix0KSx0fV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQW4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuX193YmdfY29udGV4dF9mcmVlKGUsMCl9YWRkX2NvbnN0cmFpbnQoZSx0LG4scixpKXtjb25zdCBvPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxzPXVyLGE9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyO3JldHVybiBsci5jb250ZXh0X2FkZF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLG8scyxhLGMsXyxsLHUsZixpKX1hZGRfZmlsZShlLHQpe2NvbnN0IG49aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9dXI7cmV0dXJuIGxyLmNvbnRleHRfYWRkX2ZpbGUodGhpcy5fX3diZ19wdHIsZSxuLHIpfWFkZF9zZWdtZW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cjt2YXIgZj10cihyKT8wOmlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyO2NvbnN0IGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfYWRkX3NlZ21lbnQodGhpcy5fX3diZ19wdHIscyxhLGMsXyxsLHUsZixnLGgsZCxvKX1idXN0Q2FjaGVBbmRSZXNldFNjZW5lKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cjt2YXIgaT10cih0KT8wOmlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5jb250ZXh0X2J1c3RDYWNoZUFuZFJlc2V0U2NlbmUodGhpcy5fX3diZ19wdHIsbixyLGksbyl9Y2hhaW5fc2VnbWVudChlLHQsbixyLGksbyxzKXtjb25zdCBhPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9dXIsdT1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj11cixnPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxoPXVyO3ZhciBkPXRyKGkpPzA6aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9dXI7Y29uc3Qgdz1pcihvLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscD11cjtyZXR1cm4gbHIuY29udGV4dF9jaGFpbl9zZWdtZW50KHRoaXMuX193YmdfcHRyLGEsYyxfLGwsdSxmLGcsaCxkLGIsdyxwLHMpfWNsZWFyX3NrZXRjaF9jaGVja3BvaW50cygpe3JldHVybiBsci5jb250ZXh0X2NsZWFyX3NrZXRjaF9jaGVja3BvaW50cyh0aGlzLl9fd2JnX3B0cil9Y2xvbmVXaXRoRXhlY3V0ZUNhbGxiYWNrcyhlKXtjb25zdCB0PWxyLmNvbnRleHRfY2xvbmVXaXRoRXhlY3V0ZUNhbGxiYWNrcyh0aGlzLl9fd2JnX3B0cixlKTtyZXR1cm4geW4uX193cmFwKHQpfWRlbGV0ZV9vYmplY3RzKGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfZGVsZXRlX29iamVjdHModGhpcy5fX3diZ19wdHIscyxhLGMsXyxsLHUsZixnLGgsZCxvKX1kZWxldGVfc2tldGNoKGUsdCxuKXtjb25zdCByPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxpPXVyLG89aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9dXIsYT1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cjtyZXR1cm4gbHIuY29udGV4dF9kZWxldGVfc2tldGNoKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1lZGl0X2FuZ2xlX2NvbnN0cmFpbnQoZSx0LG4scixpLG8scyl7Y29uc3QgYT1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cixfPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxsPXVyLHU9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9dXIsZz1pcihyLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD11cixkPWlyKGksbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxiPXVyO3JldHVybiBsci5jb250ZXh0X2VkaXRfYW5nbGVfY29uc3RyYWludCh0aGlzLl9fd2JnX3B0cixhLGMsXyxsLHUsZixnLGgsZCxiLG8scyl9ZWRpdF9jb25zdHJhaW50X3ZhbHVlKGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50X3ZhbHVlKHRoaXMuX193YmdfcHRyLHMsYSxjLF8sbCx1LGYsZyxoLGQsbyl9ZWRpdF9kaXN0YW5jZV9jb25zdHJhaW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyLGc9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9dXIsZD1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj11cjtyZXR1cm4gbHIuY29udGV4dF9lZGl0X2Rpc3RhbmNlX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsYSxjLF8sbCx1LGYsZyxoLGQsYixvLHMpfWVkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbihlLHQsbixyLGksbyxzLGEpe2NvbnN0IGM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXIsYj1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdz11cixwPWlyKHMsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSx5PXVyO3JldHVybiBsci5jb250ZXh0X2VkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbih0aGlzLl9fd2JnX3B0cixjLF8sbCx1LGYsZyxoLGQsYix3LG8scCx5LGEpfWVkaXRfc2VnbWVudHMoZSx0LG4scixpLG8scyxhLGMpe2NvbnN0IF89aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9dXIsdT1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj11cixnPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxoPXVyLGQ9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9dXIsdz1pcihvLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscD11cix5PWlyKHMsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxtPXVyLFM9aXIoYyxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHg9dXI7cmV0dXJuIGxyLmNvbnRleHRfZWRpdF9zZWdtZW50cyh0aGlzLl9fd2JnX3B0cixfLGwsdSxmLGcsaCxkLGIsaSx3LHAseSxtLGEsUyx4KX1lZGl0X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9dXIsYT1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cixfPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxsPXVyLHU9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9dXIsZz1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD11cjtyZXR1cm4gbHIuY29udGV4dF9lZGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLF8sbCx1LGYsZyxoKX1ldmFsdWF0ZUV4cHJlc3Npb24oZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyLGk9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7cmV0dXJuIGxyLmNvbnRleHRfZXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX193YmdfcHRyLG4scixpLG8pfWV4ZWN1dGUoZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7dmFyIG89dHIodCk/MDppcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cjtjb25zdCBhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X2V4ZWN1dGUodGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfWV4ZWN1dGVNb2NrKGUsdCxuLHIpe2NvbnN0IGk9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7dmFyIHM9dHIodCk/MDppcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT11cjtjb25zdCBjPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxfPXVyO3JldHVybiBsci5jb250ZXh0X2V4ZWN1dGVNb2NrKHRoaXMuX193YmdfcHRyLGksbyxzLGEsYyxfLHIpfWV4ZWN1dGVfdHJpbShlLHQsbixyKXtjb25zdCBpPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1ycihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jKSxfPXVyLGw9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9dXI7cmV0dXJuIGxyLmNvbnRleHRfZXhlY3V0ZV90cmltKHRoaXMuX193YmdfcHRyLGksbyxzLGEsYyxfLGwsdSl9ZXhpdF9za2V0Y2goZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X2V4aXRfc2tldGNoKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1leHBvcnQoZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyLGk9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7cmV0dXJuIGxyLmNvbnRleHRfZXhwb3J0KHRoaXMuX193YmdfcHRyLG4scixpLG8pfWdldF9maWxlKGUsdCl7cmV0dXJuIGxyLmNvbnRleHRfZ2V0X2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX1nZXRfcHJvamVjdChlKXtyZXR1cm4gbHIuY29udGV4dF9nZXRfcHJvamVjdCh0aGlzLl9fd2JnX3B0cixlKX1oYWNrX3NldF9wcm9ncmFtKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cixpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5jb250ZXh0X2hhY2tfc2V0X3Byb2dyYW0odGhpcy5fX3diZ19wdHIsbixyLGksbyl9Y29uc3RydWN0b3IoZSx0LG4scil7Y29uc3QgaT1sci5jb250ZXh0X25ldyhlLHQsdHIobik/MDpWbihuKSx0cihyKT8xNjc3NzIxNTpyPzE6MCk7aWYoaVsyXSl0aHJvdyBvcihpWzFdKTtyZXR1cm4gdGhpcy5fX3diZ19wdHI9aVswXT4+PjAsQW4ucmVnaXN0ZXIodGhpcyx0aGlzLl9fd2JnX3B0cix0aGlzKSx0aGlzfW5ld19za2V0Y2goZSx0LG4scixpKXtjb25zdCBvPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxzPXVyLGE9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyLGc9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9dXI7cmV0dXJuIGxyLmNvbnRleHRfbmV3X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLF8sbCx1LGYsZyxoKX1vcGVuX3Byb2plY3QoZSx0LG4pe2NvbnN0IHI9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7cmV0dXJuIGxyLmNvbnRleHRfb3Blbl9wcm9qZWN0KHRoaXMuX193YmdfcHRyLGUscixpLG4pfXJlZnJlc2goZSl7cmV0dXJuIGxyLmNvbnRleHRfcmVmcmVzaCh0aGlzLl9fd2JnX3B0cixlKX1yZW1vdmVfZmlsZShlLHQpe3JldHVybiBsci5jb250ZXh0X3JlbW92ZV9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9cmVzdG9yZV9za2V0Y2hfY2hlY2twb2ludChlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyO3JldHVybiBsci5jb250ZXh0X3Jlc3RvcmVfc2tldGNoX2NoZWNrcG9pbnQodGhpcy5fX3diZ19wdHIsdCxuKX1zZW5kUmVzcG9uc2UoZSl7cmV0dXJuIGxyLmNvbnRleHRfc2VuZFJlc3BvbnNlKHRoaXMuX193YmdfcHRyLGUpfXNrZXRjaF9leGVjdXRlX21vY2soZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X3NrZXRjaF9leGVjdXRlX21vY2sodGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfXN3aXRjaF9maWxlKGUsdCl7cmV0dXJuIGxyLmNvbnRleHRfc3dpdGNoX2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX11cGRhdGVfZmlsZShlLHQsbil7Y29uc3Qgcj1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT11cjtyZXR1cm4gbHIuY29udGV4dF91cGRhdGVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQscixpKX19U3ltYm9sLmRpc3Bvc2UmJih5bi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPXluLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBtbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGUsMCl9Z2V0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSgpe3JldHVybiBsci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfYXV0b0FsbG9jYXRlQ2h1bmtTaXplKHRoaXMuX193YmdfcHRyKT4+PjB9Y2FuY2VsKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gbHIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9c3RhcnQoZSl7bHIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3N0YXJ0KHRoaXMuX193YmdfcHRyLGUpfWdldCB0eXBlKCl7Y29uc3QgZT1sci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIExuW2VdfX1TeW1ib2wuZGlzcG9zZSYmKG1uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09bW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIFNue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsUm4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZSwwKX1hYm9ydChlKXtjb25zdCB0PXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc2lua19hYm9ydCh0LGUpfWNsb3NlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiBsci5pbnRvdW5kZXJseWluZ3NpbmtfY2xvc2UoZSl9d3JpdGUoZSl7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc2lua193cml0ZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihTbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVNuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyB4bntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEZuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZSwwKX1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuaW50b3VuZGVybHlpbmdzb3VyY2VfY2FuY2VsKGUpfXB1bGwoZSl7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9fVN5bWJvbC5kaXNwb3NlJiYoeG4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT14bi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQm57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxrbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlLDApfWNvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCByPWxyLmxzcHNlcnZlcmNvbmZpZ19uZXcoZSx0LG4pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yPj4+MCxrbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9fVN5bWJvbC5kaXNwb3NlJiYoQm4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Cbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgVW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCx6bi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlLDApfWNvbnN0cnVjdG9yKCl7Y29uc3QgZT1sci5yZXNwb25zZWNvbnRleHRfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPWU+Pj4wLHpuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZW5kX3Jlc3BvbnNlKGUpe3JldHVybiBsci5yZXNwb25zZWNvbnRleHRfc2VuZF9yZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihVbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBFbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoRW4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxDbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxDbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlLDApfWdldCBhcmNfbGVuZ3RoKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX2xlbmd0aCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeCgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeSgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IGNjdygpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2Njdyh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl94KCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgZW5kX2FuZ2xlKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZW5kX2FuZ2xlKHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyKX1nZXQgc3RhcnRfYW5nbGUoKXtyZXR1cm4gbHIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cil9c2V0IGFyY19sZW5ndGgoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyLGUpfXNldCBhcmNfbWlkX3BvaW50X3goZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbWlkX3BvaW50X3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeShlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2N3KGUpe2xyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeChlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyLGUpfXNldCBlbmRfYW5nbGUoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX1zZXQgc3RhcnRfYW5nbGUoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihFbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBJbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoSW4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxEbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZSwwKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gbHIuX193YmdfZ2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiBsci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IHJhZGl1cygpe3JldHVybiBsci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIpfXNldCBjZW50ZXJfeChlKXtsci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2VudGVyX3koZSl7bHIuX193Ymdfc2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXtsci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIsZSl9fWZ1bmN0aW9uIE9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5wYXJzZV93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBvcihyWzFdKTtyZXR1cm4gb3IoclswXSl9ZnVuY3Rpb24gTm4oKXtjb25zdCBlPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl81NTUzODQ4M2RlNmUzYWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEVycm9yKEduKGUsdCkpfSxfX3diZ19fX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0X2ZlMmEyNGZkZmRiNDA2NGY6ZnVuY3Rpb24oZSl7Y29uc3QgdD0iYm9vbGVhbiI9PXR5cGVvZiBlP2U6dm9pZCAwO3JldHVybiB0cih0KT8xNjc3NzIxNTp0PzE6MH0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfZDg5NjI3MjAyZDAxNTViNzpmdW5jdGlvbihlLHQpe2NvbnN0IG49aXIoSm4odCksbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyO0huKCkuc2V0SW50MzIoZSs0LHIsITApLEhuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJhOTU0MDY0MjNlYTg2MjY6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF84ZDkwNTI0YzllMGFmMTgzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZX0sX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNTlhMDAyZTc2YjA1OTMxMjpmdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF84N2EzYTgzN2YzMzFmZWY1OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSxfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfZjExNjEzOTA0MTRmOWI1OTpmdW5jdGlvbihlLHQpe2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiB0P3Q6dm9pZCAwO3ZhciByPXRyKG4pPzA6aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7SG4oKS5zZXRJbnQzMihlKzQsaSwhMCksSG4oKS5zZXRJbnQzMihlKzAsciwhMCl9LF9fd2JnX19fd2JpbmRnZW5fdGhyb3dfNTU0OTQ5MmRhZWRhZDEzOTpmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBFcnJvcihHbihlLHQpKX0sX193YmdfX3diZ19jYl91bnJlZl9mYmU2OWJiMDc2YzE2YmFkOmZ1bmN0aW9uKGUpe2UuX3diZ19jYl91bnJlZigpfSxfX3diZ19idWZmZXJfMGE1Nzc4OGNkZmNlMjFiYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LF9fd2JnX2J5b2JSZXF1ZXN0X2FiMGU1N2Y1NWJmNzc0ZjI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJ5b2JSZXF1ZXN0O3JldHVybiB0cih0KT8wOlZuKHQpfSxfX3diZ19ieXRlTGVuZ3RoXzk5MzFkYjAwZTU4NjFiZjk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZUxlbmd0aH0sX193YmdfYnl0ZU9mZnNldF8wYTk4NWE5OGY4ZmZiOGQ3OmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ5dGVPZmZzZXR9LF9fd2JnX2NhbGxfOGY1ZDdiYjA3MDI4MzUwODpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmNhbGwodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzYyZjZhNGVhZGM5NDU2NWY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzg3MWU1MTZhMjczZDE1Zjg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0sX193YmdfY2xvc2VfZjI4NzA1ODcxNjA4OGE1MDpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfZG9uZV8xOWY5MmNiMWY4NzM4YWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmV9LF9fd2JnX2VucXVldWVfZWUwNTkzY2VhOWJlOTNiZDpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0KXtlLmVucXVldWUodCl9KSxhcmd1bWVudHMpfSxfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7bj1lLHI9dCxjb25zb2xlLmVycm9yKEduKGUsdCkpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LF9fd2JnX2Vycm9yX2RlNmI4NmU1OTg1MDUyNDY6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sX193YmdfZXhpc3RzX2ZlMjI4YmQ1MDE0NmFjMTY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmV4aXN0cyhHbih0LG4pKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtXzQ0NTNmYTFiMDg0ZTdiZjU6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgXyxsLHUsZixnLGgsZCxiO3RyeXtfPXQsbD1uLHU9cixmPWksZz1vLGg9cyxkPWEsYj1jLGUuZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKEduKHQsbiksR24ocixpKSxHbihvLHMpLEduKGEsYykpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKF8sbCwxKSxsci5fX3diaW5kZ2VuX2ZyZWUodSxmLDEpLGxyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksbHIuX193YmluZGdlbl9mcmVlKGQsYiwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRBbGxGaWxlc182NWRhZjE3ODAxZGMxNjNlOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5nZXRBbGxGaWxlcyhHbih0LG4pKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzNmNDRiNzAwMzk1MDYyZTU6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFluKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzY5NmIzZDhkN2EwYmIzZjk6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFluKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0V3JpdGVyXzdjOTUzMTQ5YWYyNzNjMjk6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFdyaXRlcigpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0X2ZmNWYxZmIyMjAyMzM0Nzc6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0KGUsdCl9KSxhcmd1bWVudHMpfSxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfY2UyNGQ1OGE1ZjRiZGNjMzpmdW5jdGlvbihlKXtsZXQgdDt0cnl7dD1lIGluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dpbmRvd18yZmE4ZDljMmQ1YjYxMDRhOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXaW5kb3d9Y2F0Y2goZSl7dD0hMX1yZXR1cm4gdH0sX193YmdfaW5zdGFuY2VvZl9Xb3JrZXJHbG9iYWxTY29wZV9hNDMwN2M4NWY3M2Q4M2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19sZW5ndGhfZTZlMTYzM2ZiZWE2Y2ZhOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGh9LF9fd2JnX2xvZ182YTc1YjcxZDYzMTZlOTM1OmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxfX3diZ19uZXdfMWQ5NjY3OGFhYWNjYTMyZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LF9fd2JnX25ld18yMjdkN2MwNTQxNGViODYxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcn0sX193YmdfbmV3XzRhODQzZmUyZWU0MDgyYTk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IEVycm9yKEduKGUsdCkpfSxfX3diZ19uZXdfZnJvbV9zbGljZV8wYmM1OGUzNmY4MmExYjUwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFluKGUsdCkpfSxfX3diZ19uZXdfdHlwZWRfMjVkZGEyMzg4ZDdlNWU5ZjpmdW5jdGlvbihlLHQpe3RyeXt2YXIgbj17YTplLGI6dH07Y29uc3Qgcj1uZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPW4uYTtuLmE9MDt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe2xyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX2pzX3N5c183MGEzNTE1MDU0YzQzYTM3X19fRnVuY3Rpb25fZm5fd2FzbV9iaW5kZ2VuX2U3YTFmZWQzNTM4Yjg2NGJfX19Kc1ZhbHVlX19fX193YXNtX2JpbmRnZW5fZTdhMWZlZDM1MzhiODY0Yl9fX3N5c19fVW5kZWZpbmVkX19fanNfc3lzXzcwYTM1MTUwNTRjNDNhMzdfX19GdW5jdGlvbl9mbl93YXNtX2JpbmRnZW5fZTdhMWZlZDM1MzhiODY0Yl9fX0pzVmFsdWVfX19fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fc3lzX19VbmRlZmluZWRfX19fX19fdHJ1ZV8oZSx0LG4scil9KHIsbi5iLGUsdCl9ZmluYWxseXtuLmE9cn19KSk7cmV0dXJuIHJ9ZmluYWxseXtuLmE9MH19LF9fd2JnX25ld193aXRoX2J5dGVfb2Zmc2V0X2FuZF9sZW5ndGhfYWIxZTEwMDJkN2E2OTRlNDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUsdD4+PjAsbj4+PjApfSxfX3diZ19uZXh0XzFiN2I1YzAwNzk2NjU2MGY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHQoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX25vd19hOWFmNDU1NGVkYjdhYzc4OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19ub3dfZTdjNjc5NWE3ZjgxZTEwZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub3coKX0sX193Ymdfb25PcGVyYXRpb25fZTAxMzExNWE0M2UxZTJhNDpmdW5jdGlvbihlLHQpe2Uub25PcGVyYXRpb24odCl9LF9fd2JnX3BhcnNlX2U1NzAzZmQ1MjIxMWU2ODg6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04ucGFyc2UoR24oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19wZXJmb3JtYW5jZV8zZmNmNmUzMmE3ZTFlZDBhOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBlcmZvcm1hbmNlfSxfX3diZ19wcm90b3R5cGVzZXRjYWxsXzM4NzVkNTRkMTJlZjJlZWM6ZnVuY3Rpb24oZSx0LG4pe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFluKGUsdCksbil9LF9fd2JnX3F1ZXVlTWljcm90YXNrXzg4NjgzNjUxMTRmZTIzYjU6ZnVuY3Rpb24oZSl7cXVldWVNaWNyb3Rhc2soZSl9LF9fd2JnX3F1ZXVlTWljcm90YXNrX2NmYzVhMGU2MmY5ZWJkYmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucXVldWVNaWNyb3Rhc2t9LF9fd2JnX3JlYWRGaWxlXzlmYWE2YjU0ODZlYzc5ZmM6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLnJlYWRGaWxlKEduKHQsbikpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19yZWFkeV81ODU2ZGI2ZjAwZTNlMjBhOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlYWR5fSxfX3diZ19yZWxlYXNlTG9ja185NWJiYzdjZjdiODc5NzdkOmZ1bmN0aW9uKGUpe2UucmVsZWFzZUxvY2soKX0sX193YmdfcmVzb2x2ZV9kODA1OWJjMTEzZTIxNWJmOmZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9LF9fd2JnX3Jlc3BvbmRfMWVjMjkzOTVlZGJlN2ZjZTpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0KXtlLnJlc3BvbmQodD4+PjApfSksYXJndW1lbnRzKX0sX193Ymdfc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtX2FjZmZiNThiN2Y3NGQ2NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgXyxsLHUsZixnLGgsZCxiO3RyeXtfPXQsbD1uLHU9cixmPWksZz1vLGg9cyxkPWEsYj1jO3JldHVybiBlLnNlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbShHbih0LG4pLEduKHIsaSksR24obyxzKSxHbihhLGMpKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShfLGwsMSksbHIuX193YmluZGdlbl9mcmVlKHUsZiwxKSxsci5fX3diaW5kZ2VuX2ZyZWUoZyxoLDEpLGxyLl9fd2JpbmRnZW5fZnJlZShkLGIsMSl9fSksYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF80NjZkNTBmMzUxMjI0NWNiOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuc2V0VGltZW91dCh0LG4pfSksYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF9jMWM5YTE4YjYzNDNlYmQzOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuc2V0VGltZW91dCh0LG4pfSksYXJndW1lbnRzKX0sX193Ymdfc2V0XzI5NWJhZDNiNWVhZDRlOTk6ZnVuY3Rpb24oZSx0LG4pe2Uuc2V0KFluKHQsbikpfSxfX3diZ19zdGFja18zYjBkOTc0YmJmMzFlNDRmOmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1pcih0LnN0YWNrLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cjtIbigpLnNldEludDMyKGUrNCxyLCEwKSxIbigpLnNldEludDMyKGUrMCxuLCEwKX0sX193Ymdfc3RhcnROZXdTZXNzaW9uXzc3OWY1Njk0MjAyMWFhM2Y6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXJ0TmV3U2Vzc2lvbigpfSksYXJndW1lbnRzKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF84ZGZiN2Y1ZTI2ZWJlNTIzOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbD9udWxsOmdsb2JhbDtyZXR1cm4gdHIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzk0MTE1NGVmYzgzOTVjZGQ6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9udWxsOmdsb2JhbFRoaXM7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzU4ZGFjOWFmODIyZjU2MWY6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj9udWxsOnNlbGY7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9XSU5ET1dfZWU2NGYwYjNkODM1NGMwYjpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/bnVsbDp3aW5kb3c7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0cmluZ2lmeV9iNjdlMmM4YzYwYjkzZjY5OmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9KSxhcmd1bWVudHMpfSxfX3diZ190aGVuXzAxNTAzNTJlNGFkMjAzNDQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnRoZW4odCxuKX0sX193YmdfdGhlbl81MTYwNDg2YzY3ZGRiOThhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudGhlbih0KX0sX193YmdfdG9TdHJpbmdfNTUzYjVmNmU5NWUzZTQxYjpmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSxfX3diZ190b1N0cmluZ185ZTczNTNhNzdjYjQxNWEyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9LF9fd2JnX3ZhbHVlX2Q1YjI0OGNlODQxOWJkMWI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWV9LF9fd2JnX3ZpZXdfMzhhOTMwODQ0Yzk2NDEwMzpmdW5jdGlvbihlKXtjb25zdCB0PWUudmlldztyZXR1cm4gdHIodCk/MDpWbih0KX0sX193Ymdfd2Fybl84NmVmMDNkYjhjZmI0ZGQ0OmZ1bmN0aW9uKGUpe2NvbnNvbGUud2FybihlKX0sX193Ymdfd3JpdGVfZmYzYTNkZTQ5MDJhYThiZjpmdW5jdGlvbihlLHQpe3JldHVybiBlLndyaXRlKHQpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMTpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsVG4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMjpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsJG4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMzpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsdm4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNDpmdW5jdGlvbihlLHQpe3JldHVybiBHbihlLHQpfSxfX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlOmZ1bmN0aW9uKCl7Y29uc3QgZT1sci5fX3diaW5kZ2VuX2V4dGVybnJlZnMsdD1lLmdyb3coNCk7ZS5zZXQoMCx2b2lkIDApLGUuc2V0KHQrMCx2b2lkIDApLGUuc2V0KHQrMSxudWxsKSxlLnNldCh0KzIsITApLGUuc2V0KHQrMywhMSl9fTtyZXR1cm57X19wcm90b19fOm51bGwsIi4va2NsX3dhc21fbGliX2JnLmpzIjplfX1mdW5jdGlvbiB2bihlLHQpe2xyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX19fX190cnVlXyhlLHQpfWZ1bmN0aW9uIFRuKGUsdCxuKXtjb25zdCByPWxyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fSnNWYWx1ZV9fY29yZV9lZDcxOGMzZDYwZWJkNTQ2X19fcmVzdWx0X19SZXN1bHRfX19fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fSnNFcnJvcl9fX3RydWVfKGUsdCxuKTtpZihyWzFdKXRocm93IG9yKHJbMF0pfWZ1bmN0aW9uICRuKGUsdCxuKXtjb25zdCByPWxyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX2pzX3N5c183MGEzNTE1MDU0YzQzYTM3X19fSXRlcmF0b3JOZXh0X19jb3JlX2VkNzE4YzNkNjBlYmQ1NDZfX19yZXN1bHRfX1Jlc3VsdF9fX19fd2FzbV9iaW5kZ2VuX2U3YTFmZWQzNTM4Yjg2NGJfX19Kc0Vycm9yX19fdHJ1ZV8oZSx0LG4pO2lmKHJbMV0pdGhyb3cgb3IoclswXSl9U3ltYm9sLmRpc3Bvc2UmJihJbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUluLnByb3RvdHlwZS5mcmVlKTtjb25zdCBMbj1bImJ5dGVzIl0sQW49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX2NvbnRleHRfZnJlZShlPj4+MCwxKSkpLGpuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfZnJlZShlPj4+MCwxKSkpLFJuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ3NpbmtfZnJlZShlPj4+MCwxKSkpLEZuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ3NvdXJjZV9mcmVlKGU+Pj4wLDEpKSksa249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX2xzcHNlcnZlcmNvbmZpZ19mcmVlKGU+Pj4wLDEpKSksem49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3Jlc3BvbnNlY29udGV4dF9mcmVlKGU+Pj4wLDEpKSksQ249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9mcmVlKGU+Pj4wLDEpKSksRG49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3dhc21jaXJjbGVwYXJhbXNfZnJlZShlPj4+MCwxKSkpO2Z1bmN0aW9uIFZuKGUpe2NvbnN0IHQ9bHIuX19leHRlcm5yZWZfdGFibGVfYWxsb2MoKTtyZXR1cm4gbHIuX193YmluZGdlbl9leHRlcm5yZWZzLnNldCh0LGUpLHR9ZnVuY3Rpb24gTW4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGluc3RhbmNlIG9mICR7dC5uYW1lfWApfWNvbnN0IFBuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diaW5kZ2VuX2Rlc3Ryb3lfY2xvc3VyZShlLmEsZS5iKSkpO2Z1bmN0aW9uIEpuKGUpe2NvbnN0IHQ9dHlwZW9mIGU7aWYoIm51bWJlciI9PXR8fCJib29sZWFuIj09dHx8bnVsbD09ZSlyZXR1cm5gJHtlfWA7aWYoInN0cmluZyI9PXQpcmV0dXJuYCIke2V9ImA7aWYoInN5bWJvbCI9PXQpe2NvbnN0IHQ9ZS5kZXNjcmlwdGlvbjtyZXR1cm4gbnVsbD09dD8iU3ltYm9sIjpgU3ltYm9sKCR7dH0pYH1pZigiZnVuY3Rpb24iPT10KXtjb25zdCB0PWUubmFtZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQubGVuZ3RoPjA/YEZ1bmN0aW9uKCR7dH0pYDoiRnVuY3Rpb24ifWlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IG49IlsiO3Q+MCYmKG4rPUpuKGVbMF0pKTtmb3IobGV0IHI9MTtyPHQ7cisrKW4rPSIsICIrSm4oZVtyXSk7cmV0dXJuIG4rPSJdIixufWNvbnN0IG49L1xbb2JqZWN0IChbXlxdXSspXF0vLmV4ZWModG9TdHJpbmcuY2FsbChlKSk7bGV0IHI7aWYoIShuJiZuLmxlbmd0aD4xKSlyZXR1cm4gdG9TdHJpbmcuY2FsbChlKTtpZihyPW5bMV0sIk9iamVjdCI9PXIpdHJ5e3JldHVybiJPYmplY3QoIitKU09OLnN0cmluZ2lmeShlKSsiKSJ9Y2F0Y2goZSl7cmV0dXJuIk9iamVjdCJ9cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9gJHtlLm5hbWV9OiAke2UubWVzc2FnZX1cbiR7ZS5zdGFja31gOnJ9ZnVuY3Rpb24gV24oZSx0KXtlPj4+PTA7Y29uc3Qgbj1IbigpLHI9W107Zm9yKGxldCBpPWU7aTxlKzQqdDtpKz00KXIucHVzaChsci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuZ2V0KG4uZ2V0VWludDMyKGksITApKSk7cmV0dXJuIGxyLl9fZXh0ZXJucmVmX2Ryb3Bfc2xpY2UoZSx0KSxyfWZ1bmN0aW9uIFluKGUsdCl7cmV0dXJuIGU+Pj49MCxRbigpLnN1YmFycmF5KGUvMSxlLzErdCl9bGV0IHFuPW51bGw7ZnVuY3Rpb24gSG4oKXtyZXR1cm4obnVsbD09PXFufHwhMD09PXFuLmJ1ZmZlci5kZXRhY2hlZHx8dm9pZCAwPT09cW4uYnVmZmVyLmRldGFjaGVkJiZxbi5idWZmZXIhPT1sci5tZW1vcnkuYnVmZmVyKSYmKHFuPW5ldyBEYXRhVmlldyhsci5tZW1vcnkuYnVmZmVyKSkscW59bGV0IEtuPW51bGw7ZnVuY3Rpb24gWm4oKXtyZXR1cm4gbnVsbCE9PUtuJiYwIT09S24uYnl0ZUxlbmd0aHx8KEtuPW5ldyBGbG9hdDY0QXJyYXkobHIubWVtb3J5LmJ1ZmZlcikpLEtufWZ1bmN0aW9uIEduKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Y3IrPXQsY3I+PWFyJiYoc3I9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pLHNyLmRlY29kZSgpLGNyPXQpO3JldHVybiBzci5kZWNvZGUoUW4oKS5zdWJhcnJheShlLGUrdCkpfShlPj4+PTAsdCl9bGV0IFhuPW51bGw7ZnVuY3Rpb24gUW4oKXtyZXR1cm4gbnVsbCE9PVhuJiYwIT09WG4uYnl0ZUxlbmd0aHx8KFhuPW5ldyBVaW50OEFycmF5KGxyLm1lbW9yeS5idWZmZXIpKSxYbn1mdW5jdGlvbiBlcihlLHQpe3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLHQpfWNhdGNoKGUpe2NvbnN0IHQ9Vm4oZSk7bHIuX193YmluZGdlbl9leG5fc3RvcmUodCl9fWZ1bmN0aW9uIHRyKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG5yKGUsdCxuKXtjb25zdCByPXthOmUsYjp0LGNudDoxfSxpPSguLi5lKT0+e3IuY250Kys7Y29uc3QgdD1yLmE7ci5hPTA7dHJ5e3JldHVybiBuKHQsci5iLC4uLmUpfWZpbmFsbHl7ci5hPXQsaS5fd2JnX2NiX3VucmVmKCl9fTtyZXR1cm4gaS5fd2JnX2NiX3VucmVmPSgpPT57MD09LS1yLmNudCYmKGxyLl9fd2JpbmRnZW5fZGVzdHJveV9jbG9zdXJlKHIuYSxyLmIpLHIuYT0wLFBuLnVucmVnaXN0ZXIocikpfSxQbi5yZWdpc3RlcihpLHIsciksaX1mdW5jdGlvbiBycihlLHQpe2NvbnN0IG49dCg4KmUubGVuZ3RoLDgpPj4+MDtyZXR1cm4gWm4oKS5zZXQoZSxuLzgpLHVyPWUubGVuZ3RoLG59ZnVuY3Rpb24gaXIoZSx0LG4pe2lmKHZvaWQgMD09PW4pe2NvbnN0IG49X3IuZW5jb2RlKGUpLHI9dChuLmxlbmd0aCwxKT4+PjA7cmV0dXJuIFFuKCkuc3ViYXJyYXkocixyK24ubGVuZ3RoKS5zZXQobiksdXI9bi5sZW5ndGgscn1sZXQgcj1lLmxlbmd0aCxpPXQociwxKT4+PjA7Y29uc3Qgbz1RbigpO2xldCBzPTA7Zm9yKDtzPHI7cysrKXtjb25zdCB0PWUuY2hhckNvZGVBdChzKTtpZih0PjEyNylicmVhaztvW2krc109dH1pZihzIT09cil7MCE9PXMmJihlPWUuc2xpY2UocykpLGk9bihpLHIscj1zKzMqZS5sZW5ndGgsMSk+Pj4wO2NvbnN0IHQ9UW4oKS5zdWJhcnJheShpK3MsaStyKTtzKz1fci5lbmNvZGVJbnRvKGUsdCkud3JpdHRlbixpPW4oaSxyLHMsMSk+Pj4wfXJldHVybiB1cj1zLGl9ZnVuY3Rpb24gb3IoZSl7Y29uc3QgdD1sci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuZ2V0KGUpO3JldHVybiBsci5fX2V4dGVybnJlZl90YWJsZV9kZWFsbG9jKGUpLHR9bGV0IHNyPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KTtzci5kZWNvZGUoKTtjb25zdCBhcj0yMTQ2NDM1MDcyO2xldCBjcj0wO2NvbnN0IF9yPW5ldyBUZXh0RW5jb2RlcjsiZW5jb2RlSW50byJpbiBfcnx8KF9yLmVuY29kZUludG89ZnVuY3Rpb24oZSx0KXtjb25zdCBuPV9yLmVuY29kZShlKTtyZXR1cm4gdC5zZXQobikse3JlYWQ6ZS5sZW5ndGgsd3JpdHRlbjpuLmxlbmd0aH19KTtsZXQgbHIsdXI9MDtmdW5jdGlvbiBmcihlLHQpe3JldHVybiBscj1lLmV4cG9ydHMscW49bnVsbCxLbj1udWxsLFhuPW51bGwsbHIuX193YmluZGdlbl9zdGFydCgpLGxyfWFzeW5jIGZ1bmN0aW9uIGdyKGUpe2lmKHZvaWQgMCE9PWxyKXJldHVybiBscjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZV9vcl9wYXRoOmV9PWUpOmNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb247IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKSksdm9pZCAwPT09ZSYmKGU9bmV3IFVSTCgia2NsX3dhc21fbGliX2JnLndhc20iLGRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJiJTQ1JJUFQiPT09ZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfHxuZXcgVVJMKCJ3b3JrZXItZW5naW5lLmpzIixkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSk7Y29uc3QgdD1ObigpOygic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBSZXF1ZXN0JiZlIGluc3RhbmNlb2YgUmVxdWVzdHx8ImZ1bmN0aW9uIj09dHlwZW9mIFVSTCYmZSBpbnN0YW5jZW9mIFVSTCkmJihlPWZldGNoKGUpKTtjb25zdHtpbnN0YW5jZTpuLG1vZHVsZTpyfT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmZSBpbnN0YW5jZW9mIFJlc3BvbnNlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcpdHJ5e3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhlLHQpfWNhdGNoKHQpe2lmKCFlLm9rfHwhZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiYmFzaWMiOmNhc2UiY29ycyI6Y2FzZSJkZWZhdWx0IjpyZXR1cm4hMH1yZXR1cm4hMX0oZS50eXBlKXx8ImFwcGxpY2F0aW9uL3dhc20iPT09ZS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIikpdGhyb3cgdDtjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLHQpfWNvbnN0IG49YXdhaXQgZS5hcnJheUJ1ZmZlcigpO3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShuLHQpfXtjb25zdCBuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCk7cmV0dXJuIG4gaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2U6bixtb2R1bGU6ZX06bn19KGF3YWl0IGUsdCk7cmV0dXJuIGZyKG4pfXZhciBocj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxDb250ZXh0OnluLEludG9VbmRlcmx5aW5nQnl0ZVNvdXJjZTptbixJbnRvVW5kZXJseWluZ1Npbms6U24sSW50b1VuZGVybHlpbmdTb3VyY2U6eG4sTHNwU2VydmVyQ29uZmlnOkJuLFJlc3BvbnNlQ29udGV4dDpVbixUYW5nZW50aWFsQXJjSW5mb091dHB1dFdhc206RW4sV2FzbUNpcmNsZVBhcmFtczpJbixiYXNlNjRfZGVjb2RlOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5iYXNlNjRfZGVjb2RlKHQsbik7aWYoclszXSl0aHJvdyBvcihyWzJdKTt2YXIgaT1ZbihyWzBdLHJbMV0pLnNsaWNlKCk7cmV0dXJuIGxyLl9fd2JpbmRnZW5fZnJlZShyWzBdLDEqclsxXSwxKSxpfSxjYWxjdWxhdGVfY2lyY2xlX2Zyb21fM19wb2ludHM6ZnVuY3Rpb24oZSx0LG4scixpLG8pe2NvbnN0IHM9bHIuY2FsY3VsYXRlX2NpcmNsZV9mcm9tXzNfcG9pbnRzKGUsdCxuLHIsaSxvKTtyZXR1cm4gSW4uX193cmFwKHMpfSxjaGFuZ2VfZGVmYXVsdF91bml0czpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz11cixsPWxyLmNoYW5nZV9kZWZhdWx0X3VuaXRzKHMsYSxjLF8pO3ZhciBpPWxbMF0sbz1sWzFdO2lmKGxbM10pdGhyb3cgaT0wLG89MCxvcihsWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGNoYW5nZV9leHBlcmltZW50YWxfZmVhdHVyZXM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1sci5jaGFuZ2VfZXhwZXJpbWVudGFsX2ZlYXR1cmVzKHMsYSxjLF8pO3ZhciBpPWxbMF0sbz1sWzFdO2lmKGxbM10pdGhyb3cgaT0wLG89MCxvcihsWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGNoYW5nZV9rY2xfdmVyc2lvbjpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz11cixsPWxyLmNoYW5nZV9rY2xfdmVyc2lvbihzLGEsYyxfKTt2YXIgaT1sWzBdLG89bFsxXTtpZihsWzNdKXRocm93IGk9MCxvPTAsb3IobFsyXSk7cmV0dXJuIG49aSxyPW8sR24oaSxvKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxkZWZhdWx0X2FwcF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9bHIuZGVmYXVsdF9hcHBfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IG9yKGVbMV0pO3JldHVybiBvcihlWzBdKX0sZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKCl7Y29uc3QgZT1sci5kZWZhdWx0X3Byb2plY3Rfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IG9yKGVbMV0pO3JldHVybiBvcihlWzBdKX0sZm9ybWF0X251bWJlcl9saXRlcmFsOmZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtjb25zdCBhPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89bHIuZm9ybWF0X251bWJlcl9saXRlcmFsKGUsYSxjLHRyKG4pPzQyOTQ5NjcyOTc6bj4+PjApO3ZhciBvPV9bMF0scz1fWzFdO2lmKF9bM10pdGhyb3cgbz0wLHM9MCxvcihfWzJdKTtyZXR1cm4gcj1vLGk9cyxHbihvLHMpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19LGZvcm1hdF9udW1iZXJfdmFsdWU6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9bHIuZm9ybWF0X251bWJlcl92YWx1ZShlLHMsYSk7dmFyIGk9Y1swXSxvPWNbMV07aWYoY1szXSl0aHJvdyBpPTAsbz0wLG9yKGNbMl0pO3JldHVybiBuPWkscj1vLEduKGksbyl9ZmluYWxseXtsci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZ2V0X2tjbF92ZXJzaW9uOmZ1bmN0aW9uKCl7bGV0IGUsdDt0cnl7Y29uc3Qgbj1sci5nZXRfa2NsX3ZlcnNpb24oKTtyZXR1cm4gZT1uWzBdLHQ9blsxXSxHbihuWzBdLG5bMV0pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKGUsdCwxKX19LGdldF90YW5nZW50aWFsX2FyY190b19pbmZvOmZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9bHIuZ2V0X3RhbmdlbnRpYWxfYXJjX3RvX2luZm8oZSx0LG4scixpLG8scyk7cmV0dXJuIEVuLl9fd3JhcChhKX0saHVtYW5fZGlzcGxheV9udW1iZXI6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9bHIuaHVtYW5fZGlzcGxheV9udW1iZXIoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxvcihjWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGltcG9ydF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPWxyLmltcG9ydF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IG9yKGVbMl0pO3ZhciB0PVduKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gbHIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LGlzX2tjbF9lbXB0eV9vcl9vbmx5X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5pc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxpc19wb2ludHNfY2N3OmZ1bmN0aW9uKGUpe2NvbnN0IHQ9cnIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyksbj11cjtyZXR1cm4gbHIuaXNfcG9pbnRzX2Njdyh0LG4pfSxrY2xfbGFuZ3VhZ2VfdmVyc2lvbjpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIua2NsX2xhbmd1YWdlX3ZlcnNpb24odCxuKTtpZihyWzJdKXRocm93IG9yKHJbMV0pO3JldHVybiBvcihyWzBdKX0sa2NsX2xpbnQ6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyO3JldHVybiBsci5rY2xfbGludChuLHIsdCl9LGtjbF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIua2NsX3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBvcihyWzFdKTtyZXR1cm4gb3IoclswXSl9LGxzcF9ydW5fY29waWxvdDpmdW5jdGlvbihlLHQsbil7TW4oZSxCbik7dmFyIHI9ZS5fX2Rlc3Ryb3lfaW50b19yYXcoKTtjb25zdCBpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXI7cmV0dXJuIGxyLmxzcF9ydW5fY29waWxvdChyLGksbyxzLGEpfSxsc3BfcnVuX2tjbDpmdW5jdGlvbihlLHQsbil7TW4oZSxCbik7dmFyIHI9ZS5fX2Rlc3Ryb3lfaW50b19yYXcoKTtjb25zdCBpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXI7cmV0dXJuIGxyLmxzcF9ydW5fa2NsKHIsaSxvLHMsYSl9LG5vZGVfcGF0aF9mcm9tX3JhbmdlOmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cixpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5ub2RlX3BhdGhfZnJvbV9yYW5nZShuLHIsaSxvKX0scGFyc2VfYXBwX3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5wYXJzZV9hcHBfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IG9yKHJbMV0pO3JldHVybiBvcihyWzBdKX0scGFyc2VfcHJvamVjdF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIucGFyc2VfcHJvamVjdF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxwYXJzZV93YXNtOk9uLHBvaW50X3RvX3VuaXQ6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89bHIucG9pbnRfdG9fdW5pdChyLGksbyxzLGEsYyk7aWYoX1szXSl0aHJvdyBvcihfWzJdKTt2YXIgbCx1LGY9KGw9X1swXSx1PV9bMV0sbD4+Pj0wLFpuKCkuc3ViYXJyYXkobC84LGwvOCt1KSkuc2xpY2UoKTtyZXR1cm4gbHIuX193YmluZGdlbl9mcmVlKF9bMF0sOCpfWzFdLDgpLGZ9LHJlY2FzdF93YXNtOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5yZWNhc3Rfd2FzbSh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxyZWxldmFudF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPWxyLnJlbGV2YW50X2ZpbGVfZXh0ZW5zaW9ucygpO2lmKGVbM10pdGhyb3cgb3IoZVsyXSk7dmFyIHQ9V24oZVswXSxlWzFdKS5zbGljZSgpO3JldHVybiBsci5fX3diaW5kZ2VuX2ZyZWUoZVswXSw0KmVbMV0sNCksdH0sc2VyaWFsaXplX2NvbmZpZ3VyYXRpb246ZnVuY3Rpb24oZSl7Y29uc3QgdD1sci5zZXJpYWxpemVfY29uZmlndXJhdGlvbihlKTtpZih0WzJdKXRocm93IG9yKHRbMV0pO3JldHVybiBvcih0WzBdKX0sc2VyaWFsaXplX3Byb2plY3RfY29uZmlndXJhdGlvbjpmdW5jdGlvbihlKXtjb25zdCB0PWxyLnNlcmlhbGl6ZV9wcm9qZWN0X2NvbmZpZ3VyYXRpb24oZSk7aWYodFsyXSl0aHJvdyBvcih0WzFdKTtyZXR1cm4gb3IodFswXSl9LHNldF9rY2xfcnVudGltZV9mbGFnczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIuc2V0X2tjbF9ydW50aW1lX2ZsYWdzKHQsbik7aWYoclsxXSl0aHJvdyBvcihyWzBdKX0sc2tldGNoX2NoZWNrcG9pbnRfbGltaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbHIuc2tldGNoX2NoZWNrcG9pbnRfbGltaXQoKT4+PjB9LGluaXRTeW5jOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWxyKXJldHVybiBscjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZTplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IHQ9Tm4oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZXx8KGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShlKSksZnIobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKGUsdCkpfSxkZWZhdWx0OmdyfSk7bGV0IGRyLGJyPUpTT04uc3RyaW5naWZ5KHtzZXR0aW5nczp7bW9kZWxpbmc6e2VuYWJsZV9zc2FvOiExfX19KTtmdW5jdGlvbiB3cihlKXtyZXR1cm4gZHI/LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmKGRyLnNlbmQoZSksITApfWNvbnN0IHByPXtmaXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7fSxhc3luYyBzZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7aWYocG9zdE1lc3NhZ2Uoe3RvOiJ3ZWJzb2NrZXQiLHBheWxvYWQ6e3R5cGU6InNlbmQiLGRhdGE6bn19KSx3cihuKSlyZXR1cm4gbmV3IFByb21pc2UoKHQ9Pntjb25zdCBuPXI9PntpZihyLmRhdGEuaW5kZXhPZihlKTwwKXJldHVybjtjb25zdCBpPShvPUpTT04ucGFyc2Uoci5kYXRhKSxuZXcgbChzKS5lbmNvZGVTaGFyZWRSZWYobykpO3ZhciBvLHM7dChpKSxkci5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX07ZHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9KSl9LGFzeW5jIHN0YXJ0TmV3U2Vzc2lvbigpe319O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50byl7Y2FzZSJ3b3JrZXIiOnJldHVybiB2b2lkKCJzdGFydCI9PT10LnBheWxvYWQudHlwZSYmKGFzeW5jIGU9Pnthd2FpdCBmZXRjaChuZXcgVVJMKCIva2NsX3dhc21fbGliX2JnLndhc20iLGxvY2F0aW9uLm9yaWdpbikpLnRoZW4oKGU9PmUuYXJyYXlCdWZmZXIoKSkpLnRoZW4oKGU9PmdyKHttb2R1bGVfb3JfcGF0aDplfSkpKSxicj1KU09OLnN0cmluZ2lmeSh7c2V0dGluZ3M6e21vZGVsaW5nOntlbmFibGVfc3NhbzplLmVuYWJsZV9zc2FvPz8hMX19fSksZHI9bmV3IFdlYlNvY2tldChwbi51cmxDb25zdHJ1Y3RGcm9tKHt3ZWJydGM6ZS53ZWJydGM/PyEwLC4uLmV9KSksZHIuYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgoKT0+e3BuLmF1dGhlbnRpY2F0ZSh7Y2xpZW50OmUuY2xpZW50fSxkcil9KSx7b25jZTohMH0pLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToibWVzc2FnZSIsZGF0YTplLmRhdGF9fSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57ZHIucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiZkci5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwaW5nIn0pKX0pLDRlMyl9KSh0LnBheWxvYWQuZGF0YVswXSkpO2Nhc2Uid2Vic29ja2V0IjppZigic2VuZCI9PT10LnBheWxvYWQudHlwZSl7Y29uc3RbZV09dC5wYXlsb2FkLmRhdGE7cmV0dXJuIHZvaWQoKCJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpJiZ3cihlKSl9cmV0dXJuIHZvaWQgZHI/Llt0LnBheWxvYWQudHlwZV0oLi4udC5wYXlsb2FkLmRhdGEpO2Nhc2Uid2FzbSI6cmV0dXJuIHZvaWQoImV4ZWN1dGUiPT09dC5wYXlsb2FkLnR5cGU/KChlLHQ9e21haW5LY2xQYXRoTmFtZToibWFpbi5rY2wifSk9Pntjb25zdCBuPSJzdHJpbmciPT10eXBlb2YgZT8oaT1lLHtyZWFkRmlsZTphc3luYyBlPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoaSksZXhpc3RzOmFzeW5jIGU9PiExLGdldEFsbEZpbGVzOmFzeW5jIGU9PltpXX0pOihyPWUse2FzeW5jIHJlYWRGaWxlKGUpe2NvbnN0IHQ9ci5nZXQoZSk/PyIiO3JldHVybihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX0sZXhpc3RzOmFzeW5jIGU9PnIuaGFzKGUpLGdldEFsbEZpbGVzOmFzeW5jIGU9PkFycmF5LmZyb20oci52YWx1ZXMoKSl9KTt2YXIgcixpO2NvbnN0IG89InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5nZXQodC5tYWluS2NsUGF0aE5hbWUpLHM9bmV3IHluKHByLG4pLGE9T24obylbMF07cmV0dXJuIHMuZXhlY3V0ZShKU09OLnN0cmluZ2lmeShhKSx0Lm1haW5LY2xQYXRoTmFtZSxicil9KSh0LnBheWxvYWQuZGF0YVswXSx0LnBheWxvYWQuZGF0YVsxXSkudGhlbigoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3YXNtIixwYXlsb2FkOnt0eXBlOiJleGVjdXRlIixkYXRhOmV9fSl9KSkuY2F0Y2goKGU9Pntwb3N0TWVzc2FnZSh7ZnJvbToid2FzbSIscGF5bG9hZDp7dHlwZToiZXhlY3V0ZSIsZGF0YTplfX0pfSkpOnBvc3RNZXNzYWdlKGhyW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSkpKX19KSl9KCk7Cgo=",null,!1);const An=(t,e)=>{let n;return{fn:(...t)=>{n=t},intervalId:setInterval((()=>{if(void 0===n)return;const e=n;n=void 0,window.requestAnimationFrame((()=>{t(...e)}))}),e)}};var $n=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}($n||{}),qn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(qn||{});const ti={[$n.DOWN]:"camera_drag_start",[$n.UP]:"camera_drag_end"},ei={[qn.MIDDLE]:"pan",[qn.RIGHT]:"rotatetrackball"};class ni extends EventTarget{removeMouseEvents=()=>{};removeResizeObserver=()=>{};constructor(t){super(),this.zooClientArgs={...t,enable_ssao:t.enable_ssao??!0},this.workerEngine=new Dn,this.rtcPeerConnection=new RTCPeerConnection({bundlePolicy:"max-bundle"}),this.rtcPeerConnection.addTransceiver("video",{direction:"recvonly"}),this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"),this.ice(),this.rtcPeerConnection.addEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.addEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.addEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this))}deconstructor(){this.removeMouseEvents(),this.removeResizeObserver(),this.deice(),this.rtcPeerConnection.removeEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.removeEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.removeEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this)),this.workerEngine.terminate(),this.rtcPeerConnection.close()}async start(){const e=t=>{const n=t.data;"from"in n&&"websocket"===n.from&&"payload"in n&&"object"==typeof n.payload&&"data"in n.payload&&"string"==typeof n.payload.data&&n.payload.data.indexOf("auth_token_invalid")>=0&&(this.workerEngine.removeEventListener("message",e),this.zooClientArgs.client.oauth2.fetchAuthorizationCode())},n=()=>{var t;this.workerEngine.addEventListener("message",e),this.workerEngine.postMessage({to:"worker",payload:{type:"start",data:[(t=this.zooClientArgs,JSON.parse(JSON.stringify(t)))]}})};this.zooClientArgs.client.token?n():this.zooClientArgs.client.oauth2.getAccessToken().then((t=>{t?.token?.value&&(this.zooClientArgs.client.token=t?.token?.value),void 0===this.zooClientArgs.client.token&&(this.zooClientArgs.client.token="00000000-0000-0000-0000-000000000000"),n()})).catch((e=>{"object"==typeof e&&"kind"in e&&[t.EErrorOAuth2.ErrorNoAuthCode,t.EErrorOAuth2.ErrorAccessTokenResponse].some((t=>t===e.kind))&&this.zooClientArgs.client.oauth2.fetchAuthorizationCode()}))}wasm(t,...e){return new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&(this.workerEngine.removeEventListener("message",i),n(e.payload.data))};this.workerEngine.addEventListener("message",i),this.workerEngine.postMessage({to:"wasm",payload:{type:t,data:e??[]}})}))}executor(){return{addEventListener:this.workerEngine.addEventListener.bind(this.workerEngine,"message"),removeEventListener:this.workerEngine.removeEventListener.bind(this.workerEngine,"message"),submit:(t,e={mainKclPathName:"main.kcl"})=>new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&"execute"===e.payload.type&&(this.workerEngine.removeEventListener("message",i),n(e.payload.data))};this.workerEngine.addEventListener("message",i),this.workerEngine.postMessage({to:"wasm",payload:{type:"execute",data:[t,e]}})}))}}webRTCOnConnectionStateChange(){if("disconnected"===this.rtcPeerConnection.connectionState)this.dispatchEvent(new Event("close"))}webRTCOnTrack(t){this.track=t,this.dispatchEvent(new Event("track"))}webRTCOnDataChannel(t){this.channel=t.channel,this.dispatchEvent(new Event("datachannel")),this.dispatchEvent(new Event("connected"))}async iceOnIceServerInfo(t){if(0==t.data.ice_servers.length)return;this.rtcPeerConnection.setConfiguration({bundlePolicy:"max-bundle",iceServers:t.data.ice_servers,iceTransportPolicy:"relay"});const e=await this.rtcPeerConnection.createOffer();await this.rtcPeerConnection.setLocalDescription(e),this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"sdp_offer",offer:e})]}})}async iceOnSdpAnswer(t){await this.rtcPeerConnection.setRemoteDescription(t.data.answer)}async iceOnTrickleIce(t){await this.rtcPeerConnection.addIceCandidate(t.data.candidate)}iceOnIceCandidate(t){null!==t.candidate&&this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"trickle_ice",candidate:{candidate:t.candidate.candidate,sdpMid:t.candidate.sdpMid||void 0,sdpMLineIndex:t.candidate.sdpMLineIndex||void 0,usernameFragment:t.candidate.usernameFragment||void 0}})]}})}iceOnMessage(t){const e=Sn.parseMessage(t);if("resp"in e)switch(e.resp.type){case"ice_server_info":this.iceOnIceServerInfo(e.resp);break;case"sdp_answer":this.iceOnSdpAnswer(e.resp);break;case"trickle_ice":this.iceOnTrickleIce(e.resp)}}workerEngineOnMessage(t){const e=t.data;"from"in e&&"websocket"===e.from&&"message"===e.payload.type&&this.iceOnMessage(e.payload)}ice(){this.workerEngine.addEventListener("message",this.workerEngineOnMessage.bind(this)),this.rtcPeerConnection.addEventListener("icecandidate",this.iceOnIceCandidate.bind(this))}deice(){this.workerEngine.removeEventListener("message",this.workerEngineOnMessage.bind(this)),this.rtcPeerConnection.removeEventListener("icecandidate",this.iceOnIceCandidate)}addMouseEvents(t){let e,n=$n.UP;const i=t=>i=>{const l=ei[i.button];if(void 0===l)return;const o={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:ti[t],interaction:l,window:{x:i.offsetX,y:i.offsetY}}})]};this.workerEngine.postMessage({to:"websocket",payload:o}),this.channel?.send(o.data[0]),e=i.button,n=t},l=i($n.DOWN),o=i($n.UP),c=t=>{const i=ei[e];if(void 0===i)return;n=$n.UP;const l={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:ti[n],interaction:i,window:{x:t.offsetX,y:t.offsetY}}})]};this.workerEngine.postMessage({to:"websocket",payload:l}),this.channel?.send(l.data[0])};let s=0;const a=An((t=>{n===$n.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:ei[e],window:{x:t.offsetX,y:t.offsetY}}})),s+=1,this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"mouse_move",sequence:s,window:{x:t.offsetX,y:t.offsetY}}}))}),1e3/30),d=An((t=>{t.preventDefault(),this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"default_camera_zoom",magnitude:-1*Math.sign(t.deltaY)*window.devicePixelRatio*50}}))}),1e3/30),b=e=>{this.channel=e.channel,t.addEventListener("pointerdown",l),t.addEventListener("pointermove",a.fn),t.addEventListener("pointerup",o),t.addEventListener("pointerleave",c),t.addEventListener("wheel",d.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",b),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",b),t.removeEventListener("pointerdown",l),t.removeEventListener("pointermove",a.fn),clearInterval(a.intervalId),t.removeEventListener("pointerup",o),t.removeEventListener("pointerleave",c),t.removeEventListener("wheel",d.fn),clearInterval(d.intervalId)}}resize(t){window.requestAnimationFrame((()=>{this.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"reconfigure_stream",...t,fps:30}}))}))}addResizeObserver(t){const e=t.querySelector("video"),n=An((t=>{for(const n of t){const t=n.contentRect.width-n.contentRect.width%4,i=n.contentRect.height-n.contentRect.height%4;e.width=t,e.height=i,this.resize({width:t,height:i})}}),62.5),i=new ResizeObserver(n.fn);i.observe(t),this.removeResizeObserver=()=>{clearInterval(n.intervalId),i.disconnect()}}send(...t){return new Promise((e=>{const n=t=>{const i=t.data;"from"in i&&"websocket"===i.from&&(this.workerEngine.removeEventListener("message",n),e(i.payload.data))};this.workerEngine.addEventListener("message",n),this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:t}})}))}}const ii={get_api_call:async function({client:t,id:e}){const i=`/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_org:async function({client:t,id:e}){const i=`/org/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_user:async function({client:t,id:e}){const i=`/user/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_async_operation:async function({client:t,id:e}){const i=`/async/operations/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_calls_for_user:a,list_api_calls_for_user_pager:function(t){return s(a,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return s(d,t,"page_token")},user_list_api_calls:b,user_list_api_calls_pager:function(t){return s(b,t,"page_token")}},li={create_api_token_for_user:async function({client:t,label:e}){const i="/user/api-tokens"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_tokens_for_user:r,list_api_tokens_for_user_pager:function(t){return s(r,t,"page_token")}},oi={create_executor_term:class{constructor(){}static urlConstructFrom(t){const e="/ws/executor/term"+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},create_file_execution:async function({client:t,lang:e,output:i,body:l}){const c=`/file/execute/${e}`+n({output:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},ci={create_user_factory_job:async function({client:t,files:e}){const i="/user/factory/jobs"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,r=await b(l,d);return await o(r),await r.json()},get_org_factory_job:async function({client:t,job_id:e}){const i=`/org/factory/jobs/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_factory_finishes:Vn,get_user_factory_finishes_pager:function(t){return s(Vn,t,"page_token")},get_user_factory_job:async function({client:t,job_id:e}){const i=`/user/factory/jobs/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_factory_materials:Wn,get_user_factory_materials_pager:function(t){return s(Wn,t,"page_token")},list_org_factory_jobs:fn,list_org_factory_jobs_pager:function(t){return s(fn,t,"page_token")},list_user_factory_jobs:gn,list_user_factory_jobs_pager:function(t){return s(gn,t,"page_token")}},si={create_file_bounding_box:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/bounding-box"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_center_of_mass:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/center-of-mass"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_conversion:async function({client:t,src_format:e,output_format:i,body:l}){const c=`/file/conversion/${e}/${i}`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_conversion_options:async function({client:t,files:e,body:i}){const l="/file/conversion"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("body",new Blob([JSON.stringify(i)],{type:"application/json"}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},create_file_density:async function({client:t,src_format:e,material_mass:i,material_mass_unit:l,output_unit:c,body:s}){const a="/file/density"+n({src_format:e,material_mass:i,material_mass_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`),r["Content-Type"]="application/octet-stream";const Z={method:"POST",headers:r,body:s},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},create_file_mass:async function({client:t,src_format:e,material_density:i,material_density_unit:l,output_unit:c,body:s}){const a="/file/mass"+n({src_format:e,material_density:i,material_density_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`),r["Content-Type"]="application/octet-stream";const Z={method:"POST",headers:r,body:s},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},create_file_surface_area:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/surface-area"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_volume:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/volume"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},ai={community_sso:async function({client:t,sso:e,sig:i}){const l="/community/sso"+n({sso:e,sig:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_announcements:async function({client:t}={}){const e="/announcements"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_ipinfo:async function({client:t}={}){const e="/_meta/ipinfo"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_pricing_subscriptions:async function({client:t}={}){const e="/pricing/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_schema:async function({client:t}={}){const e="/"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},ping:async function({client:t}={}){const e="/ping"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}},di={create_custom_model:async function({client:t,body:e}){const i="/ml/custom/models"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_kcl_code_completions:async function({client:t,body:e}){const i="/ml/kcl/completions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_proprietary_to_kcl:async function({client:t,files:e,code_option:i}){const l="/ml/convert/proprietary-to-kcl"+n({code_option:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},create_text_to_cad_part_feedback:async function({client:t,id:e,feedback:i}){const l=`/user/text-to-cad/${e}`+n({feedback:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},get_custom_model:async function({client:t,id:e}){const i=`/ml/custom/models/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_text_to_cad_part_for_user:async function({client:t,id:e}){const i=`/user/text-to-cad/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},kcl_migration_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/kcl-migration"+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},list_conversations_for_user:In,list_conversations_for_user_pager:function(t){return s(In,t,"page_token")},list_text_to_cad_parts_for_user:Yn,list_text_to_cad_parts_for_user_pager:function(t){return s(Yn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/copilot"+n({replay:t.replay,conversation_id:t.conversation_id,replay_attachment_mode:t.replay_attachment_mode,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},ml_reasoning_ws:class{constructor(){}static urlConstructFrom(t){const e=`/ws/ml/reasoning/${t.id}`+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},update_custom_model:async function({client:t,id:e,body:i}){const l=`/ml/custom/models/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()}},bi={modeling_commands_ws:Sn},ri={approve_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/approve`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_oauth2_app:async function({client:t,body:e}){const i="/org/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_user_oauth2_app:async function({client:t,body:e}){const i="/user/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},deny_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/deny`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},device_access_token:async function({client:t,body:e}){const l="/oauth2/device/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},device_auth_confirm:async function({client:t,body:e}){const i="/oauth2/device/confirm"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},device_auth_request:async function({client:t,body:e}){const l="/oauth2/device/auth"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},device_auth_verify:async function({client:t,user_code:e,app_name:i}){const l="/oauth2/device/verify"+n({user_code:e,app_name:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_org_oauth2_apps:Jn,list_org_oauth2_apps_pager:function(t){return s(Jn,t,"page_token")},list_user_oauth2_apps:Rn,list_user_oauth2_apps_pager:function(t){return s(Rn,t,"page_token")},oauth2_authorize:async function({client:t,response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}){const b="/oauth2/authorize"+n({response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);return await o(p),await p.json()},oauth2_provider_callback:async function({client:t,provider:e,code:i,state:l,id_token:c,user:s}){const a=`/oauth2/provider/${e}/callback`+n({code:i,state:l,id_token:c,user:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`);const Z={method:"GET",headers:r},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},oauth2_provider_callback_post:async function({client:t,provider:e,body:l}){const c=`/oauth2/provider/${e}/callback`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/x-www-form-urlencoded";const b={method:"POST",headers:d,body:i(l)},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},oauth2_provider_consent:async function({client:t,provider:e,callback_url:i}){const l=`/oauth2/provider/${e}/consent`+n({callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},oauth2_token:async function({client:t,body:e}){const l="/oauth2/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},oauth2_token_revoke:async function({client:t,body:e}){const l="/oauth2/token/revoke"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/org/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_user_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/user/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},verify_oauth_account_linking:async function({client:t,token:e,callback_url:i}){const l="/oauth2/verify-account-linking"+n({token:e,callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()}},Zi={create_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_dataset:async function({client:t,body:e}){const i="/org/datasets"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_member:async function({client:t,body:e}){const i="/org/members"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},download_org_dataset_conversion_original:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/original`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:e}){const i=`/org/datasets/${e}/bulk-download/kcl`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_org_dataset_conversion_stats:async function({client:t,id:e}){const i=`/org/datasets/${e}/stats`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_privacy_settings:async function({client:t}={}){const e="/org/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_shortlinks:xn,get_org_shortlinks_pager:function(t){return s(xn,t,"page_token")},get_user_org:async function({client:t}={}){const e="/user/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_org_dataset_conversions:Kn,list_org_dataset_conversions_pager:function(t){return s(Kn,t,"page_token")},list_org_datasets:Ln,list_org_datasets_pager:function(t){return s(Ln,t,"page_token")},list_org_members:Tn,list_org_members_pager:function(t){return s(Tn,t,"page_token")},list_org_skills:Un,list_org_skills_pager:function(t){return s(Un,t,"page_token")},org_dataset_s3_policies:async function({client:t,uri:e,role_arn:i}){const l="/org/dataset/s3/policies"+n({uri:e,role_arn:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},retrigger_org_dataset:async function({client:t,id:e,statuses:i}){const l=`/org/datasets/${e}/retrigger`+n({statuses:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},retrigger_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/retrigger`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},search_org_dataset_conversions:Nn,search_org_dataset_conversions_pager:function(t){return s(Nn,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:e,q:i,limit:l}){const c=`/org/datasets/${e}/search/semantic`+n({q:i,limit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},update_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_dataset:async function({client:t,id:e,body:i}){const l=`/org/datasets/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_member:async function({client:t,user_id:e,body:i}){const l=`/org/members/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_privacy_settings:async function({client:t,body:e}){const i="/org/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},upload_org_dataset_files:async function({client:t,files:e,id:i}){const l=`/org/datasets/${i}/uploads`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()}},mi={create_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_intent_for_org:async function({client:t}={}){const e="/org/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_payment_intent_for_user:async function({client:t}={}){const e="/user/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_method_for_org:async function({client:t,id:e}){const i=`/org/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_org_subscription:async function({client:t}={}){const e="/org/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_usage_collection_threshold:async function({client:t}={}){const e="/org/billing/usage-collection-threshold"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_balance_for_org:async function({client:t,include_total_due:e}){const i="/org/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_balance_for_user:async function({client:t,include_total_due:e}){const i="/user/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_subscription:async function({client:t}={}){const e="/user/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_usage_collection_threshold:async function({client:t}={}){const e="/user/billing/usage-collection-threshold"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_invoices_for_org:zn,list_invoices_for_org_pager:function(t){return s(zn,t,"page_token")},list_invoices_for_user:wn,list_invoices_for_user_pager:function(t){return s(wn,t,"page_token")},list_payment_methods_for_org:kn,list_payment_methods_for_org_pager:function(t){return s(kn,t,"page_token")},list_payment_methods_for_user:Hn,list_payment_methods_for_user_pager:function(t){return s(Hn,t,"page_token")},redirect_payment_method_portal_link_for_org:async function({client:t,return_url:e}){const i="/org/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},redirect_payment_method_portal_link_for_user:async function({client:t,return_url:e}){const i="/user/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},reset_org_usage_collection_threshold:async function({client:t,expected_version:e}){const i="/org/billing/usage-collection-threshold"+n({expected_version:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},reset_user_usage_collection_threshold:async function({client:t,expected_version:e}){const i="/user/billing/usage-collection-threshold"+n({expected_version:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},set_default_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}/default`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},set_org_usage_collection_threshold:async function({client:t,body:e}){const i="/org/billing/usage-collection-threshold"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},set_user_usage_collection_threshold:async function({client:t,body:e}){const i="/user/billing/usage-collection-threshold"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const e="/org/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},validate_customer_tax_information_for_user:async function({client:t}={}){const e="/user/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)}},ui={create_project:async function({client:t,files:e}){const i="/user/projects"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,r=await b(l,d);return await o(r),await r.json()},create_project_share_link:async function({client:t,id:e,body:i}){const l=`/user/projects/${e}/share-links`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},create_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_project_organization:async function({client:t,id:e}){const i=`/user/projects/${e}/organization`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_project_share_link:async function({client:t,id:e,key:i}){const l=`/user/projects/${e}/share-links/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"DELETE",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},delete_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},download_project:async function({client:t,id:e,format:i}){const l=`/user/projects/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},download_project_version:async function({client:t,id:e,version_id:i,format:l}){const c=`/user/projects/${e}/versions/${i}/download`+n({format:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},download_public_project:async function({client:t,id:e,format:i}){const l=`/projects/public/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_project_thumbnail:async function({client:t,id:e}){const i=`/user/projects/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_project_version:async function({client:t,id:e,version_id:i}){const l=`/user/projects/${e}/versions/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_project_version_thumbnail:async function({client:t,id:e,version_id:i}){const l=`/user/projects/${e}/versions/${i}/thumbnail`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_public_project:async function({client:t,id:e}){const i=`/projects/public/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_public_project_thumbnail:async function({client:t,id:e}){const i=`/projects/public/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_project_categories:async function({client:t}={}){const e="/projects/categories"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_project_share_links:Bn,list_project_share_links_pager:function(t){return s(Bn,t,"page_token")},list_project_versions:jn,list_project_versions_pager:function(t){return s(jn,t,"page_token")},list_projects:async function({client:t}={}){const e="/user/projects"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_public_projects:Cn,list_public_projects_pager:function(t){return s(Cn,t,"page_token")},publish_project:async function({client:t,id:e}){const i=`/user/projects/${e}/publish`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_project:async function({client:t,files:e,id:i}){const l=`/user/projects/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"PUT",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},update_project_organization:async function({client:t,id:e}){const i=`/user/projects/${e}/organization`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"PUT",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()}},hi={create_service_account_for_org:async function({client:t,label:e}){const i="/org/service-accounts"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_service_accounts_for_org:vn,list_service_accounts_for_org_pager:function(t){return s(vn,t,"page_token")}},pi={get_angle_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/angle/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_area_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/area/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_current_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/current/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_energy_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/energy/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_force_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/force/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_frequency_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/frequency/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_length_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/length/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_mass_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/mass/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_power_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/power/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_pressure_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/pressure/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_temperature_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/temperature/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_torque_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/torque/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_volume_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/volume/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},Xi={create_user_shortlink:async function({client:t,body:e}){const i="/user/shortlinks"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_user_shortlink:async function({client:t,key:e}){const i=`/user/shortlinks/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_oauth2_providers_for_user:async function({client:t}={}){const e="/user/oauth2/providers"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_session_for_user:async function({client:t,token:e}){const i=`/user/session/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user:async function({client:t,id:e}){const i=`/users/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_cad_user_info_form:async function({client:t}={}){const e="/user/cad-user-info"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_extended:async function({client:t,id:e}){const i=`/users-extended/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_privacy_settings:async function({client:t}={}){const e="/user/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self_extended:async function({client:t}={}){const e="/user/extended"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_shortlinks:Mn,get_user_shortlinks_pager:function(t){return s(Mn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:e}){const i="/website/email-marketing-consent/request"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_mailing_list_subscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/subscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},put_public_mailing_list_unsubscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/unsubscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},put_public_sales_form:async function({client:t,body:e}){const i="/website/forms/sales"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_support_form:async function({client:t,body:e}){const i="/website/forms/support"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_user_cad_user_info_form:async function({client:t,body:e}){const i="/website/forms/cad-user-info"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},report_user_client_error:async function({client:t,body:e}){const i="/user/client-errors"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_privacy_settings:async function({client:t,body:e}){const i="/user/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_self:async function({client:t,body:e}){const i="/user"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_shortlink:async function({client:t,key:e,body:i}){const l=`/user/shortlinks/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},user_email_marketing_consent_decline_post:async function({client:t}={}){const e="/user/email-marketing-consent/decline"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_get:async function({client:t}={}){const e="/user/email-marketing-consent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const e="/user/email-marketing-consent/request"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_seen_post:async function({client:t}={}){const e="/user/email-marketing-consent/seen"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_features_get:async function({client:t}={}){const e="/user/features"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}};exports.ApiError=l,exports.Client=class{constructor(t){const e="undefined"!=typeof process?process.env:void 0,n=e?.KITTYCAD_TOKEN||e?.KITTYCAD_API_TOKEN||e?.ZOO_API_TOKEN,i=e?.ZOO_HOST;"string"==typeof t?this.token=t:t&&"object"==typeof t&&(this.token=t.token,this.baseUrl=t.baseUrl,this.fetch=t.fetch,this.clientId=t.clientId,this.redirectUrl=t.redirectUrl,this.scopes=t.scopes,this.onAccessTokenExpiry=t.onAccessTokenExpiry,this.onInvalidGrant=t.onInvalidGrant),this.token??=n,this.baseUrl??=i,this.clientId&&"undefined"!=typeof localStorage&&(this.oauth2=this.createOAuth2Client(),this.oauth2.isHTTPDecoratorActive(!0),this.fetch=this.oauth2.decorateFetchHTTPClient(this.fetch||fetch))}authorize(t){return this.oauth2.fetchAuthorizationCode(t)}isReturningFromAuthServer(){return this.oauth2.isReturningFromAuthServer()}async getAccessToken(){const t=await this.oauth2.getAccessToken();return this.updateTokenFromAccessContext(t),t}resetOAuth2(){this.oauth2.reset(),this.token=void 0}createOAuth2Client(){const n=this.baseUrl||"https://api.zoo.dev",i=this.redirectUrl||("undefined"==typeof location?void 0:`${location.origin}${location.pathname}`);if(!i)throw new Error("OAuth2 requires redirectUrl when the current browser URL is unavailable.");return new t.OAuth2AuthCodePKCE({authorizationUrl:e(n,"/oauth2/authorize"),tokenUrl:e(n,"/oauth2/token"),clientId:this.clientId,redirectUrl:i,scopes:this.scopes||[],onAccessTokenExpiry:async t=>{const e=await(this.onAccessTokenExpiry?this.onAccessTokenExpiry(t):t());return this.updateTokenFromAccessContext(e),e},onInvalidGrant:this.onInvalidGrant||(()=>{})})}updateTokenFromAccessContext(t){t?.token?.value&&(this.token=t.token.value)}},exports.Pager=c,exports.WebRTC=ni,exports.api_calls=ii,exports.api_tokens=li,exports.createPager=s,exports.executor=oi,exports.factory=ci,exports.file=si,exports.meta=ai,exports.ml=di,exports.modeling=bi,exports.oauth2=ri,exports.orgs=Zi,exports.payments=mi,exports.projects=ui,exports.service_accounts=hi,exports.unit=pi,exports.users=Xi;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@kittycad/oauth2-auth-code-pkce");try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}function e(t,e){return`${t.replace(/\/+$/,"")}/${e.replace(/^\/+/,"")}`}function n(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));const n=e.toString();return n?`?${n}`:""}function i(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t||{}))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));return e}try{if("undefined"!=typeof process&&process.versions?.node&&"win32"===process.platform){new Function("m","return import(m)")("win-ca")}}catch{}class l extends Error{constructor(t,e,n){super(n||e?.message||`HTTP ${t}`),this.name="ApiError",this.status=t,this.error_code=e?.error_code,this.request_id=e?.request_id,this.body=e}}async function o(t){if(t.ok)return;let e,n;try{n=await t.text()}catch{throw new l(t.status)}try{e=JSON.parse(n)}catch{e=n?{message:n}:void 0}throw new l(t.status,e)}class c{started=!1;seenTokens=new Set;constructor(t,e,n="page_token"){this.fetchPage=t,this.baseParams={...e},this.tokenField=n,this.reset()}hasNext(){return!this.started||!!this.nextToken}reset(){this.started=!1,this.nextToken=void 0,this.seenTokens.clear();const t=this.baseParams[this.tokenField];"string"==typeof t&&this.seenTokens.add(t)}async next(){if(this.started&&!this.nextToken)return[];const t=this.started&&this.nextToken?{...this.baseParams,[this.tokenField]:this.nextToken}:{...this.baseParams},e=await this.fetchPage(t);if(!function(t){return null!==t&&"object"==typeof t&&Object.hasOwn(t,"items")&&Array.isArray(t.items)}(e))throw new TypeError("Invalid paginated response: expected an items array");const n=e.next_page??null;if(null!==n){if("string"!=typeof n||!n.trim())throw new TypeError("Invalid paginated response: invalid next_page token");if(this.seenTokens.has(n))throw new Error("Paginated response repeated a page token");this.seenTokens.add(n)}return this.started=!0,this.nextToken=n,e.items}}function s(t,e,n="page_token"){return new c(t,e,n)}async function a({client:t,id:e,limit:i,page_token:l,sort_by:c}){const s=`/users/${e}/api-calls`+n({limit:i,page_token:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function d({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function b({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function r({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-tokens"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}const Z=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function m(t){return"Uint8Array"===Z(t)}function u(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function h(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function p(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function X(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function y(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:p(e)?Object.fromEntries(e):e))}const G=7,V=Symbol.for("@@mdb.bson.version"),W=2147483647,f=-2147483648,g=Math.pow(2,63)-1,I=-Math.pow(2,63),Y=Math.pow(2,53),S=-Math.pow(2,53),J=1,R=2,x=3,K=4,L=5,T=6,U=7,N=8,z=9,w=10,k=11,H=12,B=13,j=14,C=15,v=16,M=17,P=18,F=19,Q=255,E=127,O=0,_=4,D=Object.freeze({double:1,string:2,object:3,array:4,binData:5,undefined:6,objectId:7,bool:8,date:9,null:10,regex:11,dbPointer:12,javascript:13,symbol:14,javascriptWithScope:15,int:16,timestamp:17,long:18,decimal:19,minKey:-1,maxKey:127});class A extends Error{get bsonError(){return!0}get name(){return"BSONError"}constructor(t,e){super(t,e)}static isBSONError(t){return null!=t&&"object"==typeof t&&"bsonError"in t&&!0===t.bsonError&&"name"in t&&"message"in t&&"stack"in t}}class $ extends A{get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${G}.x.x`)}}class q extends A{get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class tt extends A{get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let et,nt;function it(t,e,n,i){if(i){et??=new TextDecoder("utf8",{fatal:!0});try{return et.decode(t.subarray(e,n))}catch(t){throw new A("Invalid UTF-8 string in BSON document",{cause:t})}}return nt??=new TextDecoder("utf8",{fatal:!1}),nt.decode(t.subarray(e,n))}function lt(t,e,n){if(0===t.length)return"";const i=n-e;if(0===i)return"";if(i>20)return null;if(1===i&&t[e]<128)return String.fromCharCode(t[e]);if(2===i&&t[e]<128&&t[e+1]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1]);if(3===i&&t[e]<128&&t[e+1]<128&&t[e+2]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1])+String.fromCharCode(t[e+2]);const l=[];for(let i=e;i<n;i++){const e=t[i];if(e>127)return null;l.push(e)}return String.fromCharCode(...l)}function ot(t){return at.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function ct(t){return crypto.getRandomValues(at.allocate(t))}const st=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?ct:ot})(),at={isUint8Array:m,toLocalBufferType(t){if(Buffer.isBuffer(t))return t;if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength);const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return Buffer.from(t);throw new A("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>at.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,i,l)=>at.toLocalBufferType(t).copy(e,n??0,i??0,l??t.length),equals:(t,e)=>at.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>at.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>at.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>at.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;if(null!=l)return l;const o=at.toLocalBufferType(t).toString("utf8",e,n);if(i)for(let i=0;i<o.length;i++)if(65533===o.charCodeAt(i)){it(t,e,n,!0);break}return o},utf8ByteLength:t=>Buffer.byteLength(t,"utf8"),encodeUTF8Into(t,e,n){const i=function(t,e,n){if(0===e.length)return 0;if(e.length>25)return null;if(t.length-n<e.length)return null;for(let i=0,l=n;i<e.length;i++,l++){const n=e.charCodeAt(i);if(n>127)return null;t[l]=n}return e.length}(t,e,n);return null!=i?i:at.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:st,swap32:t=>at.toLocalBufferType(t).swap32()};function dt(t){if(t<0)throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);return Zt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}const bt=(()=>{const{crypto:t}=globalThis;if(null!=t&&"function"==typeof t.getRandomValues)return e=>t.getRandomValues(Zt.allocate(e));if(function(){const{navigator:t}=globalThis;return"object"==typeof t&&"ReactNative"===t.product}()){const{console:t}=globalThis;t?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.")}return dt})(),rt=/(\d|[a-f])/i,Zt={isUint8Array:m,toLocalBufferType(t){const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("Uint8Array"===e)return t;if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength));if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return new Uint8Array(t);throw new A("Cannot make a Uint8Array from passed potentialBuffer.")},allocate(t){if("number"!=typeof t)throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);return new Uint8Array(t)},allocateUnsafe:t=>Zt.allocate(t),compare(t,e){if(t===e)return 0;const n=Math.min(t.length,e.length);for(let i=0;i<n;i++){if(t[i]<e[i])return-1;if(t[i]>e[i])return 1}return t.length<e.length?-1:t.length>e.length?1:0},concat(t){if(0===t.length)return Zt.allocate(0);let e=0;for(const n of t)e+=n.length;const n=Zt.allocate(e);let i=0;for(const e of t)n.set(e,i),i+=e.length;return n},copy(t,e,n,i,l){if(void 0!==l&&l<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${l}`);if(l=l??t.length,void 0!==i&&(i<0||i>l))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${l}. Received ${i}`);if(i=i??0,void 0!==n&&n<0)throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);n=n??0;const o=t.subarray(i,l),c=Math.min(o.length,e.length-n);return c<=0?0:(e.set(o.subarray(0,c),n),c)},equals(t,e){if(t.byteLength!==e.byteLength)return!1;for(let n=0;n<t.byteLength;n++)if(t[n]!==e[n])return!1;return!0},fromNumberArray:t=>Uint8Array.from(t),fromBase64:t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),fromUTF8:t=>(new TextEncoder).encode(t),toBase64:t=>btoa(Zt.toISO88591(t)),fromISO88591:t=>Uint8Array.from(t,(t=>255&t.charCodeAt(0))),toISO88591:t=>Array.from(Uint16Array.from(t),(t=>String.fromCharCode(t))).join(""),fromHex(t){const e=t.length%2==0?t:t.slice(0,t.length-1),n=[];for(let t=0;t<e.length;t+=2){const i=e[t],l=e[t+1];if(!rt.test(i))break;if(!rt.test(l))break;const o=Number.parseInt(`${i}${l}`,16);n.push(o)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;return null!=l?l:it(t,e,n,i)},utf8ByteLength:t=>(new TextEncoder).encode(t).byteLength,encodeUTF8Into(t,e,n){const i=(new TextEncoder).encode(e);return t.set(i,n),i.byteLength},randomBytes:bt,swap32(t){if(t.length%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t.length;e+=4){const n=t[e],i=t[e+1],l=t[e+2],o=t[e+3];t[e]=o,t[e+1]=l,t[e+2]=i,t[e+3]=n}return t}},mt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?at:Zt,ut=Symbol.for("@@mdb.bson.type");class ht{get[ut](){return this._bsontype}get[V](){return G}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const pt=new Float64Array(1),Xt=new Uint8Array(pt.buffer,0,8);pt[0]=-1;const yt=0===Xt[7],Gt={isBigEndian:yt,getNonnegativeInt32LE(t,e){if(t[e+3]>127)throw new RangeError(`Size cannot be negative at offset: ${e}`);return t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24},getInt32LE:(t,e)=>t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24,getUint32LE:(t,e)=>t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3],getUint32BE:(t,e)=>t[e+3]+256*t[e+2]+65536*t[e+1]+16777216*t[e],getBigInt64LE:(t,e)=>(BigInt(t[e+4]+256*t[e+5]+65536*t[e+6]+(t[e+7]<<24))<<32n)+BigInt(t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3]),getFloat64LE:yt?(t,e)=>(Xt[7]=t[e],Xt[6]=t[e+1],Xt[5]=t[e+2],Xt[4]=t[e+3],Xt[3]=t[e+4],Xt[2]=t[e+5],Xt[1]=t[e+6],Xt[0]=t[e+7],pt[0]):(t,e)=>(Xt[0]=t[e],Xt[1]=t[e+1],Xt[2]=t[e+2],Xt[3]=t[e+3],Xt[4]=t[e+4],Xt[5]=t[e+5],Xt[6]=t[e+6],Xt[7]=t[e+7],pt[0]),setInt32BE:(t,e,n)=>(t[e+3]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e]=n,4),setInt32LE:(t,e,n)=>(t[e]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+3]=n,4),setBigInt64LE(t,e,n){const i=0xffffffffn;let l=Number(n&i);t[e]=l,l>>=8,t[e+1]=l,l>>=8,t[e+2]=l,l>>=8,t[e+3]=l;let o=Number(n>>32n&i);return t[e+4]=o,o>>=8,t[e+5]=o,o>>=8,t[e+6]=o,o>>=8,t[e+7]=o,8},setFloat64LE:yt?(t,e,n)=>(pt[0]=n,t[e]=Xt[7],t[e+1]=Xt[6],t[e+2]=Xt[5],t[e+3]=Xt[4],t[e+4]=Xt[3],t[e+5]=Xt[2],t[e+6]=Xt[1],t[e+7]=Xt[0],8):(t,e,n)=>(pt[0]=n,t[e]=Xt[0],t[e+1]=Xt[1],t[e+2]=Xt[2],t[e+3]=Xt[3],t[e+4]=Xt[4],t[e+5]=Xt[5],t[e+6]=Xt[6],t[e+7]=Xt[7],8)};class Vt extends ht{get _bsontype(){return"Binary"}static BSON_BINARY_SUBTYPE_DEFAULT=0;static BUFFER_SIZE=256;static SUBTYPE_DEFAULT=0;static SUBTYPE_FUNCTION=1;static SUBTYPE_BYTE_ARRAY=2;static SUBTYPE_UUID_OLD=3;static SUBTYPE_UUID=4;static SUBTYPE_MD5=5;static SUBTYPE_ENCRYPTED=6;static SUBTYPE_COLUMN=7;static SUBTYPE_SENSITIVE=8;static SUBTYPE_VECTOR=9;static SUBTYPE_USER_DEFINED=128;static VECTOR_TYPE=Object.freeze({Int8:3,Float32:39,PackedBit:16});buffer;sub_type;position;constructor(t,e){if(super(),null!=t&&"string"==typeof t&&!ArrayBuffer.isView(t)&&!u(t)&&!Array.isArray(t))throw new A("Binary can only be constructed from Uint8Array or number[]");this.sub_type=255&(e??Vt.BSON_BINARY_SUBTYPE_DEFAULT),null==t?(this.buffer=mt.allocate(Vt.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?mt.fromNumberArray(t):mt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new A("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new A("only accepts single character Uint8Array or Array");let e;if(e="string"==typeof t?t.charCodeAt(0):"number"==typeof t?t:t[0],e<0||e>255)throw new A("only accepts number in a valid unsigned byte range 0-255");if(this.buffer.byteLength>this.position)this.buffer[this.position++]=e;else{const t=mt.allocate(Vt.BUFFER_SIZE+this.buffer.length);t.set(this.buffer,0),this.buffer=t,this.buffer[this.position++]=e}}write(t,e){if(e="number"==typeof e?e:this.position,this.buffer.byteLength<e+t.length){const e=mt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(mt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new A("input cannot be string")}read(t,e){const n=t+(e=e&&e>0?e:this.position);return this.buffer.subarray(t,n>this.position?this.position:n)}value(){return this.buffer.length===this.position?this.buffer:this.buffer.subarray(0,this.position)}length(){return this.position}toJSON(){return mt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?mt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?mt.toBase64(this.buffer.subarray(0,this.position)):mt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===Vt.SUBTYPE_VECTOR&&Wt(this);const e=mt.toBase64(this.buffer),n=Number(this.sub_type).toString(16);return t.legacy?{$binary:e,$type:1===n.length?"0"+n:n}:{$binary:{base64:e,subType:1===n.length?"0"+n:n}}}toUUID(){if(this.sub_type===Vt.SUBTYPE_UUID)return new It(this.buffer.subarray(0,this.position));throw new A(`Binary sub_type "${this.sub_type}" (${typeof this.sub_type}) is not supported for converting to UUID. Only 0x${Vt.SUBTYPE_UUID.toString(16).padStart(2,"0")} is currently supported.`)}static createFromHexString(t,e){return new Vt(mt.fromHex(t),e)}static createFromBase64(t,e){return new Vt(mt.fromBase64(t),e)}static fromExtendedJSON(t,e){let n,i;if(e=e||{},"$binary"in t?e.legacy&&"string"==typeof t.$binary&&"$type"in t?(i=t.$type?parseInt(t.$type,16):0,n=mt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(i=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=mt.fromBase64(t.$binary.base64)):"$uuid"in t&&(i=4,n=It.bytesFromString(t.$uuid)),!n)throw new A(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return i===_?new It(n):new Vt(n,i)}inspect(t,e,n){n??=y;return`Binary.createFromBase64(${n(mt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Int8)throw new A("Binary datatype field is not Int8");return Wt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Float32)throw new A("Binary datatype field is not Float32");Wt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Gt.isBigEndian&&mt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");return Wt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");Wt(this);const t=8*(this.length()-2)-this.buffer[1],e=new Int8Array(t);for(let t=0;t<e.length;t++){const n=t/8|0,i=this.buffer[n+2]>>7-t%8&1;e[t]=i}return e}static fromInt8Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Int8,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2);const i=new this(e,this.SUBTYPE_VECTOR);return Wt(i),i}static fromFloat32Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Gt.isBigEndian&&mt.swap32(new Uint8Array(e.buffer,2));const i=new this(e,this.SUBTYPE_VECTOR);return Wt(i),i}static fromPackedBits(t,e=0){const n=mt.allocate(t.byteLength+2);n[0]=Vt.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const i=new this(n,this.SUBTYPE_VECTOR);return Wt(i),i}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=Vt.VECTOR_TYPE.PackedBit;const i=t.length%8;n[1]=0===i?0:8-i;for(let e=0;e<t.length;e++){const i=e>>>3,l=t[e];if(0!==l&&1!==l)throw new A(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===l)continue;const o=7-e%8;n[i+2]|=l<<o}return new this(n,Vt.SUBTYPE_VECTOR)}}function Wt(t){if(t.sub_type!==Vt.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],i=t.buffer[1];if((n===Vt.VECTOR_TYPE.Float32||n===Vt.VECTOR_TYPE.Int8)&&0!==i)throw new A("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===Vt.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new A("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===Vt.VECTOR_TYPE.PackedBit&&0!==i&&2===e)throw new A("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===Vt.VECTOR_TYPE.PackedBit&&i>7)throw new A(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`)}const ft=/^[0-9A-F]{32}$/i,gt=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class It extends Vt{constructor(t){let e;if(null==t)e=It.generate();else if(t instanceof It)e=mt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=mt.toLocalBufferType(t);else{if("string"!=typeof t)throw new A("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");e=It.bytesFromString(t)}super(e,_)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[mt.toHex(this.buffer.subarray(0,4)),mt.toHex(this.buffer.subarray(4,6)),mt.toHex(this.buffer.subarray(6,8)),mt.toHex(this.buffer.subarray(8,10)),mt.toHex(this.buffer.subarray(10,16))].join("-"):mt.toHex(this.buffer)}toString(t){return"hex"===t?mt.toHex(this.id):"base64"===t?mt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof It)return mt.equals(t.id,this.id);try{return mt.equals(new It(t).id,this.id)}catch{return!1}}toBinary(){return new Vt(this.id,Vt.SUBTYPE_UUID)}static generate(){const t=mt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?It.isValidUUIDString(t):m(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=It.bytesFromString(t);return new It(e)}static createFromBase64(t){return new It(mt.fromBase64(t))}static bytesFromString(t){if(!It.isValidUUIDString(t))throw new A("UUID string representation must be 32 hex digits or canonical hyphenated representation");return mt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return ft.test(t)||gt.test(t)}inspect(t,e,n){return n??=y,`new UUID(${n(this.toHexString(),e)})`}}class Yt extends ht{get _bsontype(){return"Code"}code;scope;constructor(t,e){super(),this.code=t.toString(),this.scope=e??null}toJSON(){return null!=this.scope?{code:this.code,scope:this.scope}:{code:this.code}}toExtendedJSON(){return this.scope?{$code:this.code,$scope:this.scope}:{$code:this.code}}static fromExtendedJSON(t){return new Yt(t.$code,t.$scope)}inspect(t,e,n){n??=y;let i=n(this.code,e);const l=i.includes("\n");null!=this.scope&&(i+=`,${l?"\n":" "}${n(this.scope,e)}`);return`new Code(${l?"\n":""}${i}${l&&null===this.scope?"\n":""})`}}function St(t){return null!=t&&"object"==typeof t&&"$id"in t&&null!=t.$id&&"$ref"in t&&"string"==typeof t.$ref&&(!("$db"in t)||"$db"in t&&"string"==typeof t.$db)}class Jt extends ht{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,i){super();const l=t.split(".");2===l.length&&(n=l.shift(),t=l.shift()),this.collection=t,this.oid=e,this.db=n,this.fields=i||{}}get namespace(){return this.collection}set namespace(t){this.collection=t}toJSON(){const t=Object.assign({$ref:this.collection,$id:this.oid},this.fields);return null!=this.db&&(t.$db=this.db),t}toExtendedJSON(t){t=t||{};let e={$ref:this.collection,$id:this.oid};return t.legacy||(this.db&&(e.$db=this.db),e=Object.assign(e,this.fields)),e}static fromExtendedJSON(t){const e=Object.assign({},t);return delete e.$ref,delete e.$id,delete e.$db,new Jt(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=y;const i=[n(this.namespace,e),n(this.oid,e),...this.db?[n(this.db,e)]:[],...Object.keys(this.fields).length>0?[n(this.fields,e)]:[]];return i[1]=n===y?`new ObjectId(${i[1]})`:i[1],`new DBRef(${i.join(", ")})`}}function Rt(t){if(""===t)return t;let e=0;const n="-"===t[e],i="+"===t[e];(i||n)&&(e+=1);let l=!1;for(;e<t.length&&"0"===t[e];++e)l=!0;return l?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:i?t.slice(1):t}let xt;try{xt=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}const Kt=4294967296,Lt=0x10000000000000000,Tt=Lt/2,Ut={},Nt={},zt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class wt extends ht{get _bsontype(){return"Long"}get __isLong__(){return!0}high;low;unsigned;constructor(t=0,e,n){super();const i="boolean"==typeof e?e:Boolean(n),l="number"==typeof e?e:0,o="string"==typeof t?wt.fromString(t,i):"bigint"==typeof t?wt.fromBigInt(t,i):{low:0|t,high:0|l,unsigned:i};this.low=o.low,this.high=o.high,this.unsigned=o.unsigned}static TWO_PWR_24=wt.fromInt(16777216);static MAX_UNSIGNED_VALUE=wt.fromBits(-1,-1,!0);static ZERO=wt.fromInt(0);static UZERO=wt.fromInt(0,!0);static ONE=wt.fromInt(1);static UONE=wt.fromInt(1,!0);static NEG_ONE=wt.fromInt(-1);static MAX_VALUE=wt.fromBits(-1,2147483647,!1);static MIN_VALUE=wt.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new wt(t,e,n)}static fromInt(t,e){let n,i,l;return e?(l=0<=(t>>>=0)&&t<256)&&(i=Nt[t],i)?i:(n=wt.fromBits(t,(0|t)<0?-1:0,!0),l&&(Nt[t]=n),n):(l=-128<=(t|=0)&&t<128)&&(i=Ut[t],i)?i:(n=wt.fromBits(t,t<0?-1:0,!1),l&&(Ut[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?wt.UZERO:wt.ZERO;if(e){if(t<0)return wt.UZERO;if(t>=Lt)return wt.MAX_UNSIGNED_VALUE}else{if(t<=-Tt)return wt.MIN_VALUE;if(t+1>=Tt)return wt.MAX_VALUE}return t<0?wt.fromNumber(-t,e).neg():wt.fromBits(t%Kt|0,t/Kt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new wt(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new A("empty string");if(n<2||36<n)throw new A("radix");let i;if((i=t.indexOf("-"))>0)throw new A("interior hyphen");if(0===i)return wt._fromString(t.substring(1),e,n).neg();const l=wt.fromNumber(Math.pow(n,8));let o=wt.ZERO;for(let e=0;e<t.length;e+=8){const i=Math.min(8,t.length-e),c=parseInt(t.substring(e,e+i),n);if(i<8){const t=wt.fromNumber(Math.pow(n,i));o=o.mul(t).add(wt.fromNumber(c))}else o=o.mul(l),o=o.add(wt.fromNumber(c))}return o.unsigned=e,o}static fromStringStrict(t,e,n){let i=!1;if("number"==typeof e?(n=e,e=!1):i=!!e,n??=10,t.trim()!==t)throw new A(`Input: '${t}' contains leading and/or trailing whitespace`);if(!function(t,e){const n="0123456789abcdefghijklmnopqrstuvwxyz".slice(0,e=e??10);return!new RegExp(`[^-+${n}]`,"i").test(t)&&t}(t,n))throw new A(`Input: '${t}' contains invalid characters for radix: ${n}`);const l=Rt(t),o=wt._fromString(l,i,n);if(o.toString(n).toLowerCase()!==l.toLowerCase())throw new A(`Input: ${t} is not representable as ${o.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return o}static fromString(t,e,n){let i=!1;return"number"==typeof e?(n=e,e=!1):i=!!e,n??=10,"NaN"===t&&n<24||("Infinity"===t||"+Infinity"===t||"-Infinity"===t)&&n<35?wt.ZERO:wt._fromString(t,i,n)}static fromBytes(t,e,n){return n?wt.fromBytesLE(t,e):wt.fromBytesBE(t,e)}static fromBytesLE(t,e){return new wt(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,e)}static fromBytesBE(t,e){return new wt(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],e)}static isLong(t){return null!=t&&"object"==typeof t&&"__isLong__"in t&&!0===t.__isLong__}static fromValue(t,e){return"number"==typeof t?wt.fromNumber(t,e):"string"==typeof t?wt.fromString(t,e):wt.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){wt.isLong(t)||(t=wt.fromValue(t));const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16;let a=0,d=0,b=0,r=0;return r+=l+(65535&t.low),b+=r>>>16,r&=65535,b+=i+s,d+=b>>>16,b&=65535,d+=n+c,a+=d>>>16,d&=65535,a+=e+o,a&=65535,wt.fromBits(b<<16|r,a<<16|d,this.unsigned)}and(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(wt.isLong(t)||(t=wt.fromValue(t)),this.eq(t))return 0;const e=this.isNegative(),n=t.isNegative();return e&&!n?-1:!e&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1}comp(t){return this.compare(t)}divide(t){if(wt.isLong(t)||(t=wt.fromValue(t)),t.isZero())throw new A("division by zero");if(xt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?xt.div_u:xt.div_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?wt.UZERO:wt.ZERO;let e,n,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return wt.UZERO;if(t.gt(this.shru(1)))return wt.UONE;i=wt.UZERO}else{if(this.eq(wt.MIN_VALUE)){if(t.eq(wt.ONE)||t.eq(wt.NEG_ONE))return wt.MIN_VALUE;if(t.eq(wt.MIN_VALUE))return wt.ONE;return e=this.shr(1).div(t).shl(1),e.eq(wt.ZERO)?t.isNegative()?wt.ONE:wt.NEG_ONE:(n=this.sub(t.mul(e)),i=e.add(n.div(t)),i)}if(t.eq(wt.MIN_VALUE))return this.unsigned?wt.UZERO:wt.ZERO;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();i=wt.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const l=Math.ceil(Math.log(e)/Math.LN2),o=l<=48?1:Math.pow(2,l-48);let c=wt.fromNumber(e),s=c.mul(t);for(;s.isNegative()||s.gt(n);)e-=o,c=wt.fromNumber(e,this.unsigned),s=c.mul(t);c.isZero()&&(c=wt.ONE),i=i.add(c),n=n.sub(s)}return i}div(t){return this.divide(t)}equals(t){return wt.isLong(t)||(t=wt.fromValue(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)}eq(t){return this.equals(t)}getHighBits(){return this.high}getHighBitsUnsigned(){return this.high>>>0}getLowBits(){return this.low}getLowBitsUnsigned(){return this.low>>>0}getNumBitsAbs(){if(this.isNegative())return this.eq(wt.MIN_VALUE)?64:this.neg().getNumBitsAbs();const t=0!==this.high?this.high:this.low;let e;for(e=31;e>0&&!(t&1<<e);e--);return 0!==this.high?e+33:e+1}greaterThan(t){return this.comp(t)>0}gt(t){return this.greaterThan(t)}greaterThanOrEqual(t){return this.comp(t)>=0}gte(t){return this.greaterThanOrEqual(t)}ge(t){return this.greaterThanOrEqual(t)}isEven(){return!(1&this.low)}isNegative(){return!this.unsigned&&this.high<0}isOdd(){return!(1&~this.low)}isPositive(){return this.unsigned||this.high>=0}isZero(){return 0===this.high&&0===this.low}lessThan(t){return this.comp(t)<0}lt(t){return this.lessThan(t)}lessThanOrEqual(t){return this.comp(t)<=0}lte(t){return this.lessThanOrEqual(t)}modulo(t){if(wt.isLong(t)||(t=wt.fromValue(t)),xt){const e=(this.unsigned?xt.rem_u:xt.rem_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}return this.sub(this.div(t).mul(t))}mod(t){return this.modulo(t)}rem(t){return this.modulo(t)}multiply(t){if(this.isZero())return wt.ZERO;if(wt.isLong(t)||(t=wt.fromValue(t)),xt){const e=xt.mul(this.low,this.high,t.low,t.high);return wt.fromBits(e,xt.get_high(),this.unsigned)}if(t.isZero())return wt.ZERO;if(this.eq(wt.MIN_VALUE))return t.isOdd()?wt.MIN_VALUE:wt.ZERO;if(t.eq(wt.MIN_VALUE))return this.isOdd()?wt.MIN_VALUE:wt.ZERO;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(wt.TWO_PWR_24)&&t.lt(wt.TWO_PWR_24))return wt.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16,a=65535&t.low;let d=0,b=0,r=0,Z=0;return Z+=l*a,r+=Z>>>16,Z&=65535,r+=i*a,b+=r>>>16,r&=65535,r+=l*s,b+=r>>>16,r&=65535,b+=n*a,d+=b>>>16,b&=65535,b+=i*s,d+=b>>>16,b&=65535,b+=l*c,d+=b>>>16,b&=65535,d+=e*a+n*s+i*c+l*o,d&=65535,wt.fromBits(r<<16|Z,d<<16|b,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(wt.MIN_VALUE)?wt.MIN_VALUE:this.not().add(wt.ONE)}neg(){return this.negate()}not(){return wt.fromBits(~this.low,~this.high,this.unsigned)}notEquals(t){return!this.equals(t)}neq(t){return this.notEquals(t)}ne(t){return this.notEquals(t)}or(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):wt.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):wt.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(wt.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return wt.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?wt.fromBits(e,0,this.unsigned):wt.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return wt.isLong(t)||(t=wt.fromValue(t)),this.add(t.neg())}sub(t){return this.subtract(t)}toInt(){return this.unsigned?this.low>>>0:this.low}toNumber(){return this.unsigned?(this.high>>>0)*Kt+(this.low>>>0):this.high*Kt+(this.low>>>0)}toBigInt(){return BigInt(this.toString())}toBytes(t){return t?this.toBytesLE():this.toBytesBE()}toBytesLE(){const t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24,255&t,t>>>8&255,t>>>16&255,t>>>24]}toBytesBE(){const t=this.high,e=this.low;return[t>>>24,t>>>16&255,t>>>8&255,255&t,e>>>24,e>>>16&255,e>>>8&255,255&e]}toSigned(){return this.unsigned?wt.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new A("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(wt.MIN_VALUE)){const e=wt.fromNumber(t),n=this.div(e),i=n.mul(e).sub(this);return n.toString(t)+i.toInt().toString(t)}return"-"+this.neg().toString(t)}const e=wt.fromNumber(Math.pow(t,6),this.unsigned);let n=this,i="";for(;;){const l=n.div(e);let o=(n.sub(l.mul(e)).toInt()>>>0).toString(t);if(n=l,n.isZero())return o+i;for(;o.length<6;)o="0"+o;i=""+o+i}}toUnsigned(){return this.unsigned?this:wt.fromBits(this.low,this.high,!0)}xor(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low^t.low,this.high^t.high,this.unsigned)}eqz(){return this.isZero()}le(t){return this.lessThanOrEqual(t)}toExtendedJSON(t){return t&&t.relaxed?this.toNumber():{$numberLong:this.toString()}}static fromExtendedJSON(t,e){const{useBigInt64:n=!1,relaxed:i=!0}={...e};if(t.$numberLong.length>20)throw new A("$numberLong string is too long");if(!zt.test(t.$numberLong))throw new A(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const l=wt.fromString(t.$numberLong);return i?l.toNumber():l}inspect(t,e,n){n??=y;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Ht=/^(\+|-)?(Infinity|inf)$/i,Bt=/^(\+|-)?NaN$/i,jt=6111,Ct=-6176,vt=mt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Mt=mt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Pt=mt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Ft=/^([-+])?(\d+)?$/;function Qt(t){return!isNaN(parseInt(t,10))}function Et(t){const e=wt.fromNumber(1e9);let n=wt.fromNumber(0);if(!(t.parts[0]||t.parts[1]||t.parts[2]||t.parts[3]))return{quotient:t,rem:n};for(let i=0;i<=3;i++)n=n.shiftLeft(32),n=n.add(new wt(t.parts[i],0)),t.parts[i]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Ot(t,e){throw new A(`"${t}" is not a valid Decimal128 string - ${e}`)}class _t extends ht{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=_t.fromString(t).bytes;else{if(!(t instanceof Uint8Array||m(t)))throw new A("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new A("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return _t._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return _t._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,i=!1,l=!1,o=!1,c=0,s=0,a=0,d=0,b=0;const r=[0];let Z=0,m=0,u=0,h=0,p=new wt(0,0),X=new wt(0,0),y=0,G=0;if(t.length>=7e3)throw new A(t+" not a valid Decimal128 string");const V=t.match(kt),W=t.match(Ht),f=t.match(Bt);if(!V&&!W&&!f||0===t.length)throw new A(t+" not a valid Decimal128 string");if(V){const e=V[2],n=V[4],i=V[5],l=V[6];n&&void 0===l&&Ot(t,"missing exponent power"),n&&void 0===e&&Ot(t,"missing exponent base"),void 0===n&&(i||l)&&Ot(t,"missing e before exponent")}if("+"!==t[G]&&"-"!==t[G]||(i=!0,n="-"===t[G++]),!Qt(t[G])&&"."!==t[G]){if("i"===t[G]||"I"===t[G])return new _t(n?Mt:Pt);if("N"===t[G])return new _t(vt)}for(;Qt(t[G])||"."===t[G];)"."!==t[G]?(Z<34&&("0"!==t[G]||o)&&(o||(b=s),o=!0,r[m++]=parseInt(t[G],10),Z+=1),o&&(a+=1),l&&(d+=1),s+=1,G+=1):(l&&Ot(t,"contains multiple periods"),l=!0,G+=1);if(l&&!s)throw new A(t+" not a valid Decimal128 string");if("e"===t[G]||"E"===t[G]){const e=t.substr(++G).match(Ft);if(!e||!e[2])return new _t(vt);h=parseInt(e[0],10),G+=e[0].length}if(t[G])return new _t(vt);if(Z){if(u=Z-1,c=a,1!==c)for(;"0"===t[b+c-1+Number(i)+Number(l)];)c-=1}else r[0]=0,a=1,Z=1,c=0;for(h<=d&&d>h+16384?h=Ct:h-=d;h>jt;){if(u+=1,u>=34){if(0===c){h=jt;break}Ot(t,"overflow")}h-=1}if(e.allowRounding){for(;h<Ct||Z<a;){if(0===u&&c<Z){h=Ct,c=0;break}if(Z<a?a-=1:u-=1,h<jt)h+=1;else{if(r.join("").match(/^0+$/)){h=jt;break}Ot(t,"overflow")}}if(u+1<c){let e=s;l&&(b+=1,e+=1),i&&(b+=1,e+=1);const o=parseInt(t[b+u+1],10);let c=0;if(o>=5&&(c=1,5===o)){c=r[u]%2==1?1:0;for(let n=b+u+2;n<e;n++)if(parseInt(t[n],10)){c=1;break}}if(c){let t=u;for(;t>=0&&++r[t]>9;t--)if(r[t]=0,0===t){if(!(h<jt))return new _t(n?Mt:Pt);h+=1,r[t]=1}}}}else{for(;h<Ct||Z<a;){if(0===u){if(0===c){h=Ct;break}Ot(t,"exponent underflow")}Z<a?("0"!==t[a-1+Number(i)+Number(l)]&&0!==c&&Ot(t,"inexact rounding"),a-=1):(0!==r[u]&&Ot(t,"inexact rounding"),u-=1),h<jt?h+=1:Ot(t,"overflow")}if(u+1<c){l&&(b+=1),i&&(b+=1);0!==parseInt(t[b+u+1],10)&&Ot(t,"inexact rounding")}}if(p=wt.fromNumber(0),X=wt.fromNumber(0),0===c)p=wt.fromNumber(0),X=wt.fromNumber(0);else if(u<17){let t=0;for(X=wt.fromNumber(r[t++]),p=new wt(0,0);t<=u;t++)X=X.multiply(wt.fromNumber(10)),X=X.add(wt.fromNumber(r[t]))}else{let t=0;for(p=wt.fromNumber(r[t++]);t<=u-17;t++)p=p.multiply(wt.fromNumber(10)),p=p.add(wt.fromNumber(r[t]));for(X=wt.fromNumber(r[t++]);t<=u;t++)X=X.multiply(wt.fromNumber(10)),X=X.add(wt.fromNumber(r[t]))}const g=function(t,e){if(!t&&!e)return{high:wt.fromNumber(0),low:wt.fromNumber(0)};const n=t.shiftRightUnsigned(32),i=new wt(t.getLowBits(),0),l=e.shiftRightUnsigned(32),o=new wt(e.getLowBits(),0);let c=n.multiply(l),s=n.multiply(o);const a=i.multiply(l);let d=i.multiply(o);return c=c.add(s.shiftRightUnsigned(32)),s=new wt(s.getLowBits(),0).add(a).add(d.shiftRightUnsigned(32)),c=c.add(s.shiftRightUnsigned(32)),d=s.shiftLeft(32).add(new wt(d.getLowBits(),0)),{high:c,low:d}}(p,wt.fromString("100000000000000000"));g.low=g.low.add(X),function(t,e){const n=t.high>>>0,i=e.high>>>0;if(n<i)return!0;if(n===i&&t.low>>>0<e.low>>>0)return!0;return!1}(g.low,X)&&(g.high=g.high.add(wt.fromNumber(1))),y=h+6176;const I={low:wt.fromNumber(0),high:wt.fromNumber(0)};g.high.shiftRightUnsigned(49).and(wt.fromNumber(1)).equals(wt.fromNumber(1))?(I.high=I.high.or(wt.fromNumber(3).shiftLeft(61)),I.high=I.high.or(wt.fromNumber(y).and(wt.fromNumber(16383).shiftLeft(47))),I.high=I.high.or(g.high.and(wt.fromNumber(0x7fffffffffff)))):(I.high=I.high.or(wt.fromNumber(16383&y).shiftLeft(49)),I.high=I.high.or(g.high.and(wt.fromNumber(562949953421311)))),I.low=g.low,n&&(I.high=I.high.or(wt.fromString("9223372036854775808")));const Y=mt.allocateUnsafe(16);return G=0,Y[G++]=255&I.low.low,Y[G++]=I.low.low>>8&255,Y[G++]=I.low.low>>16&255,Y[G++]=I.low.low>>24&255,Y[G++]=255&I.low.high,Y[G++]=I.low.high>>8&255,Y[G++]=I.low.high>>16&255,Y[G++]=I.low.high>>24&255,Y[G++]=255&I.high.low,Y[G++]=I.high.low>>8&255,Y[G++]=I.high.low>>16&255,Y[G++]=I.high.low>>24&255,Y[G++]=255&I.high.high,Y[G++]=I.high.high>>8&255,Y[G++]=I.high.high>>16&255,Y[G++]=I.high.high>>24&255,new _t(Y)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let i,l,o,c=0,s=!1,a={parts:[0,0,0,0]};const d=[];c=0;const b=this.bytes,r=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,Z=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,m=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,u=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24;c=0;({low:new wt(r,Z),high:new wt(m,u)}).high.lessThan(wt.ZERO)&&d.push("-");const h=u>>26&31;if(h>>3==3){if(30===h)return d.join("")+"Infinity";if(31===h)return"NaN";t=u>>15&16383,i=8+(u>>14&1)}else i=u>>14&7,t=u>>17&16383;const p=t-6176;if(a.parts[0]=(16383&u)+((15&i)<<14),a.parts[1]=m,a.parts[2]=Z,a.parts[3]=r,0===a.parts[0]&&0===a.parts[1]&&0===a.parts[2]&&0===a.parts[3])s=!0;else for(o=3;o>=0;o--){let t=0;const e=Et(a);if(a=e.quotient,t=e.rem.low,t)for(l=8;l>=0;l--)n[9*o+l]=t%10,t=Math.floor(t/10)}if(s)e=1,n[c]=0;else for(e=36;!n[c];)e-=1,c+=1;const X=e-1+p;if(X>=34||X<=-7||p>0){if(e>34)return d.push("0"),p>0?d.push(`E+${p}`):p<0&&d.push(`E${p}`),d.join("");d.push(`${n[c++]}`),e-=1,e&&d.push(".");for(let t=0;t<e;t++)d.push(`${n[c++]}`);d.push("E"),X>0?d.push(`+${X}`):d.push(`${X}`)}else if(p>=0)for(let t=0;t<e;t++)d.push(`${n[c++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)d.push(`${n[c++]}`);else d.push("0");for(d.push(".");t++<0;)d.push("0");for(let i=0;i<e-Math.max(t-1,0);i++)d.push(`${n[c++]}`)}return d.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return _t.fromString(t.$numberDecimal)}inspect(t,e,n){n??=y;return`new Decimal128(${n(this.toString(),e)})`}}class Dt extends ht{get _bsontype(){return"Double"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=+t}static fromString(t){const e=Number(t);if("NaN"===t)return new Dt(NaN);if("Infinity"===t)return new Dt(1/0);if("-Infinity"===t)return new Dt(-1/0);if(!Number.isFinite(e))throw new A(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new A(`Input: '${t}' contains whitespace`);if(""===t)throw new A("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new A(`Input: '${t}' is not in decimal or exponential notation`);return new Dt(e)}valueOf(){return this.value}toJSON(){return this.value}toString(t){return this.value.toString(t)}toExtendedJSON(t){return t&&(t.legacy||t.relaxed&&isFinite(this.value))?this.value:Object.is(Math.sign(this.value),-0)?{$numberDouble:"-0.0"}:{$numberDouble:Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}}static fromExtendedJSON(t,e){const n=parseFloat(t.$numberDouble);return e&&e.relaxed?n:new Dt(n)}inspect(t,e,n){return n??=y,`new Double(${n(this.value,e)})`}}class At extends ht{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=Rt(t),n=Number(t);if(W<n)throw new A(`Input: '${t}' is larger than the maximum value for Int32`);if(f>n)throw new A(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new A(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new A(`Input: '${t}' is not a valid Int32 string`);return new At(n)}valueOf(){return this.value}toString(t){return this.value.toString(t)}toJSON(){return this.value}toExtendedJSON(t){return t&&(t.relaxed||t.legacy)?this.value:{$numberInt:this.value.toString()}}static fromExtendedJSON(t,e){return e&&e.relaxed?parseInt(t.$numberInt,10):new At(t.$numberInt)}inspect(t,e,n){return n??=y,`new Int32(${n(this.value,e)})`}}class $t extends ht{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new $t}inspect(){return"new MaxKey()"}}class qt extends ht{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MinKey()"}}const te=new WeakMap,ee=[];for(let t=0;t<256;t++)ee.push(t.toString(16).padStart(2,"0"));const ne=new Int8Array(103);for(let t=48;t<=57;t++)ne[t]=t-48;for(let t=65;t<=70;t++)ne[t]=t-55;for(let t=97;t<=102;t++)ne[t]=t-87;class ie extends ht{get _bsontype(){return"ObjectId"}static index=0;static PROCESS_UNIQUE=null;static resetState=()=>{this.index=Math.floor(16777216*Math.random()),this.PROCESS_UNIQUE=null};static{this.resetState();const{startupSnapshot:t}=globalThis?.process?.getBuiltinModule?.("v8")??{};t?.isBuildingSnapshot?.()&&t?.addDeserializeCallback?.(this.resetState)}static cacheHexString;i0;i1;i2;i3;setFromBytes(t,e=0){this.i0=t[e]<<16|t[e+1]<<8|t[e+2],this.i1=t[e+3]<<16|t[e+4]<<8|t[e+5],this.i2=t[e+6]<<16|t[e+7]<<8|t[e+8],this.i3=t[e+9]<<16|t[e+10]<<8|t[e+11]}setFromHex(t){const e=ne;this.i0=e[t.charCodeAt(0)]<<20|e[t.charCodeAt(1)]<<16|e[t.charCodeAt(2)]<<12|e[t.charCodeAt(3)]<<8|e[t.charCodeAt(4)]<<4|e[t.charCodeAt(5)],this.i1=e[t.charCodeAt(6)]<<20|e[t.charCodeAt(7)]<<16|e[t.charCodeAt(8)]<<12|e[t.charCodeAt(9)]<<8|e[t.charCodeAt(10)]<<4|e[t.charCodeAt(11)],this.i2=e[t.charCodeAt(12)]<<20|e[t.charCodeAt(13)]<<16|e[t.charCodeAt(14)]<<12|e[t.charCodeAt(15)]<<8|e[t.charCodeAt(16)]<<4|e[t.charCodeAt(17)],this.i3=e[t.charCodeAt(18)]<<20|e[t.charCodeAt(19)]<<16|e[t.charCodeAt(20)]<<12|e[t.charCodeAt(21)]<<8|e[t.charCodeAt(22)]<<4|e[t.charCodeAt(23)]}constructor(t,e){if(super(),"number"==typeof e)return void this.setFromBytes(t,e);let n;if("object"==typeof t&&t&&"id"in t){if(ie.is(t)&&"number"==typeof t.i0&&"number"==typeof t.i1&&"number"==typeof t.i2&&"number"==typeof t.i3)return this.i0=t.i0,this.i1=t.i1,this.i2=t.i2,void(this.i3=t.i3);if("string"!=typeof t.id&&!ArrayBuffer.isView(t.id))throw new A("Argument passed in must have an id that is of type string or Buffer");n="toHexString"in t&&"function"==typeof t.toHexString?mt.fromHex(t.toHexString()):t.id}else n=t;if(null==n){const t=Math.floor(Date.now()/1e3),e=ie.getInc(),n=ie.PROCESS_UNIQUE??=mt.randomBytes(5);this.i0=t>>>8&16777215,this.i1=(255&t)<<16|n[0]<<8|n[1],this.i2=n[2]<<16|n[3]<<8|n[4],this.i3=16777215&e}else if(ArrayBuffer.isView(n)&&12===n.byteLength)this.setFromBytes(n instanceof Uint8Array?n:mt.toLocalBufferType(n));else{if("string"!=typeof n)throw new A("Argument passed in does not match the accepted types");if(!ie.validateHexString(n))throw new A("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.setFromHex(n),ie.cacheHexString&&te.set(this,n)}}get id(){const t=mt.allocateUnsafe(12);return t[0]=this.i0>>>16&255,t[1]=this.i0>>>8&255,t[2]=255&this.i0,t[3]=this.i1>>>16&255,t[4]=this.i1>>>8&255,t[5]=255&this.i1,t[6]=this.i2>>>16&255,t[7]=this.i2>>>8&255,t[8]=255&this.i2,t[9]=this.i3>>>16&255,t[10]=this.i3>>>8&255,t[11]=255&this.i3,t}set id(t){const e=t instanceof Uint8Array?t:mt.toLocalBufferType(t);this.setFromBytes(e),ie.cacheHexString&&te.set(this,mt.toHex(e))}static validateHexString(t){if(24!==t?.length)return!1;for(let e=0;e<24;e++){const n=t.charCodeAt(e);if(!(n>=48&&n<=57||n>=97&&n<=102||n>=65&&n<=70))return!1}return!0}toHexString(){if(ie.cacheHexString){const t=te.get(this);if(t)return t}const t=this.i0,e=this.i1,n=this.i2,i=this.i3,l=ee[t>>>16&255]+ee[t>>>8&255]+ee[255&t]+ee[e>>>16&255]+ee[e>>>8&255]+ee[255&e]+ee[n>>>16&255]+ee[n>>>8&255]+ee[255&n]+ee[i>>>16&255]+ee[i>>>8&255]+ee[255&i];return ie.cacheHexString&&te.set(this,l),l}static getInc(){return ie.index=(ie.index+1)%16777216}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ie.getInc(),n=mt.allocateUnsafe(12);Gt.setInt32BE(n,0,t);const i=this.PROCESS_UNIQUE??=mt.randomBytes(5);return n[4]=i[0],n[5]=i[1],n[6]=i[2],n[7]=i[3],n[8]=i[4],n[11]=255&e,n[10]=e>>>8&255,n[9]=e>>>16&255,n}toString(t){return"base64"===t?mt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}static is(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"ObjectId"===t._bsontype}equals(t){if(null==t)return!1;if(ie.is(t)&&"number"==typeof t.i0&&"number"==typeof t.i1&&"number"==typeof t.i2&&"number"==typeof t.i3)return this.i3===t.i3&&this.i0===t.i0&&this.i1===t.i1&&this.i2===t.i2;if("string"==typeof t)return t.toLowerCase()===this.toHexString();if("object"==typeof t&&"function"==typeof t.toHexString){const e=t.toHexString(),n=this.toHexString();return"string"==typeof e&&e.toLowerCase()===n}return!1}getTimestamp(){const t=new Date,e=256*this.i0+(this.i1>>>16);return t.setTime(1e3*e),t}static createPk(){return new ie}serializeInto(t,e){return t[e]=this.i0>>>16&255,t[e+1]=this.i0>>>8&255,t[e+2]=255&this.i0,t[e+3]=this.i1>>>16&255,t[e+4]=this.i1>>>8&255,t[e+5]=255&this.i1,t[e+6]=this.i2>>>16&255,t[e+7]=this.i2>>>8&255,t[e+8]=255&this.i2,t[e+9]=this.i3>>>16&255,t[e+10]=this.i3>>>8&255,t[e+11]=255&this.i3,12}static createFromTime(t){const e=mt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Gt.setInt32BE(e,0,t),new ie(e)}static createFromHexString(t){if(24!==t?.length)throw new A("hex string must be 24 characters");return new ie(mt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new A("base64 string must be 16 characters");return new ie(mt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ie.validateHexString(t);try{return new ie(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ie(t.$oid)}isCached(){return ie.cacheHexString&&te.has(this)}inspect(t,e,n){return n??=y,`new ObjectId(${n(this.toHexString(),e)})`}}function le(t,e,n=!1,i=!1,l=!1,o,c){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+mt.utf8ByteLength(t)+1+4+mt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=S&&e<=Y&&e>=f&&e<=W?mt.utf8ByteLength(t)+1+5:mt.utf8ByteLength(t)+1+9;case"undefined":return i||!l?mt.utf8ByteLength(t)+1+1:0;case"boolean":return mt.utf8ByteLength(t)+1+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[V]!==G)throw new $;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return mt.utf8ByteLength(t)+1+1;if("ObjectId"===e._bsontype)return mt.utf8ByteLength(t)+1+13;if(e instanceof Date||X(e))return mt.utf8ByteLength(t)+1+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||u(e))return mt.utf8ByteLength(t)+1+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return mt.utf8ByteLength(t)+1+9;if("Decimal128"===e._bsontype)return mt.utf8ByteLength(t)+1+17;if("Int32"===e._bsontype)return mt.utf8ByteLength(t)+1+5;if("Code"===e._bsontype){if(null!=e.scope&&Object.keys(e.scope).length>0){if(c.has(e.scope))throw new A("Cannot convert circular structure to BSON");return o.push({object:e.scope,ignoreUndefined:l,exit:!1}),mt.utf8ByteLength(t)+1+1+4+4+mt.utf8ByteLength(e.code.toString())+1}return mt.utf8ByteLength(t)+1+1+4+mt.utf8ByteLength(e.code.toString())+1}if("Binary"===e._bsontype){const n=e;return n.sub_type===Vt.SUBTYPE_BYTE_ARRAY?mt.utf8ByteLength(t)+1+(n.position+1+4+1+4):mt.utf8ByteLength(t)+1+(n.position+1+4+1)}if("BSONSymbol"===e._bsontype)return mt.utf8ByteLength(t)+1+mt.utf8ByteLength(e.value)+4+1+1;if("DBRef"===e._bsontype){const n=Object.assign({$ref:e.collection,$id:e.oid},e.fields);return null!=e.db&&(n.$db=e.db),o.push({object:n,ignoreUndefined:!0,exit:!1}),mt.utf8ByteLength(t)+1+1}if(e instanceof RegExp||h(e))return mt.utf8ByteLength(t)+1+1+mt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1;if("BSONRegExp"===e._bsontype)return mt.utf8ByteLength(t)+1+1+mt.utf8ByteLength(e.pattern)+1+mt.utf8ByteLength(e.options)+1;if(c.has(e))throw new A("Cannot convert circular structure to BSON");return o.push({object:e,ignoreUndefined:l,exit:!1}),mt.utf8ByteLength(t)+1+1;case"function":return n?mt.utf8ByteLength(t)+1+1+4+mt.utf8ByteLength(e.toString())+1:0;case"bigint":return mt.utf8ByteLength(t)+1+9;case"symbol":return 0;default:throw new A("Unrecognized JS type: "+typeof e)}}class oe extends ht{get _bsontype(){return"BSONRegExp"}pattern;options;constructor(t,e){if(super(),this.pattern=t,this.options=(e??"").split("").sort().join(""),-1!==this.pattern.indexOf("\0"))throw new A(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new A(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);for(let t=0;t<this.options.length;t++)if("i"!==this.options[t]&&"m"!==this.options[t]&&"x"!==this.options[t]&&"l"!==this.options[t]&&"s"!==this.options[t]&&"u"!==this.options[t])throw new A(`The regular expression option [${this.options[t]}] is not supported`)}static parseOptions(t){return t?t.split("").sort().join(""):""}toExtendedJSON(t){return(t=t||{}).legacy?{$regex:this.pattern,$options:this.options}:{$regularExpression:{pattern:this.pattern,options:this.options}}}static fromExtendedJSON(t){if("$regex"in t){if("string"==typeof t.$regex)return new oe(t.$regex,oe.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new oe(t.$regularExpression.pattern,oe.parseOptions(t.$regularExpression.options));throw new A(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`)}inspect(t,e,n){const i=function(t){if(null!=t&&"object"==typeof t&&"stylize"in t&&"function"==typeof t.stylize)return t.stylize}(e)??(t=>t);n??=y;return`new BSONRegExp(${i(n(this.pattern),"regexp")}, ${i(n(this.options),"regexp")})`}}class ce extends ht{get _bsontype(){return"BSONSymbol"}value;constructor(t){super(),this.value=t}valueOf(){return this.value}toString(){return this.value}toJSON(){return this.value}toExtendedJSON(){return{$symbol:this.value}}static fromExtendedJSON(t){return new ce(t.$symbol)}inspect(t,e,n){return n??=y,`new BSONSymbol(${n(this.value,e)})`}}const se=wt;class ae extends se{get _bsontype(){return"Timestamp"}get[ut](){return"Timestamp"}static MAX_VALUE=wt.MAX_UNSIGNED_VALUE;get i(){return this.low>>>0}get t(){return this.high>>>0}constructor(t){if(null==t)super(0,0,!0);else if("bigint"==typeof t)super(t,!0);else if(wt.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new A("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");{if("number"!=typeof t.t&&("object"!=typeof t.t||"Int32"!==t.t._bsontype))throw new A("Timestamp constructed from { t, i } must provide t as a number");if("number"!=typeof t.i&&("object"!=typeof t.i||"Int32"!==t.i._bsontype))throw new A("Timestamp constructed from { t, i } must provide i as a number");const e=Number(t.t),n=Number(t.i);if(e<0||Number.isNaN(e))throw new A("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new A("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new A("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new A("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");super(n,e,!0)}}}toJSON(){return{$timestamp:this.toString()}}static fromInt(t){return new ae(wt.fromInt(t,!0))}static fromNumber(t){return new ae(wt.fromNumber(t,!0))}static fromBits(t,e){return new ae({i:t,t:e})}static fromString(t,e){return new ae(wt.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=wt.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=wt.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new ae({t:n,i:e})}inspect(t,e,n){n??=y;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=wt.fromNumber(Y),be=wt.fromNumber(S);function re(t,e,n){const i=(e=null==e?{}:e)&&e.index?e.index:0,l=Gt.getInt32LE(t,i);if(l<5)throw new A(`bson size must be >= 5, is ${l}`);if(e.allowObjectSmallerThanBufferSize&&t.length<l)throw new A(`buffer length ${t.length} must be >= bson size ${l}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==l)throw new A(`buffer length ${t.length} must === bson size ${l}`);if(l+i>t.byteLength)throw new A(`(bson size ${l} + options.index ${i} must be <= buffer length ${t.byteLength})`);if(0!==t[i+l-1])throw new A("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return function(t,e,n,i=!1){n={...n};const l=null==n.fieldsAsRaw?null:n.fieldsAsRaw,o=null!=n.raw&&n.raw,c="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,a=n.promoteLongs??!0,d=n.promoteValues??!0,b=n.useBigInt64??!1;if(b&&!d)throw new A("Must either request bigint or Long for int64 deserialization");if(b&&!a)throw new A("Must either request bigint or Long for int64 deserialization");const r=null==n.validation?{utf8:!0}:n.validation;let Z,m,u=!0;const h=r.utf8;if("boolean"==typeof h)Z=h;else{u=!1;const t=Object.keys(h).map((function(t){return h[t]}));if(0===t.length)throw new A("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new A("Invalid UTF-8 validation option, must specify boolean values");if(Z=t[0],!t.every((t=>t===Z)))throw new A("Invalid UTF-8 validation option - keys must be all true or all false")}if(!u){m=new Set;for(const t of Object.keys(h))m.add(t)}const p=e;if(t.length<5)throw new A("corrupt bson message < 5 bytes long");const X=Gt.getInt32LE(t,e);if(e+=4,X<5||X>t.length)throw new A("corrupt bson message");const y=i?[]:{};let G=0,V=!i&&null,W=null,f=y,g=i;for(;;){const n=t[e++];if(0===n){if(W){if(e===W.lastIndex){const t=W;W=t.prev,null===W?(f=y,g=i):(f=W.holdingDocument,g=W.isArray);let e=t.holdingDocument;switch(t.elementType){case x:t.isPossibleDBRef&&(e=ue(e));break;case K:break;case C:e=new Yt(t.functionString,t.holdingDocument);break;default:throw new A("Unexpected element type in frame stack")}me(f,t.propertyName,e);continue}if(W.elementType===K)throw new A("corrupted array bson");throw new A("Bad BSON Document: object not properly terminated")}break}let r=e;for(;0!==t[r]&&r<t.length;)r++;if(r>=t.byteLength)throw new A("Bad BSON Document: illegal CString");const h=g?null!==W?W.arrayIndex++:G++:mt.toUTF8(t,e,r,!1);let p,X;p=null!==W?W.validationSetting:u||m?.has(h)?Z:!Z,null!==W?!1!==W.isPossibleDBRef&&"string"==typeof h&&"$"===h[0]&&(W.isPossibleDBRef=Ze.test(h)):!1!==V&&"$"===h[0]&&(V=Ze.test(h));let I=!1;if(e=r+1,n===R){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");X=mt.toUTF8(t,e,e+n-1,p),e+=n}else if(n===U)X=new ie(t,e),e+=12;else if(n===v&&!1===d)X=new At(Gt.getInt32LE(t,e)),e+=4;else if(n===v)X=Gt.getInt32LE(t,e),e+=4;else if(n===J)X=Gt.getFloat64LE(t,e),e+=8,!1===d&&(X=new Dt(X));else if(n===z){const n=Gt.getInt32LE(t,e),i=Gt.getInt32LE(t,e+4);e+=8,X=new Date(new wt(n,i).toNumber())}else if(n===N){if(0!==t[e]&&1!==t[e])throw new A("illegal boolean type value");X=1===t[e++]}else if(n===x){const n=Gt.getInt32LE(t,e);if(n<5||n>t.length-e)throw new A("bad embedded document length in bson");if(o||W?.raw)X=t.subarray(e,e+n),e+=n;else{I=!0;const t={holdingDocument:{},elementType:x,propertyName:h,functionString:null,lastIndex:e+n,isArray:!1,arrayIndex:0,raw:!1,isPossibleDBRef:null,validationSetting:p,prev:W};W=t,f=t.holdingDocument,g=!1,e+=4}}else if(n===K){const n=Gt.getInt32LE(t,e);if(n<5||n>t.length-e)throw new A("bad embedded array length in bson");const i=e+n,o=!(!l||!l[h])||(W?.raw??!1);I=!0;const c={holdingDocument:[],elementType:K,propertyName:h,functionString:null,lastIndex:i,isArray:!0,arrayIndex:0,raw:o,isPossibleDBRef:!1,validationSetting:p,prev:W};W=c,f=c.holdingDocument,g=!0,e+=4}else if(n===T)X=void 0;else if(n===w)X=null;else if(n===P)if(b)X=Gt.getBigInt64LE(t,e),e+=8;else{const n=Gt.getInt32LE(t,e),i=Gt.getInt32LE(t,e+4);e+=8;const l=new wt(n,i);X=a&&!0===d&&l.lessThanOrEqual(de)&&l.greaterThanOrEqual(be)?l.toNumber():l}else if(n===F){const n=mt.allocateUnsafe(16);for(let i=0;i<16;i++)n[i]=t[e+i];e+=16,X=new _t(n)}else if(n===L){let n=Gt.getInt32LE(t,e);e+=4;const i=n,l=t[e++];if(n<0)throw new A("Negative binary type element size found");if(n>t.byteLength)throw new A("Binary type size larger than document size");if(l===Vt.SUBTYPE_BYTE_ARRAY){if(n=Gt.getInt32LE(t,e),e+=4,n<0)throw new A("Negative binary type element size found for subtype 0x02");if(n>i-4)throw new A("Binary type with subtype 0x02 contains too long binary size");if(n<i-4)throw new A("Binary type with subtype 0x02 contains too short binary size")}s&&d?X=mt.toLocalBufferType(t.subarray(e,e+n)):(X=new Vt(t.subarray(e,e+n),l),l===_&&It.isValid(X)&&(X=X.toUUID())),e+=n}else if(n===k&&!1===c){for(r=e;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,r,!1);for(r=e=r+1;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const i=mt.toUTF8(t,e,r,!1);e=r+1;const l=new Array(i.length);for(r=0;r<i.length;r++)switch(i[r]){case"m":l[r]="m";break;case"s":l[r]="g";break;case"i":l[r]="i"}X=new RegExp(n,l.join(""))}else if(n===k&&!0===c){for(r=e;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,r,!1);for(r=e=r+1;0!==t[r]&&r<t.length;)r++;if(r>=t.length)throw new A("Bad BSON Document: illegal CString");const i=mt.toUTF8(t,e,r,!1);e=r+1,X=new oe(n,i)}else if(n===j){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);X=d?i:new ce(i),e+=n}else if(n===M)X=new ae({i:Gt.getUint32LE(t,e),t:Gt.getUint32LE(t,e+4)}),e+=8;else if(n===Q)X=new qt;else if(n===E)X=new $t;else if(n===B){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);X=new Yt(i),e+=n}else if(n===C){const n=Gt.getInt32LE(t,e);if(e+=4,n<13)throw new A("code_w_scope total size shorter minimum expected length");const i=Gt.getInt32LE(t,e);if(e+=4,i<=0||i>t.length-e||0!==t[e+i-1])throw new A("bad string length in bson");const l=mt.toUTF8(t,e,e+i-1,p),o=e+=i,c=Gt.getInt32LE(t,e);if(c<5||c>t.length-e)throw new A("bad scope document size in code_w_scope");if(n<8+c+i)throw new A("code_w_scope total size is too short, truncating scope");if(n>8+c+i)throw new A("code_w_scope total size is too long, clips outer document");I=!0;const s={holdingDocument:{},elementType:C,propertyName:h,functionString:l,lastIndex:o+c,isArray:!1,arrayIndex:0,raw:!1,isPossibleDBRef:null,validationSetting:p,prev:W};W=s,f=s.holdingDocument,g=!1,e+=4}else{if(n!==H)throw new A(`Detected unknown BSON type ${n.toString(16)} for fieldname "${h}"`);{const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=mt.toUTF8(t,e,e+n-1,p);e+=n;const l=mt.allocateUnsafe(12);for(let n=0;n<12;n++)l[n]=t[e+n];const o=new ie(l);e+=12,X=new Jt(i,o)}}I||me(f,h,X)}if(null!==W)throw new A("corrupted bson, more objects expected based on the current document size");const I=y;if(X!==e-p){if(i)throw new A("corrupt array bson");throw new A("corrupt object bson")}return V?ue(I):I}(t,i,e,n)}const Ze=/^\$ref$|^\$id$|^\$db$/;function me(t,e,n){"__proto__"===e?Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0}):t[e]=n}function ue(t){if(St(t)){const{$ref:e,$id:n,$db:i,...l}=t;return new Jt(e,n,i,l)}return t}const he=/\x00/,pe=new Set(["$db","$ref","$id","$clusterTime"]);function Xe(t,e,n,i){t[i++]=R;t[(i=i+mt.encodeUTF8Into(t,e,i)+1)-1]=0;const l=mt.encodeUTF8Into(t,n,i+4);return Gt.setInt32LE(t,i,l+1),i=i+4+l,t[i++]=0,i}function ye(t,e,n,i){const l=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=W&&n>=f?v:J;t[i++]=l;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=l===v?Gt.setInt32LE(t,i,n):Gt.setFloat64LE(t,i,n)}function Ge(t,e,n,i){t[i++]=P;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setBigInt64LE(t,i,n)}function Ve(t,e,n,i){t[i++]=w;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i}function We(t,e,n,i){t[i++]=N;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,t[i++]=n?1:0,i}function fe(t,e,n,i){t[i++]=z;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=wt.fromNumber(n.getTime()),o=l.getLowBits(),c=l.getHighBits();return i+=Gt.setInt32LE(t,i,o),i+=Gt.setInt32LE(t,i,c)}function ge(t,e,n,i){t[i++]=k;if(i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,n.source&&null!=n.source.match(he))throw new A("value "+n.source+" must not contain null bytes");return i+=mt.encodeUTF8Into(t,n.source,i),t[i++]=0,n.ignoreCase&&(t[i++]=105),n.global&&(t[i++]=115),n.multiline&&(t[i++]=109),t[i++]=0,i}function Ie(t,e,n,i){t[i++]=k;if(i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,null!=n.pattern.match(he))throw new A("pattern "+n.pattern+" must not contain null bytes");i+=mt.encodeUTF8Into(t,n.pattern,i),t[i++]=0;const l=n.options.split("").sort().join("");return i+=mt.encodeUTF8Into(t,l,i),t[i++]=0,i}function Ye(t,e,n,i){null===n?t[i++]=w:"MinKey"===n[ut]?t[i++]=Q:t[i++]=E;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Se(t,e,n,i){t[i++]=U;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=n.serializeInto(t,i)}function Je(t,e,n,i){t[i++]=L;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.length;if(i+=Gt.setInt32LE(t,i,l),t[i++]=O,l<=16)for(let e=0;e<l;e++)t[i+e]=n[e];else t.set(n,i);return i+=l}function Re(t,e,n,i){t[i++]=F;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;for(let e=0;e<16;e++)t[i+e]=n.bytes[e];return i+16}function xe(t,e,n,i){t[i++]="Long"===n[ut]?P:M;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.getLowBits(),o=n.getHighBits();return i+=Gt.setInt32LE(t,i,l),i+=Gt.setInt32LE(t,i,o)}function Ke(t,e,n,i){n=n.valueOf(),t[i++]=v;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setInt32LE(t,i,n)}function Le(t,e,n,i){t[i++]=J;return i+=mt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Gt.setFloat64LE(t,i,n.value)}function Te(t,e,n,i){t[i++]=B;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.toString(),o=mt.encodeUTF8Into(t,l,i+4)+1;return Gt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0,i}function Ue(t,e,n,i){t[i++]=L;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.buffer;let o=n.position;if(n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o+=4),i+=Gt.setInt32LE(t,i,o),t[i++]=n.sub_type,n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o-=4,i+=Gt.setInt32LE(t,i,o)),n.sub_type===Vt.SUBTYPE_VECTOR&&Wt(n),o<=16)for(let e=0;e<o;e++)t[i+e]=l[e];else t.set(l,i);return i+=n.position}function Ne(t,e,n,i){t[i++]=j;i+=mt.encodeUTF8Into(t,e,i),t[i++]=0;const l=mt.encodeUTF8Into(t,n.value,i+4)+1;return Gt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0,i}function ze(t,e,n,i,l,o){if(Array.isArray(t))return{sourceObject:t,isArray:!0,objectSizeIndex:e,codeSizeIndex:n,iterTarget:t,keys:null,keyIndex:0,mapIterator:null,prev:i,checkKeys:l,ignoreUndefined:o};if(t instanceof Map||p(t))return{sourceObject:t,isArray:!1,objectSizeIndex:e,codeSizeIndex:n,iterTarget:t,keys:null,keyIndex:0,mapIterator:t.entries(),prev:i,checkKeys:l,ignoreUndefined:o};let c=t;if("function"==typeof c?.toBSON&&(c=c.toBSON(),null!=c&&"object"!=typeof c))throw new A("toBSON function did not return an object");return{sourceObject:t,isArray:!1,objectSizeIndex:e,codeSizeIndex:n,iterTarget:c,keys:Object.keys(c),keyIndex:0,mapIterator:null,prev:i,checkKeys:l,ignoreUndefined:o}}function we(t,e,n,i,l,o,c){if(null==c){if(null==e)return t[0]=5,t[1]=0,t[2]=0,t[3]=0,t[4]=0,5;if(Array.isArray(e))throw new A("serialize does not support an array as the root input");if("object"!=typeof e)throw new A("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new A("BSON types cannot be serialized as a document");if(X(e)||h(e)||m(e)||u(e))throw new A("date, regexp, typedarray, and arraybuffer cannot be BSON documents");c=new Set}c.add(e);let s=ze(e,i,null,null,n,o),a=i+4;for(;null!==s;){const e=s;let n,i;if(null!==e.mapIterator){const l=e.mapIterator.next();if(l.done){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}n=l.value[0],i=l.value[1]}else if(null!==e.keys){if(e.keyIndex>=e.keys.length){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}n=e.keys[e.keyIndex++],i=e.iterTarget[n]}else{const l=e.iterTarget;if(e.keyIndex>=l.length){t[a++]=0,Gt.setInt32LE(t,e.objectSizeIndex,a-e.objectSizeIndex),null!==e.codeSizeIndex&&Gt.setInt32LE(t,e.codeSizeIndex,a-e.codeSizeIndex),c.delete(e.sourceObject),s=e.prev;continue}const o=e.keyIndex++;n=String(o),i=l[o]}if("function"==typeof i?.toBSON&&(i=i.toBSON()),!(e.isArray||"string"!=typeof n||"$"===n[0]&&pe.has(n))){if(he.test(n))throw new A("key "+n+" must not contain null bytes");if(e.checkKeys){if("$"===n[0])throw new A("key "+n+" must not start with '$'");if(n.includes("."))throw new A("key "+n+" must not contain '.'")}}const o=typeof i;if(void 0===i)(e.isArray||!1===e.ignoreUndefined)&&(a=Ve(t,n,0,a));else if(null===i)a=Ve(t,n,0,a);else if("string"===o)a=Xe(t,n,i,a);else if("number"===o)a=ye(t,n,i,a);else if("bigint"===o)a=Ge(t,n,i,a);else if("boolean"===o)a=We(t,n,i,a);else if("object"===o&&null==i._bsontype)if(i instanceof Date||X(i))a=fe(t,n,i,a);else if(i instanceof Uint8Array||m(i))a=Je(t,n,i,a);else if(i instanceof RegExp||h(i))a=ge(t,n,i,a);else{if(c.has(i))throw new A("Cannot convert circular structure to BSON");const l=Array.isArray(i);t[a++]=l?K:x,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const o=a;c.add(i),s=ze(i,o,null,e,e.checkKeys,e.ignoreUndefined),a+=4}else if("object"===o){if(i[V]!==G)throw new $;const l=i[ut];if("ObjectId"===l)a=Se(t,n,i,a);else if("Decimal128"===l)a=Re(t,n,i,a);else if("Long"===l||"Timestamp"===l)a=xe(t,n,i,a);else if("Double"===l)a=Le(t,n,i,a);else if("Code"===l){const l=i;if(l.scope&&"object"==typeof l.scope){t[a++]=C,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const i=a;a+=4;const o=l.code,d=mt.encodeUTF8Into(t,o,a+4)+1;Gt.setInt32LE(t,a,d),t[a+4+d-1]=0,a=a+d+4;const b=l.scope;if(c.has(b))throw new A("Cannot convert circular structure to BSON");c.add(b),s=ze(b,a,i,e,e.checkKeys,e.ignoreUndefined),a+=4}else{t[a++]=B,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0;const e=l.code.toString(),i=mt.encodeUTF8Into(t,e,a+4)+1;Gt.setInt32LE(t,a,i),a=a+4+i-1,t[a++]=0}}else if("Binary"===l)a=Ue(t,n,i,a);else if("BSONSymbol"===l)a=Ne(t,n,i,a);else if("DBRef"===l){const l=i,o=Object.assign({$ref:l.collection,$id:l.oid},null!=l.db?{$db:l.db}:null,l.fields);t[a++]=x,a+=mt.encodeUTF8Into(t,n,a),t[a++]=0,c.add(o),s=ze(o,a,null,e,!1,!0),a+=4}else if("BSONRegExp"===l)a=Ie(t,n,i,a);else if("Int32"===l)a=Ke(t,n,i,a);else if("MinKey"===l||"MaxKey"===l)a=Ye(t,n,i,a);else if(void 0!==i._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(i._bsontype)}`)}else"function"===o&&l&&(a=Te(t,n,i,a))}return a}const ke={$oid:ie,$binary:Vt,$uuid:Vt,$symbol:ce,$numberInt:At,$numberDecimal:_t,$numberDouble:Dt,$numberLong:wt,$minKey:qt,$maxKey:$t,$regex:oe,$regularExpression:oe,$timestamp:ae};function He(t,e={}){if("number"==typeof t){const n=t<=W&&t>=f,i=t<=g&&t>=I;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new At(t);if(i)return e.useBigInt64?BigInt(t):wt.fromNumber(t)}return new Dt(t)}if(null==t||"object"!=typeof t)return t;if(t.$undefined)return null;const n=Object.keys(t).filter((e=>e.startsWith("$")&&null!=t[e]));for(let i=0;i<n.length;i++){const l=ke[n[i]];if(l)return l.fromExtendedJSON(t,e)}if(null!=t.$date){const n=t.$date,i=new Date;if(e.legacy)if("number"==typeof n)i.setTime(n);else if("string"==typeof n)i.setTime(Date.parse(n));else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}else if("string"==typeof n)i.setTime(Date.parse(n));else if(wt.isLong(n))i.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)i.setTime(n);else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}return i}if(null!=t.$code){const e=Object.assign({},t);return t.$scope&&(e.$scope=He(t.$scope)),Yt.fromExtendedJSON(t)}if(St(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof Jt)return e;const n=Object.keys(e).filter((t=>t.startsWith("$")));let i=!0;if(n.forEach((t=>{-1===["$ref","$id","$db"].indexOf(t)&&(i=!1)})),i)return Jt.fromExtendedJSON(e)}return t}function Be(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function je(t,e){if(t instanceof Map||p(t)){const n=Object.create(null);for(const[e,i]of t){if("string"!=typeof e)throw new A("Can only serialize maps with string keys");n[e]=i}return je(n,e)}if(("object"==typeof t||"function"==typeof t)&&null!==t){const n=e.seenObjects.findIndex((e=>e.obj===t));if(-1!==n){const t=e.seenObjects.map((t=>t.propertyName)),i=t.slice(0,n).map((t=>`${t} -> `)).join(""),l=t[n],o=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),c=t[t.length-1],s=" ".repeat(i.length+l.length/2),a="-".repeat(o.length+(l.length+c.length)/2-1);throw new A(`Converting circular structure to EJSON:\n ${i}${l}${o}${c}\n ${s}\\${a}/`)}e.seenObjects[e.seenObjects.length-1].obj=t}if(Array.isArray(t))return function(t,e){return t.map(((t,n)=>{e.seenObjects.push({propertyName:`index ${n}`,obj:null});try{return je(t,e)}finally{e.seenObjects.pop()}}))}(t,e);if(void 0===t)return e.ignoreUndefined?void 0:null;if(t instanceof Date||X(t)){const n=t.getTime(),i=n>-1&&n<2534023008e5;return e.legacy?e.relaxed&&i?{$date:t.getTime()}:{$date:Be(t)}:e.relaxed&&i?{$date:Be(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=f&&t<=W)return{$numberInt:t.toString()};if(t>=I&&t<=g)return{$numberLong:t.toString()}}return{$numberDouble:Object.is(t,-0)?"-0.0":t.toString()}}if("bigint"==typeof t)return e.relaxed?Number(BigInt.asIntN(64,t)):{$numberLong:BigInt.asIntN(64,t).toString()};if(t instanceof RegExp||h(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new oe(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new A("not an object instance");const n=t._bsontype;if(void 0===n){const n={};for(const i of Object.keys(t)){e.seenObjects.push({propertyName:i,obj:null});try{const l=je(t[i],e);"__proto__"===i?Object.defineProperty(n,i,{value:l,writable:!0,enumerable:!0,configurable:!0}):n[i]=l}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[V]!==G)throw new $;if(function(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"string"==typeof t._bsontype}(t)){let i=t;if("function"!=typeof i.toExtendedJSON){const e=Ce[t._bsontype];if(!e)throw new A("Unrecognized or invalid _bsontype: "+t._bsontype);i=e(i)}return"Code"===n&&i.scope?i=new Yt(i.code,je(i.scope,e)):"DBRef"===n&&i.oid&&(i=new Jt(je(i.collection,e),je(i.oid,e),je(i.db,e),je(i.fields,e))),i.toExtendedJSON(e)}throw new A("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const Ce={Binary:t=>new Vt(t.value(),t.sub_type),Code:t=>new Yt(t.code,t.scope),DBRef:t=>new Jt(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new _t(t.bytes),Double:t=>new Dt(t.value),Int32:t=>new At(t.value),Long:t=>wt.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new $t,MinKey:()=>new qt,ObjectId:t=>new ie(t),BSONRegExp:t=>new oe(t.pattern,t.options),BSONSymbol:t=>new ce(t.value),Timestamp:t=>ae.fromBits(t.low,t.high)};function ve(t,e){const n={useBigInt64:e?.useBigInt64??!1,relaxed:e?.relaxed??!0,legacy:e?.legacy??!1};return JSON.parse(t,((t,e)=>{if(-1!==t.indexOf("\0"))throw new A(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return He(e,n)}))}function Me(t,e,n,i){null!=n&&"object"==typeof n&&(i=n,n=void 0),null==e||"object"!=typeof e||Array.isArray(e)||(i=e,e=void 0);const l=je(t,Object.assign({relaxed:!0,legacy:!1},i,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(l,e,n)}const Pe=Object.create(null);Pe.parse=ve,Pe.stringify=Me,Pe.serialize=function(t,e){return e=e||{},JSON.parse(Me(t,e))},Pe.deserialize=function(t,e){return e=e||{},ve(JSON.stringify(t),e)},Object.freeze(Pe);const Fe=1,Qe=2,Ee=3,Oe=4,_e=5,De=6,Ae=7,$e=8,qe=9,tn=10,en=11,nn=12,ln=13,on=14,cn=15,sn=16,an=17,dn=18,bn=19,rn=255,Zn=127;function mn(t,e){try{return Gt.getNonnegativeInt32LE(t,e)}catch(t){throw new tt("BSON size cannot be negative",e,{cause:t})}}function un(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new tt("Null terminator not found",e);return n}const hn=Object.create(null);hn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new tt(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=mn(t,e);if(n>t.length-e)throw new tt(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new tt("BSON documents must end in 0x00",e+n);const i=[];let l=e+4;for(;l<=n+e;){const o=t[l];if(l+=1,0===o){if(l-e!==n)throw new tt("Invalid 0x00 type byte",l);break}const c=l,s=un(t,l)-c;let a;if(l+=s+1,o===Fe||o===dn||o===qe||o===an)a=8;else if(o===sn)a=4;else if(o===Ae)a=12;else if(o===bn)a=16;else if(o===$e)a=1;else if(o===tn||o===De||o===Zn||o===rn)a=0;else if(o===en)a=un(t,un(t,l)+1)+1-l;else if(o===Ee||o===Oe||o===cn)a=mn(t,l);else{if(o!==Qe&&o!==_e&&o!==nn&&o!==ln&&o!==on)throw new tt(`Invalid 0x${o.toString(16).padStart(2,"0")} type byte`,l);a=mn(t,l)+4,o===_e&&(a+=1),o===nn&&(a+=12)}if(a>n)throw new tt("value reports length larger than document",l);i.push([o,c,s,l,a]),l+=a}return i},hn.ByteUtils=mt,hn.NumberUtils=Gt,Object.freeze(hn);const pn=17825792;let Xn=mt.allocate(pn);var yn=Object.freeze({__proto__:null,BSONError:A,BSONOffsetError:tt,BSONRegExp:oe,BSONRuntimeError:q,BSONSymbol:ce,BSONType:D,BSONValue:ht,BSONVersionError:$,Binary:Vt,ByteUtils:mt,Code:Yt,DBRef:Jt,Decimal128:_t,Double:Dt,EJSON:Pe,Int32:At,Long:wt,MaxKey:$t,MinKey:qt,NumberUtils:Gt,ObjectId:ie,Timestamp:ae,UUID:It,bsonType:ut,calculateObjectSize:function(t,e={}){return function(t,e,n){const i=[{object:t,ignoreUndefined:n??!1,exit:!1}],l=new Set;let o=0;for(;i.length>0;){const t=i.pop();if(t.exit){l.delete(t.object);continue}const{object:n,ignoreUndefined:c}=t;l.add(n),t.exit=!0,i.push(t),o+=5;const s=Array.isArray(n),a=!s&&(n instanceof Map||p(n));let d=n;if(s||a||"function"!=typeof n?.toBSON||(d=n.toBSON()),s){const t=d;for(let n=0;n<t.length;n++)o+=le(n.toString(),t[n],e,!0,c,i,l)}else if(a)for(const[t,n]of d)o+=le(t,n,e,!1,c,i,l);else for(const t of Object.keys(d))o+=le(t,d[t],e,!1,c,i,l)}return o}(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return re(mt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,i,l,o){const c=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},o),s=mt.toLocalBufferType(t);let a=e;for(let t=0;t<n;t++){const e=Gt.getInt32LE(s,a);c.index=a,i[l+t]=re(s,c),a+=e}return a},onDemand:hn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,i="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,l="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,o="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:pn;Xn.length<o&&(Xn=mt.allocate(o));const c=we(Xn,t,n,0,i,l,null),s=mt.allocateUnsafe(c);return s.set(Xn.subarray(0,c),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const i="boolean"==typeof n.checkKeys&&n.checkKeys,l="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,o="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,c="number"==typeof n.index?n.index:0,s=we(Xn,t,i,0,l,o,null);return e.set(Xn.subarray(0,s),c),c+s-1},setInternalBufferSize:function(t){Xn.length<t&&(Xn=mt.allocate(t))}});function Gn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function Vn({client:t,limit:e,page_token:i}){const l="/user/factory/finishes"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Wn({client:t,limit:e,page_token:i}){const l="/user/factory/materials"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function fn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/factory/jobs"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function gn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/factory/jobs"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function In({client:t,limit:e,page_token:i,sort_by:l}){const c="/ml/conversations"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Yn({client:t,limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}){const d="/user/text-to-cad"+n({limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}),b=(t?.baseUrl||"https://api.zoo.dev")+d,r=t&&t.token||"",Z={};r&&(Z.Authorization=`Bearer ${r}`);const m={method:"GET",headers:Z},u=t?.fetch||fetch,h=await u(b,m);await o(h);return await h.json()}class Sn{constructor(){}static urlConstructFrom(t){const e="/ws/modeling/commands"+n({video_res_width:t.video_res_width,video_res_height:t.video_res_height,fps:t.fps,unlocked_framerate:t.unlocked_framerate,post_effect:t.post_effect,webrtc:t.webrtc,geometry_only:t.geometry_only,pool:t.pool,show_grid:t.show_grid,replay:t.replay,api_call_id:t.api_call_id,order_independent_transparency:t.order_independent_transparency,kcl_version:t.kcl_version,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}}async function Jn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Rn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function xn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Kn({client:t,id:e,limit:i,page_token:l,sort_by:c,filter:s,q:a,phase:d}){const b=`/org/datasets/${e}/conversions`+n({limit:i,page_token:l,sort_by:c,filter:s,q:a,phase:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);await o(p);return await p.json()}async function Ln({client:t,limit:e,page_token:i,lookup_enabled:l,sort_by:c}){const s="/org/datasets"+n({limit:e,page_token:i,lookup_enabled:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function Tn({client:t,limit:e,page_token:i,sort_by:l,role:c}){const s="/org/members"+n({limit:e,page_token:i,sort_by:l,role:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const r={method:"GET",headers:b},Z=t?.fetch||fetch,m=await Z(a,r);await o(m);return await m.json()}async function Un({client:t,limit:e,page_token:i}){const l="/org/skills"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Nn({client:t,id:e,limit:i,page_token:l,q:c,sort_by:s,filter:a,phase:d}){const b=`/org/datasets/${e}/search/conversions`+n({limit:i,page_token:l,q:c,sort_by:s,filter:a,phase:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);await o(p);return await p.json()}async function zn({client:t,limit:e,page_token:i}){const l="/org/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function wn({client:t,limit:e,page_token:i}){const l="/user/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function kn({client:t,limit:e,page_token:i}){const l="/org/payment/methods"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Hn({client:t,limit:e,page_token:i}){const l="/user/payment/methods"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function Bn({client:t,id:e,limit:i,page_token:l}){const c=`/user/projects/${e}/share-links`+n({limit:i,page_token:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function jn({client:t,id:e,limit:i,page_token:l}){const c=`/user/projects/${e}/versions`+n({limit:i,page_token:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Cn({client:t,limit:e,page_token:i}){const l="/projects/public"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r);return await r.json()}async function vn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/service-accounts"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}async function Mn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);await o(Z);return await Z.json()}var Pn=null;try{var Fn="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");Pn=Fn.Worker}catch(t){}function Qn(t,e,n){var i=void 0===e?null:e,l=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:"");return function(t){return new Pn(c,Object.assign({},t,{eval:!0}))}}function En(t,e,n){var i=void 0===e?null:e,l=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),l=0,o=n.length;l<o;++l)i[l]=n.charCodeAt(l);return new TextDecoder("utf-16le").decode(new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:""),s=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(s)}var On="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function _n(t,e,n){return On?Qn(t,e,n):function(t,e,n){var i;return function(l){return i=i||En(t,e,n),new Worker(i,l)}}(t,e,n)}var Dn=_n("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGx7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGwoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1fKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBmKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBiKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpkKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgseD1NYXRoLnBvdygyLDYzKS0xLEI9LU1hdGgucG93KDIsNjMpLFU9TWF0aC5wb3coMiw1MyksRT0tTWF0aC5wb3coMiw1MyksST0xLE89MixOPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxqPTksUj0xMCxGPTExLGs9MTIsej0xMyxDPTE0LEQ9MTUsVj0xNixNPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5OmYsdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IF9lPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxsZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Zix0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFsZS50ZXN0KHIpKWJyZWFrO2lmKCFsZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6X2Usc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sZmU9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBkZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGJlPW5ldyBVaW50OEFycmF5KGRlLmJ1ZmZlciwwLDgpO2RlWzBdPS0xO2NvbnN0IHdlPTA9PT1iZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGJlWzddPWVbdF0sYmVbNl09ZVt0KzFdLGJlWzVdPWVbdCsyXSxiZVs0XT1lW3QrM10sYmVbM109ZVt0KzRdLGJlWzJdPWVbdCs1XSxiZVsxXT1lW3QrNl0sYmVbMF09ZVt0KzddLGRlWzBdKTooZSx0KT0+KGJlWzBdPWVbdF0sYmVbMV09ZVt0KzFdLGJlWzJdPWVbdCsyXSxiZVszXT1lW3QrM10sYmVbNF09ZVt0KzRdLGJlWzVdPWVbdCs1XSxiZVs2XT1lW3QrNl0sYmVbN109ZVt0KzddLGRlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oZGVbMF09bixlW3RdPWJlWzddLGVbdCsxXT1iZVs2XSxlW3QrMl09YmVbNV0sZVt0KzNdPWJlWzRdLGVbdCs0XT1iZVszXSxlW3QrNV09YmVbMl0sZVt0KzZdPWJlWzFdLGVbdCs3XT1iZVswXSw4KTooZSx0LG4pPT4oZGVbMF09bixlW3RdPWJlWzBdLGVbdCsxXT1iZVsxXSxlW3QrMl09YmVbMl0sZVt0KzNdPWJlWzNdLGVbdCs0XT1iZVs0XSxlW3QrNV09YmVbNV0sZVt0KzZdPWJlWzZdLGVbdCs3XT1iZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPTI1NSYodD8/eWUuQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUKSxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1mZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9mZS5mcm9tTnVtYmVyQXJyYXkoZSk6ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1mZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KGZlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gZmUudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP2ZlLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9mZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpmZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1mZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyBCZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiAoJHt0eXBlb2YgdGhpcy5zdWJfdHlwZX0pIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbnZlcnRpbmcgdG8gVVVJRC4gT25seSAweCR7eWUuU1VCVFlQRV9VVUlELnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCl9c3RhdGljIGNyZWF0ZUZyb21IZXhTdHJpbmcoZSx0KXtyZXR1cm4gbmV3IHllKGZlLmZyb21IZXgoZSksdCl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSx0KXtyZXR1cm4gbmV3IHllKGZlLmZyb21CYXNlNjQoZSksdCl9c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtsZXQgbixyO2lmKHQ9dHx8e30sIiRiaW5hcnkiaW4gZT90LmxlZ2FjeSYmInN0cmluZyI9PXR5cGVvZiBlLiRiaW5hcnkmJiIkdHlwZSJpbiBlPyhyPWUuJHR5cGU/cGFyc2VJbnQoZS4kdHlwZSwxNik6MCxuPWZlLmZyb21CYXNlNjQoZS4kYmluYXJ5KSk6InN0cmluZyIhPXR5cGVvZiBlLiRiaW5hcnkmJihyPWUuJGJpbmFyeS5zdWJUeXBlP3BhcnNlSW50KGUuJGJpbmFyeS5zdWJUeXBlLDE2KTowLG49ZmUuZnJvbUJhc2U2NChlLiRiaW5hcnkuYmFzZTY0KSk6IiR1dWlkImluIGUmJihyPTQsbj1CZS5ieXRlc0Zyb21TdHJpbmcoZS4kdXVpZCkpLCFuKXRocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJpbmFyeSBFeHRlbmRlZCBKU09OIGZvcm1hdCAke0pTT04uc3RyaW5naWZ5KGUpfWApO3JldHVybiByPT09SD9uZXcgQmUobik6bmV3IHllKG4scil9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYEJpbmFyeS5jcmVhdGVGcm9tQmFzZTY0KCR7bihmZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKSx0KX0sICR7bih0aGlzLnN1Yl90eXBlLHQpfSlgfXRvSW50OEFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuSW50OCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBJbnQ4Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBJbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKX10b0Zsb2F0MzJBcnJheSgpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzIpdGhyb3cgbmV3IFooIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgRmxvYXQzMiIpO21lKHRoaXMpO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKTtyZXR1cm4gcGUuaXNCaWdFbmRpYW4mJmZlLnN3YXAzMihlKSxuZXcgRmxvYXQzMkFycmF5KGUuYnVmZmVyKX10b1BhY2tlZEJpdHMoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQpdGhyb3cgbmV3IFooIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgcGFja2VkIGJpdCIpO3JldHVybiBtZSh0aGlzKSxuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7bWUodGhpcyk7Y29uc3QgZT04Kih0aGlzLmxlbmd0aCgpLTIpLXRoaXMuYnVmZmVyWzFdLHQ9bmV3IEludDhBcnJheShlKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgbj1lLzh8MCxyPXRoaXMuYnVmZmVyW24rMl0+PjctZSU4JjE7dFtlXT1yfXJldHVybiB0fXN0YXRpYyBmcm9tSW50OEFycmF5KGUpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuSW50OCx0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUZsb2F0MzJBcnJheShlKXtjb25zdCB0PWZlLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTt0WzBdPXllLlZFQ1RPUl9UWVBFLkZsb2F0MzIsdFsxXT0wO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7dC5zZXQobiwyKSxwZS5pc0JpZ0VuZGlhbiYmZmUuc3dhcDMyKG5ldyBVaW50OEFycmF5KHQuYnVmZmVyLDIpKTtjb25zdCByPW5ldyB0aGlzKHQsdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIG1lKHIpLHJ9c3RhdGljIGZyb21QYWNrZWRCaXRzKGUsdD0wKXtjb25zdCBuPWZlLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTtuWzBdPXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCxuWzFdPXQsbi5zZXQoZSwyKTtjb25zdCByPW5ldyB0aGlzKG4sdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIG1lKHIpLHJ9c3RhdGljIGZyb21CaXRzKGUpe2NvbnN0IHQ9ZS5sZW5ndGgrNz4+PjMsbj1uZXcgVWludDhBcnJheSh0KzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0O2NvbnN0IHI9ZS5sZW5ndGglODtuWzFdPTA9PT1yPzA6OC1yO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCByPXQ+Pj4zLGk9ZVt0XTtpZigwIT09aSYmMSE9PWkpdGhyb3cgbmV3IFooYEludmFsaWQgYml0IHZhbHVlIGF0ICR7dH06IG11c3QgYmUgMCBvciAxLCBmb3VuZCAke2VbdF19YCk7aWYoMD09PWkpY29udGludWU7Y29uc3Qgbz03LXQlODtuW3IrMl18PWk8PG99cmV0dXJuIG5ldyB0aGlzKG4seWUuU1VCVFlQRV9WRUNUT1IpfX1mdW5jdGlvbiBtZShlKXtpZihlLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpcmV0dXJuO2NvbnN0IHQ9ZS5wb3NpdGlvbixuPWUuYnVmZmVyWzBdLHI9ZS5idWZmZXJbMV07aWYoKG49PT15ZS5WRUNUT1JfVFlQRS5GbG9hdDMyfHxuPT09eWUuVkVDVE9SX1RZUEUuSW50OCkmJjAhPT1yKXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIGludDggYW5kIGZsb2F0MzIgdmVjdG9ycyIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5GbG9hdDMyJiYwIT09dCYmdC0yIT0wJiYodC0yKSU0IT0wKXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogRmxvYXQzMiB2ZWN0b3IgbXVzdCBjb250YWluIGEgbXVsdGlwbGUgb2YgNCBieXRlcyIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJjAhPT1yJiYyPT09dCl0aHJvdyBuZXcgWigiSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSB6ZXJvIGZvciBwYWNrZWQgYml0IHZlY3RvcnMgdGhhdCBhcmUgZW1wdHkiKTtpZihuPT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0JiZyPjcpdGhyb3cgbmV3IFooYEludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDcuIGZvdW5kOiAke3J9YCl9Y29uc3QgU2U9L15bMC05QS1GXXszMn0kL2kseGU9L15bMC05QS1GXXs4fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXsxMn0kL2k7Y2xhc3MgQmUgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3RvcihlKXtsZXQgdDtpZihudWxsPT1lKXQ9QmUuZ2VuZXJhdGUoKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBCZSl0PWZlLnRvTG9jYWxCdWZmZXJUeXBlKG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSk7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJjE2PT09ZS5ieXRlTGVuZ3RoKXQ9ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIkFyZ3VtZW50IHBhc3NlZCBpbiBVVUlEIGNvbnN0cnVjdG9yIG11c3QgYmUgYSBVVUlELCBhIDE2IGJ5dGUgQnVmZmVyIG9yIGEgMzIvMzYgY2hhcmFjdGVyIGhleCBzdHJpbmcgKGRhc2hlcyBleGNsdWRlZC9pbmNsdWRlZCwgZm9ybWF0OiB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgpLiIpO3Q9QmUuYnl0ZXNGcm9tU3RyaW5nKGUpfXN1cGVyKHQsSCl9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lfXRvSGV4U3RyaW5nKGU9ITApe3JldHVybiBlP1tmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLDQpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg0LDYpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg2LDgpKSxmZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSg4LDEwKSksZmUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoMTAsMTYpKV0uam9pbigiLSIpOmZlLnRvSGV4KHRoaXMuYnVmZmVyKX10b1N0cmluZyhlKXtyZXR1cm4iaGV4Ij09PWU/ZmUudG9IZXgodGhpcy5pZCk6ImJhc2U2NCI9PT1lP2ZlLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfWVxdWFscyhlKXtpZighZSlyZXR1cm4hMTtpZihlIGluc3RhbmNlb2YgQmUpcmV0dXJuIGZlLmVxdWFscyhlLmlkLHRoaXMuaWQpO3RyeXtyZXR1cm4gZmUuZXF1YWxzKG5ldyBCZShlKS5pZCx0aGlzLmlkKX1jYXRjaHtyZXR1cm4hMX19dG9CaW5hcnkoKXtyZXR1cm4gbmV3IHllKHRoaXMuaWQseWUuU1VCVFlQRV9VVUlEKX1zdGF0aWMgZ2VuZXJhdGUoKXtjb25zdCBlPWZlLnJhbmRvbUJ5dGVzKDE2KTtyZXR1cm4gZVs2XT0xNSZlWzZdfDY0LGVbOF09NjMmZVs4XXwxMjgsZX1zdGF0aWMgaXNWYWxpZChlKXtyZXR1cm4hIWUmJigic3RyaW5nIj09dHlwZW9mIGU/QmUuaXNWYWxpZFVVSURTdHJpbmcoZSk6ZihlKT8xNj09PWUuYnl0ZUxlbmd0aDoiQmluYXJ5Ij09PWUuX2Jzb250eXBlJiZlLnN1Yl90eXBlPT09dGhpcy5TVUJUWVBFX1VVSUQmJjE2PT09ZS5idWZmZXIuYnl0ZUxlbmd0aCl9c3RhdGljIGNyZWF0ZUZyb21IZXhTdHJpbmcoZSl7Y29uc3QgdD1CZS5ieXRlc0Zyb21TdHJpbmcoZSk7cmV0dXJuIG5ldyBCZSh0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlKXtyZXR1cm4gbmV3IEJlKGZlLmZyb21CYXNlNjQoZSkpfXN0YXRpYyBieXRlc0Zyb21TdHJpbmcoZSl7aWYoIUJlLmlzVmFsaWRVVUlEU3RyaW5nKGUpKXRocm93IG5ldyBaKCJVVUlEIHN0cmluZyByZXByZXNlbnRhdGlvbiBtdXN0IGJlIDMyIGhleCBkaWdpdHMgb3IgY2Fub25pY2FsIGh5cGhlbmF0ZWQgcmVwcmVzZW50YXRpb24iKTtyZXR1cm4gZmUuZnJvbUhleChlLnJlcGxhY2UoLy0vZywiIikpfXN0YXRpYyBpc1ZhbGlkVVVJRFN0cmluZyhlKXtyZXR1cm4gU2UudGVzdChlKXx8eGUudGVzdChlKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PXcsYG5ldyBVVUlEKCR7bih0aGlzLnRvSGV4U3RyaW5nKCksdCl9KWB9fWNsYXNzIFVlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJDb2RlIn1jb2RlO3Njb3BlO2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmNvZGU9ZS50b1N0cmluZygpLHRoaXMuc2NvcGU9dD8/bnVsbH10b0pTT04oKXtyZXR1cm4gbnVsbCE9dGhpcy5zY29wZT97Y29kZTp0aGlzLmNvZGUsc2NvcGU6dGhpcy5zY29wZX06e2NvZGU6dGhpcy5jb2RlfX10b0V4dGVuZGVkSlNPTigpe3JldHVybiB0aGlzLnNjb3BlP3skY29kZTp0aGlzLmNvZGUsJHNjb3BlOnRoaXMuc2NvcGV9OnskY29kZTp0aGlzLmNvZGV9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe3JldHVybiBuZXcgVWUoZS4kY29kZSxlLiRzY29wZSl9aW5zcGVjdChlLHQsbil7bj8/PXc7bGV0IHI9bih0aGlzLmNvZGUsdCk7Y29uc3QgaT1yLmluY2x1ZGVzKCJcbiIpO251bGwhPXRoaXMuc2NvcGUmJihyKz1gLCR7aT8iXG4iOiIgIn0ke24odGhpcy5zY29wZSx0KX1gKTtyZXR1cm5gbmV3IENvZGUoJHtpPyJcbiI6IiJ9JHtyfSR7aSYmbnVsbD09PXRoaXMuc2NvcGU/IlxuIjoiIn0pYH19ZnVuY3Rpb24gRWUoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIiRpZCJpbiBlJiZudWxsIT1lLiRpZCYmIiRyZWYiaW4gZSYmInN0cmluZyI9PXR5cGVvZiBlLiRyZWYmJighKCIkZGIiaW4gZSl8fCIkZGIiaW4gZSYmInN0cmluZyI9PXR5cGVvZiBlLiRkYil9Y2xhc3MgSWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRCUmVmIn1jb2xsZWN0aW9uO29pZDtkYjtmaWVsZHM7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoKTtjb25zdCBpPWUuc3BsaXQoIi4iKTsyPT09aS5sZW5ndGgmJihuPWkuc2hpZnQoKSxlPWkuc2hpZnQoKSksdGhpcy5jb2xsZWN0aW9uPWUsdGhpcy5vaWQ9dCx0aGlzLmRiPW4sdGhpcy5maWVsZHM9cnx8e319Z2V0IG5hbWVzcGFjZSgpe3JldHVybiB0aGlzLmNvbGxlY3Rpb259c2V0IG5hbWVzcGFjZShlKXt0aGlzLmNvbGxlY3Rpb249ZX10b0pTT04oKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oeyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH0sdGhpcy5maWVsZHMpO3JldHVybiBudWxsIT10aGlzLmRiJiYoZS4kZGI9dGhpcy5kYiksZX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9O2xldCB0PXskcmVmOnRoaXMuY29sbGVjdGlvbiwkaWQ6dGhpcy5vaWR9O3JldHVybiBlLmxlZ2FjeXx8KHRoaXMuZGImJih0LiRkYj10aGlzLmRiKSx0PU9iamVjdC5hc3NpZ24odCx0aGlzLmZpZWxkcykpLHR9c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBkZWxldGUgdC4kcmVmLGRlbGV0ZSB0LiRpZCxkZWxldGUgdC4kZGIsbmV3IEllKGUuJHJlZixlLiRpZCxlLiRkYix0KX1pbnNwZWN0KGUsdCxuKXtuPz89dztjb25zdCByPVtuKHRoaXMubmFtZXNwYWNlLHQpLG4odGhpcy5vaWQsdCksLi4udGhpcy5kYj9bbih0aGlzLmRiLHQpXTpbXSwuLi5PYmplY3Qua2V5cyh0aGlzLmZpZWxkcykubGVuZ3RoPjA/W24odGhpcy5maWVsZHMsdCldOltdXTtyZXR1cm4gclsxXT1uPT09dz9gbmV3IE9iamVjdElkKCR7clsxXX0pYDpyWzFdLGBuZXcgREJSZWYoJHtyLmpvaW4oIiwgIil9KWB9fWZ1bmN0aW9uIE9lKGUpe2lmKCIiPT09ZSlyZXR1cm4gZTtsZXQgdD0wO2NvbnN0IG49Ii0iPT09ZVt0XSxyPSIrIj09PWVbdF07KHJ8fG4pJiYodCs9MSk7bGV0IGk9ITE7Zm9yKDt0PGUubGVuZ3RoJiYiMCI9PT1lW3RdOysrdClpPSEwO3JldHVybiBpP2Ake24/Ii0iOiIifSR7ZS5sZW5ndGg9PT10PyIwIjplLnNsaWNlKHQpfWA6cj9lLnNsaWNlKDEpOmV9bGV0IE5lO3RyeXtOZT1uZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShuZXcgVWludDhBcnJheShbMCw5NywxMTUsMTA5LDEsMCwwLDAsMSwxMywyLDk2LDAsMSwxMjcsOTYsNCwxMjcsMTI3LDEyNywxMjcsMSwxMjcsMyw3LDYsMCwxLDEsMSwxLDEsNiw2LDEsMTI3LDEsNjUsMCwxMSw3LDUwLDYsMywxMDksMTE3LDEwOCwwLDEsNSwxMDAsMTA1LDExOCw5NSwxMTUsMCwyLDUsMTAwLDEwNSwxMTgsOTUsMTE3LDAsMyw1LDExNCwxMDEsMTA5LDk1LDExNSwwLDQsNSwxMTQsMTAxLDEwOSw5NSwxMTcsMCw1LDgsMTAzLDEwMSwxMTYsOTUsMTA0LDEwNSwxMDMsMTA0LDAsMCwxMCwxOTEsMSw2LDQsMCwzNSwwLDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNiwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjcsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI4LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyOSwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMzAsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTFdKSkse30pLmV4cG9ydHN9Y2F0Y2h7fWNvbnN0IHZlPTQyOTQ5NjcyOTYsVGU9MHgxMDAwMDAwMDAwMDAwMDAwMCwkZT1UZS8yLExlPXt9LEFlPXt9LGplPS9eKFwrPzB8KFwrfC0pP1sxLTldWzAtOV0qKSQvO2NsYXNzIFJlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJMb25nIn1nZXQgX19pc0xvbmdfXygpe3JldHVybiEwfWhpZ2g7bG93O3Vuc2lnbmVkO2NvbnN0cnVjdG9yKGU9MCx0LG4pe3N1cGVyKCk7Y29uc3Qgcj0iYm9vbGVhbiI9PXR5cGVvZiB0P3Q6Qm9vbGVhbihuKSxpPSJudW1iZXIiPT10eXBlb2YgdD90OjAsbz0ic3RyaW5nIj09dHlwZW9mIGU/UmUuZnJvbVN0cmluZyhlLHIpOiJiaWdpbnQiPT10eXBlb2YgZT9SZS5mcm9tQmlnSW50KGUscik6e2xvdzowfGUsaGlnaDowfGksdW5zaWduZWQ6cn07dGhpcy5sb3c9by5sb3csdGhpcy5oaWdoPW8uaGlnaCx0aGlzLnVuc2lnbmVkPW8udW5zaWduZWR9c3RhdGljIFRXT19QV1JfMjQ9UmUuZnJvbUludCgxNjc3NzIxNik7c3RhdGljIE1BWF9VTlNJR05FRF9WQUxVRT1SZS5mcm9tQml0cygtMSwtMSwhMCk7c3RhdGljIFpFUk89UmUuZnJvbUludCgwKTtzdGF0aWMgVVpFUk89UmUuZnJvbUludCgwLCEwKTtzdGF0aWMgT05FPVJlLmZyb21JbnQoMSk7c3RhdGljIFVPTkU9UmUuZnJvbUludCgxLCEwKTtzdGF0aWMgTkVHX09ORT1SZS5mcm9tSW50KC0xKTtzdGF0aWMgTUFYX1ZBTFVFPVJlLmZyb21CaXRzKC0xLDIxNDc0ODM2NDcsITEpO3N0YXRpYyBNSU5fVkFMVUU9UmUuZnJvbUJpdHMoMCwtMjE0NzQ4MzY0OCwhMSk7c3RhdGljIGZyb21CaXRzKGUsdCxuKXtyZXR1cm4gbmV3IFJlKGUsdCxuKX1zdGF0aWMgZnJvbUludChlLHQpe2xldCBuLHIsaTtyZXR1cm4gdD8oaT0wPD0oZT4+Pj0wKSYmZTwyNTYpJiYocj1BZVtlXSxyKT9yOihuPVJlLmZyb21CaXRzKGUsKDB8ZSk8MD8tMTowLCEwKSxpJiYoQWVbZV09biksbik6KGk9LTEyODw9KGV8PTApJiZlPDEyOCkmJihyPUxlW2VdLHIpP3I6KG49UmUuZnJvbUJpdHMoZSxlPDA/LTE6MCwhMSksaSYmKExlW2VdPW4pLG4pfXN0YXRpYyBmcm9tTnVtYmVyKGUsdCl7aWYoaXNOYU4oZSkpcmV0dXJuIHQ/UmUuVVpFUk86UmUuWkVSTztpZih0KXtpZihlPDApcmV0dXJuIFJlLlVaRVJPO2lmKGU+PVRlKXJldHVybiBSZS5NQVhfVU5TSUdORURfVkFMVUV9ZWxzZXtpZihlPD0tJGUpcmV0dXJuIFJlLk1JTl9WQUxVRTtpZihlKzE+PSRlKXJldHVybiBSZS5NQVhfVkFMVUV9cmV0dXJuIGU8MD9SZS5mcm9tTnVtYmVyKC1lLHQpLm5lZygpOlJlLmZyb21CaXRzKGUldmV8MCxlL3ZlfDAsdCl9c3RhdGljIGZyb21CaWdJbnQoZSx0KXtjb25zdCBuPTB4ZmZmZmZmZmZuO3JldHVybiBuZXcgUmUoTnVtYmVyKGUmbiksTnVtYmVyKGU+PjMybiZuKSx0KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiZW1wdHkgc3RyaW5nIik7aWYobjwyfHwzNjxuKXRocm93IG5ldyBaKCJyYWRpeCIpO2xldCByO2lmKChyPWUuaW5kZXhPZigiLSIpKT4wKXRocm93IG5ldyBaKCJpbnRlcmlvciBoeXBoZW4iKTtpZigwPT09cilyZXR1cm4gUmUuX2Zyb21TdHJpbmcoZS5zdWJzdHJpbmcoMSksdCxuKS5uZWcoKTtjb25zdCBpPVJlLmZyb21OdW1iZXIoTWF0aC5wb3cobiw4KSk7bGV0IG89UmUuWkVSTztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTgpe2NvbnN0IHI9TWF0aC5taW4oOCxlLmxlbmd0aC10KSxzPXBhcnNlSW50KGUuc3Vic3RyaW5nKHQsdCtyKSxuKTtpZihyPDgpe2NvbnN0IGU9UmUuZnJvbU51bWJlcihNYXRoLnBvdyhuLHIpKTtvPW8ubXVsKGUpLmFkZChSZS5mcm9tTnVtYmVyKHMpKX1lbHNlIG89by5tdWwoaSksbz1vLmFkZChSZS5mcm9tTnVtYmVyKHMpKX1yZXR1cm4gby51bnNpZ25lZD10LG99c3RhdGljIGZyb21TdHJpbmdTdHJpY3QoZSx0LG4pe2xldCByPSExO2lmKCJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCxlLnRyaW0oKSE9PWUpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZWApO2lmKCFmdW5jdGlvbihlLHQpe2NvbnN0IG49IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc2xpY2UoMCx0PXQ/PzEwKTtyZXR1cm4hbmV3IFJlZ0V4cChgW14tKyR7bn1dYCwiaSIpLnRlc3QoZSkmJmV9KGUsbikpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGZvciByYWRpeDogJHtufWApO2NvbnN0IGk9T2UoZSksbz1SZS5fZnJvbVN0cmluZyhpLHIsbik7aWYoby50b1N0cmluZyhuKS50b0xvd2VyQ2FzZSgpIT09aS50b0xvd2VyQ2FzZSgpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyAke28udW5zaWduZWQ/ImFuIHVuc2lnbmVkIjoiYSBzaWduZWQifSA2NC1iaXQgTG9uZyAke251bGwhPW4/YHdpdGggcmFkaXg6ICR7bn1gOiIifWApO3JldHVybiBvfXN0YXRpYyBmcm9tU3RyaW5nKGUsdCxuKXtsZXQgcj0hMTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/KG49dCx0PSExKTpyPSEhdCxuPz89MTAsIk5hTiI9PT1lJiZuPDI0fHwoIkluZmluaXR5Ij09PWV8fCIrSW5maW5pdHkiPT09ZXx8Ii1JbmZpbml0eSI9PT1lKSYmbjwzNT9SZS5aRVJPOlJlLl9mcm9tU3RyaW5nKGUscixuKX1zdGF0aWMgZnJvbUJ5dGVzKGUsdCxuKXtyZXR1cm4gbj9SZS5mcm9tQnl0ZXNMRShlLHQpOlJlLmZyb21CeXRlc0JFKGUsdCl9c3RhdGljIGZyb21CeXRlc0xFKGUsdCl7cmV0dXJuIG5ldyBSZShlWzBdfGVbMV08PDh8ZVsyXTw8MTZ8ZVszXTw8MjQsZVs0XXxlWzVdPDw4fGVbNl08PDE2fGVbN108PDI0LHQpfXN0YXRpYyBmcm9tQnl0ZXNCRShlLHQpe3JldHVybiBuZXcgUmUoZVs0XTw8MjR8ZVs1XTw8MTZ8ZVs2XTw8OHxlWzddLGVbMF08PDI0fGVbMV08PDE2fGVbMl08PDh8ZVszXSx0KX1zdGF0aWMgaXNMb25nKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJfX2lzTG9uZ19fImluIGUmJiEwPT09ZS5fX2lzTG9uZ19ffXN0YXRpYyBmcm9tVmFsdWUoZSx0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/UmUuZnJvbU51bWJlcihlLHQpOiJzdHJpbmciPT10eXBlb2YgZT9SZS5mcm9tU3RyaW5nKGUsdCk6UmUuZnJvbUJpdHMoZS5sb3csZS5oaWdoLCJib29sZWFuIj09dHlwZW9mIHQ/dDplLnVuc2lnbmVkKX1hZGQoZSl7UmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpO2NvbnN0IHQ9dGhpcy5oaWdoPj4+MTYsbj02NTUzNSZ0aGlzLmhpZ2gscj10aGlzLmxvdz4+PjE2LGk9NjU1MzUmdGhpcy5sb3csbz1lLmhpZ2g+Pj4xNixzPTY1NTM1JmUuaGlnaCxhPWUubG93Pj4+MTY7bGV0IGM9MCxfPTAsbD0wLHU9MDtyZXR1cm4gdSs9aSsoNjU1MzUmZS5sb3cpLGwrPXU+Pj4xNix1Jj02NTUzNSxsKz1yK2EsXys9bD4+PjE2LGwmPTY1NTM1LF8rPW4rcyxjKz1fPj4+MTYsXyY9NjU1MzUsYys9dCtvLGMmPTY1NTM1LFJlLmZyb21CaXRzKGw8PDE2fHUsYzw8MTZ8Xyx0aGlzLnVuc2lnbmVkKX1hbmQoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxSZS5mcm9tQml0cyh0aGlzLmxvdyZlLmxvdyx0aGlzLmhpZ2gmZS5oaWdoLHRoaXMudW5zaWduZWQpfWNvbXBhcmUoZSl7aWYoUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLHRoaXMuZXEoZSkpcmV0dXJuIDA7Y29uc3QgdD10aGlzLmlzTmVnYXRpdmUoKSxuPWUuaXNOZWdhdGl2ZSgpO3JldHVybiB0JiYhbj8tMTohdCYmbj8xOnRoaXMudW5zaWduZWQ/ZS5oaWdoPj4+MD50aGlzLmhpZ2g+Pj4wfHxlLmhpZ2g9PT10aGlzLmhpZ2gmJmUubG93Pj4+MD50aGlzLmxvdz4+PjA/LTE6MTp0aGlzLnN1YihlKS5pc05lZ2F0aXZlKCk/LTE6MX1jb21wKGUpe3JldHVybiB0aGlzLmNvbXBhcmUoZSl9ZGl2aWRlKGUpe2lmKFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxlLmlzWmVybygpKXRocm93IG5ldyBaKCJkaXZpc2lvbiBieSB6ZXJvIik7aWYoTmUpe2lmKCF0aGlzLnVuc2lnbmVkJiYtMjE0NzQ4MzY0OD09PXRoaXMuaGlnaCYmLTE9PT1lLmxvdyYmLTE9PT1lLmhpZ2gpcmV0dXJuIHRoaXM7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9OZS5kaXZfdTpOZS5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIFJlLmZyb21CaXRzKHQsTmUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1pZih0aGlzLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP1JlLlVaRVJPOlJlLlpFUk87bGV0IHQsbixyO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiBSZS5VWkVSTztpZihlLmd0KHRoaXMuc2hydSgxKSkpcmV0dXJuIFJlLlVPTkU7cj1SZS5VWkVST31lbHNle2lmKHRoaXMuZXEoUmUuTUlOX1ZBTFVFKSl7aWYoZS5lcShSZS5PTkUpfHxlLmVxKFJlLk5FR19PTkUpKXJldHVybiBSZS5NSU5fVkFMVUU7aWYoZS5lcShSZS5NSU5fVkFMVUUpKXJldHVybiBSZS5PTkU7cmV0dXJuIHQ9dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSx0LmVxKFJlLlpFUk8pP2UuaXNOZWdhdGl2ZSgpP1JlLk9ORTpSZS5ORUdfT05FOihuPXRoaXMuc3ViKGUubXVsKHQpKSxyPXQuYWRkKG4uZGl2KGUpKSxyKX1pZihlLmVxKFJlLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMudW5zaWduZWQ/UmUuVVpFUk86UmUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO3I9UmUuWkVST31mb3Iobj10aGlzO24uZ3RlKGUpOyl7dD1NYXRoLm1heCgxLE1hdGguZmxvb3Iobi50b051bWJlcigpL2UudG9OdW1iZXIoKSkpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSxvPWk8PTQ4PzE6TWF0aC5wb3coMixpLTQ4KTtsZXQgcz1SZS5mcm9tTnVtYmVyKHQpLGE9cy5tdWwoZSk7Zm9yKDthLmlzTmVnYXRpdmUoKXx8YS5ndChuKTspdC09byxzPVJlLmZyb21OdW1iZXIodCx0aGlzLnVuc2lnbmVkKSxhPXMubXVsKGUpO3MuaXNaZXJvKCkmJihzPVJlLk9ORSkscj1yLmFkZChzKSxuPW4uc3ViKGEpfXJldHVybiByfWRpdihlKXtyZXR1cm4gdGhpcy5kaXZpZGUoZSl9ZXF1YWxzKGUpe3JldHVybiBSZS5pc0xvbmcoZSl8fChlPVJlLmZyb21WYWx1ZShlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiYodGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93KX1lcShlKXtyZXR1cm4gdGhpcy5lcXVhbHMoZSl9Z2V0SGlnaEJpdHMoKXtyZXR1cm4gdGhpcy5oaWdofWdldEhpZ2hCaXRzVW5zaWduZWQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1nZXRMb3dCaXRzKCl7cmV0dXJuIHRoaXMubG93fWdldExvd0JpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0TnVtQml0c0Ficygpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxKFJlLk1JTl9WQUxVRSk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Y29uc3QgZT0wIT09dGhpcy5oaWdoP3RoaXMuaGlnaDp0aGlzLmxvdztsZXQgdDtmb3IodD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT09dGhpcy5oaWdoP3QrMzM6dCsxfWdyZWF0ZXJUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH1ndChlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbihlKX1ncmVhdGVyVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKT49MH1ndGUoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWdlKGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuT3JFcXVhbChlKX1pc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy5sb3cpfWlzTmVnYXRpdmUoKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9aXNPZGQoKXtyZXR1cm4hKDEmfnRoaXMubG93KX1pc1Bvc2l0aXZlKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH1pc1plcm8oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fWxlc3NUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH1sdChlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbihlKX1sZXNzVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH1sdGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfW1vZHVsbyhlKXtpZihSZS5pc0xvbmcoZSl8fChlPVJlLmZyb21WYWx1ZShlKSksTmUpe2NvbnN0IHQ9KHRoaXMudW5zaWduZWQ/TmUucmVtX3U6TmUucmVtX3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBSZS5mcm9tQml0cyh0LE5lLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9cmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9bW9kKGUpe3JldHVybiB0aGlzLm1vZHVsbyhlKX1yZW0oZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfW11bHRpcGx5KGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIFJlLlpFUk87aWYoUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLE5lKXtjb25zdCB0PU5lLm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gUmUuZnJvbUJpdHModCxOZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKGUuaXNaZXJvKCkpcmV0dXJuIFJlLlpFUk87aWYodGhpcy5lcShSZS5NSU5fVkFMVUUpKXJldHVybiBlLmlzT2RkKCk/UmUuTUlOX1ZBTFVFOlJlLlpFUk87aWYoZS5lcShSZS5NSU5fVkFMVUUpKXJldHVybiB0aGlzLmlzT2RkKCk/UmUuTUlOX1ZBTFVFOlJlLlpFUk87aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KFJlLlRXT19QV1JfMjQpJiZlLmx0KFJlLlRXT19QV1JfMjQpKXJldHVybiBSZS5mcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNixjPTY1NTM1JmUubG93O2xldCBfPTAsbD0wLHU9MCxmPTA7cmV0dXJuIGYrPWkqYyx1Kz1mPj4+MTYsZiY9NjU1MzUsdSs9cipjLGwrPXU+Pj4xNix1Jj02NTUzNSx1Kz1pKmEsbCs9dT4+PjE2LHUmPTY1NTM1LGwrPW4qYyxfKz1sPj4+MTYsbCY9NjU1MzUsbCs9ciphLF8rPWw+Pj4xNixsJj02NTUzNSxsKz1pKnMsXys9bD4+PjE2LGwmPTY1NTM1LF8rPXQqYytuKmErcipzK2kqbyxfJj02NTUzNSxSZS5mcm9tQml0cyh1PDwxNnxmLF88PDE2fGwsdGhpcy51bnNpZ25lZCl9bXVsKGUpe3JldHVybiB0aGlzLm11bHRpcGx5KGUpfW5lZ2F0ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKFJlLk1JTl9WQUxVRSk/UmUuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKFJlLk9ORSl9bmVnKCl7cmV0dXJuIHRoaXMubmVnYXRlKCl9bm90KCl7cmV0dXJuIFJlLmZyb21CaXRzKH50aGlzLmxvdyx+dGhpcy5oaWdoLHRoaXMudW5zaWduZWQpfW5vdEVxdWFscyhlKXtyZXR1cm4hdGhpcy5lcXVhbHMoZSl9bmVxKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1uZShlKXtyZXR1cm4gdGhpcy5ub3RFcXVhbHMoZSl9b3IoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSxSZS5mcm9tQml0cyh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfXNoaWZ0TGVmdChlKXtyZXR1cm4gUmUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP1JlLmZyb21CaXRzKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6UmUuZnJvbUJpdHMoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX1zaGwoZSl7cmV0dXJuIHRoaXMuc2hpZnRMZWZ0KGUpfXNoaWZ0UmlnaHQoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9SZS5mcm9tQml0cyh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpSZS5mcm9tQml0cyh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9c2hyKGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHQoZSl9c2hpZnRSaWdodFVuc2lnbmVkKGUpe2lmKFJlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT09KGUmPTYzKSlyZXR1cm4gdGhpczt7Y29uc3QgdD10aGlzLmhpZ2g7aWYoZTwzMil7Y29uc3Qgbj10aGlzLmxvdztyZXR1cm4gUmUuZnJvbUJpdHMobj4+PmV8dDw8MzItZSx0Pj4+ZSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gMzI9PT1lP1JlLmZyb21CaXRzKHQsMCx0aGlzLnVuc2lnbmVkKTpSZS5mcm9tQml0cyh0Pj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfX1zaHJfdShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c2hydShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c3VidHJhY3QoZSl7cmV0dXJuIFJlLmlzTG9uZyhlKXx8KGU9UmUuZnJvbVZhbHVlKGUpKSx0aGlzLmFkZChlLm5lZygpKX1zdWIoZSl7cmV0dXJuIHRoaXMuc3VidHJhY3QoZSl9dG9JbnQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9dG9OdW1iZXIoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqdmUrKHRoaXMubG93Pj4+MCk6dGhpcy5oaWdoKnZlKyh0aGlzLmxvdz4+PjApfXRvQmlnSW50KCl7cmV0dXJuIEJpZ0ludCh0aGlzLnRvU3RyaW5nKCkpfXRvQnl0ZXMoZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfXRvQnl0ZXNMRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuWzI1NSZ0LHQ+Pj44JjI1NSx0Pj4+MTYmMjU1LHQ+Pj4yNCwyNTUmZSxlPj4+OCYyNTUsZT4+PjE2JjI1NSxlPj4+MjRdfXRvQnl0ZXNCRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfXRvU2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/UmUuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCExKTp0aGlzfXRvU3RyaW5nKGUpe2lmKChlPWV8fDEwKTwyfHwzNjxlKXRocm93IG5ldyBaKCJyYWRpeCIpO2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIjAiO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXtpZih0aGlzLmVxKFJlLk1JTl9WQUxVRSkpe2NvbnN0IHQ9UmUuZnJvbU51bWJlcihlKSxuPXRoaXMuZGl2KHQpLHI9bi5tdWwodCkuc3ViKHRoaXMpO3JldHVybiBuLnRvU3RyaW5nKGUpK3IudG9JbnQoKS50b1N0cmluZyhlKX1yZXR1cm4iLSIrdGhpcy5uZWcoKS50b1N0cmluZyhlKX1jb25zdCB0PVJlLmZyb21OdW1iZXIoTWF0aC5wb3coZSw2KSx0aGlzLnVuc2lnbmVkKTtsZXQgbj10aGlzLHI9IiI7Zm9yKDs7KXtjb25zdCBpPW4uZGl2KHQpO2xldCBvPShuLnN1YihpLm11bCh0KSkudG9JbnQoKT4+PjApLnRvU3RyaW5nKGUpO2lmKG49aSxuLmlzWmVybygpKXJldHVybiBvK3I7Zm9yKDtvLmxlbmd0aDw2OylvPSIwIitvO3I9IiIrbytyfX10b1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/dGhpczpSZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITApfXhvcihlKXtyZXR1cm4gUmUuaXNMb25nKGUpfHwoZT1SZS5mcm9tVmFsdWUoZSkpLFJlLmZyb21CaXRzKHRoaXMubG93XmUubG93LHRoaXMuaGlnaF5lLmhpZ2gsdGhpcy51bnNpZ25lZCl9ZXF6KCl7cmV0dXJuIHRoaXMuaXNaZXJvKCl9bGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiZlLnJlbGF4ZWQ/dGhpcy50b051bWJlcigpOnskbnVtYmVyTG9uZzp0aGlzLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7Y29uc3R7dXNlQmlnSW50NjQ6bj0hMSxyZWxheGVkOnI9ITB9PXsuLi50fTtpZihlLiRudW1iZXJMb25nLmxlbmd0aD4yMCl0aHJvdyBuZXcgWigiJG51bWJlckxvbmcgc3RyaW5nIGlzIHRvbyBsb25nIik7aWYoIWplLnRlc3QoZS4kbnVtYmVyTG9uZykpdGhyb3cgbmV3IFooYCRudW1iZXJMb25nIHN0cmluZyAiJHtlLiRudW1iZXJMb25nfSIgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXRgKTtpZihuKXtjb25zdCB0PUJpZ0ludChlLiRudW1iZXJMb25nKTtyZXR1cm4gQmlnSW50LmFzSW50Tig2NCx0KX1jb25zdCBpPVJlLmZyb21TdHJpbmcoZS4kbnVtYmVyTG9uZyk7cmV0dXJuIHI/aS50b051bWJlcigpOml9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYG5ldyBMb25nKCR7bih0aGlzLnRvU3RyaW5nKCksdCl9JHt0aGlzLnVuc2lnbmVkP2AsICR7bih0aGlzLnVuc2lnbmVkLHQpfWA6IiJ9KWB9fWNvbnN0IEZlPS9eKFwrfC0pPyhcZCt8KFxkKlwuXGQqKSk/KEV8ZSk/KFstK10pPyhcZCspPyQvLGtlPS9eKFwrfC0pPyhJbmZpbml0eXxpbmYpJC9pLHplPS9eKFwrfC0pP05hTiQvaSxDZT02MTExLERlPS02MTc2LFZlPWZlLmZyb21OdW1iZXJBcnJheShbMTI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLE1lPWZlLmZyb21OdW1iZXJBcnJheShbMjQ4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLFBlPWZlLmZyb21OdW1iZXJBcnJheShbMTIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLEplPS9eKFstK10pPyhcZCspPyQvO2Z1bmN0aW9uIFdlKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9ZnVuY3Rpb24gWWUoZSl7Y29uc3QgdD1SZS5mcm9tTnVtYmVyKDFlOSk7bGV0IG49UmUuZnJvbU51bWJlcigwKTtpZighKGUucGFydHNbMF18fGUucGFydHNbMV18fGUucGFydHNbMl18fGUucGFydHNbM10pKXJldHVybntxdW90aWVudDplLHJlbTpufTtmb3IobGV0IHI9MDtyPD0zO3IrKyluPW4uc2hpZnRMZWZ0KDMyKSxuPW4uYWRkKG5ldyBSZShlLnBhcnRzW3JdLDApKSxlLnBhcnRzW3JdPW4uZGl2KHQpLmxvdyxuPW4ubW9kdWxvKHQpO3JldHVybntxdW90aWVudDplLHJlbTpufX1mdW5jdGlvbiBxZShlLHQpe3Rocm93IG5ldyBaKGAiJHtlfSIgaXMgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmcgLSAke3R9YCl9Y2xhc3MgSGUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRlY2ltYWwxMjgifWJ5dGVzO2NvbnN0cnVjdG9yKGUpe2lmKHN1cGVyKCksInN0cmluZyI9PXR5cGVvZiBlKXRoaXMuYnl0ZXM9SGUuZnJvbVN0cmluZyhlKS5ieXRlcztlbHNle2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGYoZSkpKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvciBzdHJpbmciKTtpZigxNiE9PWUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiRGVjaW1hbDEyOCBtdXN0IHRha2UgYSBCdWZmZXIgb2YgMTYgYnl0ZXMiKTt0aGlzLmJ5dGVzPWV9fXN0YXRpYyBmcm9tU3RyaW5nKGUpe3JldHVybiBIZS5fZnJvbVN0cmluZyhlLHthbGxvd1JvdW5kaW5nOiExfSl9c3RhdGljIGZyb21TdHJpbmdXaXRoUm91bmRpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITB9KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0KXtsZXQgbj0hMSxyPSExLGk9ITEsbz0hMSxzPTAsYT0wLGM9MCxfPTAsbD0wO2NvbnN0IHU9WzBdO2xldCBmPTAsZz0wLGg9MCxkPTAsYj1uZXcgUmUoMCwwKSx3PW5ldyBSZSgwLDApLHA9MCx5PTA7aWYoZS5sZW5ndGg+PTdlMyl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtjb25zdCBtPWUubWF0Y2goRmUpLFM9ZS5tYXRjaChrZSkseD1lLm1hdGNoKHplKTtpZighbSYmIVMmJiF4fHwwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYobSl7Y29uc3QgdD1tWzJdLG49bVs0XSxyPW1bNV0saT1tWzZdO24mJnZvaWQgMD09PWkmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgcG93ZXIiKSxuJiZ2b2lkIDA9PT10JiZxZShlLCJtaXNzaW5nIGV4cG9uZW50IGJhc2UiKSx2b2lkIDA9PT1uJiYocnx8aSkmJnFlKGUsIm1pc3NpbmcgZSBiZWZvcmUgZXhwb25lbnQiKX1pZigiKyIhPT1lW3ldJiYiLSIhPT1lW3ldfHwocj0hMCxuPSItIj09PWVbeSsrXSksIVdlKGVbeV0pJiYiLiIhPT1lW3ldKXtpZigiaSI9PT1lW3ldfHwiSSI9PT1lW3ldKXJldHVybiBuZXcgSGUobj9NZTpQZSk7aWYoIk4iPT09ZVt5XSlyZXR1cm4gbmV3IEhlKFZlKX1mb3IoO1dlKGVbeV0pfHwiLiI9PT1lW3ldOykiLiIhPT1lW3ldPyhmPDM0JiYoIjAiIT09ZVt5XXx8bykmJihvfHwobD1hKSxvPSEwLHVbZysrXT1wYXJzZUludChlW3ldLDEwKSxmKz0xKSxvJiYoYys9MSksaSYmKF8rPTEpLGErPTEseSs9MSk6KGkmJnFlKGUsImNvbnRhaW5zIG11bHRpcGxlIHBlcmlvZHMiKSxpPSEwLHkrPTEpO2lmKGkmJiFhKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2lmKCJlIj09PWVbeV18fCJFIj09PWVbeV0pe2NvbnN0IHQ9ZS5zdWJzdHIoKyt5KS5tYXRjaChKZSk7aWYoIXR8fCF0WzJdKXJldHVybiBuZXcgSGUoVmUpO2Q9cGFyc2VJbnQodFswXSwxMCkseSs9dFswXS5sZW5ndGh9aWYoZVt5XSlyZXR1cm4gbmV3IEhlKFZlKTtpZihmKXtpZihoPWYtMSxzPWMsMSE9PXMpZm9yKDsiMCI9PT1lW2wrcy0xK051bWJlcihyKStOdW1iZXIoaSldOylzLT0xfWVsc2UgdVswXT0wLGM9MSxmPTEscz0wO2ZvcihkPD1fJiZfPmQrMTYzODQ/ZD1EZTpkLT1fO2Q+Q2U7KXtpZihoKz0xLGg+PTM0KXtpZigwPT09cyl7ZD1DZTticmVha31xZShlLCJvdmVyZmxvdyIpfWQtPTF9aWYodC5hbGxvd1JvdW5kaW5nKXtmb3IoO2Q8RGV8fGY8Yzspe2lmKDA9PT1oJiZzPGYpe2Q9RGUscz0wO2JyZWFrfWlmKGY8Yz9jLT0xOmgtPTEsZDxDZSlkKz0xO2Vsc2V7aWYodS5qb2luKCIiKS5tYXRjaCgvXjArJC8pKXtkPUNlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9fWlmKGgrMTxzKXtsZXQgdD1hO2kmJihsKz0xLHQrPTEpLHImJihsKz0xLHQrPTEpO2NvbnN0IG89cGFyc2VJbnQoZVtsK2grMV0sMTApO2xldCBzPTA7aWYobz49NSYmKHM9MSw1PT09bykpe3M9dVtoXSUyPT0xPzE6MDtmb3IobGV0IG49bCtoKzI7bjx0O24rKylpZihwYXJzZUludChlW25dLDEwKSl7cz0xO2JyZWFrfX1pZihzKXtsZXQgZT1oO2Zvcig7ZT49MCYmKyt1W2VdPjk7ZS0tKWlmKHVbZV09MCwwPT09ZSl7aWYoIShkPENlKSlyZXR1cm4gbmV3IEhlKG4/TWU6UGUpO2QrPTEsdVtlXT0xfX19fWVsc2V7Zm9yKDtkPERlfHxmPGM7KXtpZigwPT09aCl7aWYoMD09PXMpe2Q9RGU7YnJlYWt9cWUoZSwiZXhwb25lbnQgdW5kZXJmbG93Iil9ZjxjPygiMCIhPT1lW2MtMStOdW1iZXIocikrTnVtYmVyKGkpXSYmMCE9PXMmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKSxjLT0xKTooMCE9PXVbaF0mJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKSxoLT0xKSxkPENlP2QrPTE6cWUoZSwib3ZlcmZsb3ciKX1pZihoKzE8cyl7aSYmKGwrPTEpLHImJihsKz0xKTswIT09cGFyc2VJbnQoZVtsK2grMV0sMTApJiZxZShlLCJpbmV4YWN0IHJvdW5kaW5nIil9fWlmKGI9UmUuZnJvbU51bWJlcigwKSx3PVJlLmZyb21OdW1iZXIoMCksMD09PXMpYj1SZS5mcm9tTnVtYmVyKDApLHc9UmUuZnJvbU51bWJlcigwKTtlbHNlIGlmKGg8MTcpe2xldCBlPTA7Zm9yKHc9UmUuZnJvbU51bWJlcih1W2UrK10pLGI9bmV3IFJlKDAsMCk7ZTw9aDtlKyspdz13Lm11bHRpcGx5KFJlLmZyb21OdW1iZXIoMTApKSx3PXcuYWRkKFJlLmZyb21OdW1iZXIodVtlXSkpfWVsc2V7bGV0IGU9MDtmb3IoYj1SZS5mcm9tTnVtYmVyKHVbZSsrXSk7ZTw9aC0xNztlKyspYj1iLm11bHRpcGx5KFJlLmZyb21OdW1iZXIoMTApKSxiPWIuYWRkKFJlLmZyb21OdW1iZXIodVtlXSkpO2Zvcih3PVJlLmZyb21OdW1iZXIodVtlKytdKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoUmUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoUmUuZnJvbU51bWJlcih1W2VdKSl9Y29uc3QgQj1mdW5jdGlvbihlLHQpe2lmKCFlJiYhdClyZXR1cm57aGlnaDpSZS5mcm9tTnVtYmVyKDApLGxvdzpSZS5mcm9tTnVtYmVyKDApfTtjb25zdCBuPWUuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxyPW5ldyBSZShlLmdldExvd0JpdHMoKSwwKSxpPXQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxvPW5ldyBSZSh0LmdldExvd0JpdHMoKSwwKTtsZXQgcz1uLm11bHRpcGx5KGkpLGE9bi5tdWx0aXBseShvKTtjb25zdCBjPXIubXVsdGlwbHkoaSk7bGV0IF89ci5tdWx0aXBseShvKTtyZXR1cm4gcz1zLmFkZChhLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLGE9bmV3IFJlKGEuZ2V0TG93Qml0cygpLDApLmFkZChjKS5hZGQoXy5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksXz1hLnNoaWZ0TGVmdCgzMikuYWRkKG5ldyBSZShfLmdldExvd0JpdHMoKSwwKSkse2hpZ2g6cyxsb3c6X319KGIsUmUuZnJvbVN0cmluZygiMTAwMDAwMDAwMDAwMDAwMDAwIikpO0IubG93PUIubG93LmFkZCh3KSxmdW5jdGlvbihlLHQpe2NvbnN0IG49ZS5oaWdoPj4+MCxyPXQuaGlnaD4+PjA7aWYobjxyKXJldHVybiEwO2lmKG49PT1yJiZlLmxvdz4+PjA8dC5sb3c+Pj4wKXJldHVybiEwO3JldHVybiExfShCLmxvdyx3KSYmKEIuaGlnaD1CLmhpZ2guYWRkKFJlLmZyb21OdW1iZXIoMSkpKSxwPWQrNjE3Njtjb25zdCBVPXtsb3c6UmUuZnJvbU51bWJlcigwKSxoaWdoOlJlLmZyb21OdW1iZXIoMCl9O0IuaGlnaC5zaGlmdFJpZ2h0VW5zaWduZWQoNDkpLmFuZChSZS5mcm9tTnVtYmVyKDEpKS5lcXVhbHMoUmUuZnJvbU51bWJlcigxKSk/KFUuaGlnaD1VLmhpZ2gub3IoUmUuZnJvbU51bWJlcigzKS5zaGlmdExlZnQoNjEpKSxVLmhpZ2g9VS5oaWdoLm9yKFJlLmZyb21OdW1iZXIocCkuYW5kKFJlLmZyb21OdW1iZXIoMTYzODMpLnNoaWZ0TGVmdCg0NykpKSxVLmhpZ2g9VS5oaWdoLm9yKEIuaGlnaC5hbmQoUmUuZnJvbU51bWJlcigweDdmZmZmZmZmZmZmZikpKSk6KFUuaGlnaD1VLmhpZ2gub3IoUmUuZnJvbU51bWJlcigxNjM4MyZwKS5zaGlmdExlZnQoNDkpKSxVLmhpZ2g9VS5oaWdoLm9yKEIuaGlnaC5hbmQoUmUuZnJvbU51bWJlcig1NjI5NDk5NTM0MjEzMTEpKSkpLFUubG93PUIubG93LG4mJihVLmhpZ2g9VS5oaWdoLm9yKFJlLmZyb21TdHJpbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSkpO2NvbnN0IEU9ZmUuYWxsb2NhdGVVbnNhZmUoMTYpO3JldHVybiB5PTAsRVt5KytdPTI1NSZVLmxvdy5sb3csRVt5KytdPVUubG93Lmxvdz4+OCYyNTUsRVt5KytdPVUubG93Lmxvdz4+MTYmMjU1LEVbeSsrXT1VLmxvdy5sb3c+PjI0JjI1NSxFW3krK109MjU1JlUubG93LmhpZ2gsRVt5KytdPVUubG93LmhpZ2g+PjgmMjU1LEVbeSsrXT1VLmxvdy5oaWdoPj4xNiYyNTUsRVt5KytdPVUubG93LmhpZ2g+PjI0JjI1NSxFW3krK109MjU1JlUuaGlnaC5sb3csRVt5KytdPVUuaGlnaC5sb3c+PjgmMjU1LEVbeSsrXT1VLmhpZ2gubG93Pj4xNiYyNTUsRVt5KytdPVUuaGlnaC5sb3c+PjI0JjI1NSxFW3krK109MjU1JlUuaGlnaC5oaWdoLEVbeSsrXT1VLmhpZ2guaGlnaD4+OCYyNTUsRVt5KytdPVUuaGlnaC5oaWdoPj4xNiYyNTUsRVt5KytdPVUuaGlnaC5oaWdoPj4yNCYyNTUsbmV3IEhlKEUpfXRvU3RyaW5nKCl7bGV0IGUsdD0wO2NvbnN0IG49bmV3IEFycmF5KDM2KTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdPTA7bGV0IHIsaSxvLHM9MCxhPSExLGM9e3BhcnRzOlswLDAsMCwwXX07Y29uc3QgXz1bXTtzPTA7Y29uc3QgbD10aGlzLmJ5dGVzLHU9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsZj1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxnPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGg9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQ7cz0wOyh7bG93Om5ldyBSZSh1LGYpLGhpZ2g6bmV3IFJlKGcsaCl9KS5oaWdoLmxlc3NUaGFuKFJlLlpFUk8pJiZfLnB1c2goIi0iKTtjb25zdCBkPWg+PjI2JjMxO2lmKGQ+PjM9PTMpe2lmKDMwPT09ZClyZXR1cm4gXy5qb2luKCIiKSsiSW5maW5pdHkiO2lmKDMxPT09ZClyZXR1cm4iTmFOIjtlPWg+PjE1JjE2MzgzLHI9OCsoaD4+MTQmMSl9ZWxzZSByPWg+PjE0JjcsZT1oPj4xNyYxNjM4Mztjb25zdCBiPWUtNjE3NjtpZihjLnBhcnRzWzBdPSgxNjM4MyZoKSsoKDE1JnIpPDwxNCksYy5wYXJ0c1sxXT1nLGMucGFydHNbMl09ZixjLnBhcnRzWzNdPXUsMD09PWMucGFydHNbMF0mJjA9PT1jLnBhcnRzWzFdJiYwPT09Yy5wYXJ0c1syXSYmMD09PWMucGFydHNbM10pYT0hMDtlbHNlIGZvcihvPTM7bz49MDtvLS0pe2xldCBlPTA7Y29uc3QgdD1ZZShjKTtpZihjPXQucXVvdGllbnQsZT10LnJlbS5sb3csZSlmb3IoaT04O2k+PTA7aS0tKW5bOSpvK2ldPWUlMTAsZT1NYXRoLmZsb29yKGUvMTApfWlmKGEpdD0xLG5bc109MDtlbHNlIGZvcih0PTM2OyFuW3NdOyl0LT0xLHMrPTE7Y29uc3Qgdz10LTErYjtpZih3Pj0zNHx8dzw9LTd8fGI+MCl7aWYodD4zNClyZXR1cm4gXy5wdXNoKCIwIiksYj4wP18ucHVzaChgRSske2J9YCk6YjwwJiZfLnB1c2goYEUke2J9YCksXy5qb2luKCIiKTtfLnB1c2goYCR7bltzKytdfWApLHQtPTEsdCYmXy5wdXNoKCIuIik7Zm9yKGxldCBlPTA7ZTx0O2UrKylfLnB1c2goYCR7bltzKytdfWApO18ucHVzaCgiRSIpLHc+MD9fLnB1c2goYCske3d9YCk6Xy5wdXNoKGAke3d9YCl9ZWxzZSBpZihiPj0wKWZvcihsZXQgZT0wO2U8dDtlKyspXy5wdXNoKGAke25bcysrXX1gKTtlbHNle2xldCBlPXQrYjtpZihlPjApZm9yKGxldCB0PTA7dDxlO3QrKylfLnB1c2goYCR7bltzKytdfWApO2Vsc2UgXy5wdXNoKCIwIik7Zm9yKF8ucHVzaCgiLiIpO2UrKzwwOylfLnB1c2goIjAiKTtmb3IobGV0IHI9MDtyPHQtTWF0aC5tYXgoZS0xLDApO3IrKylfLnB1c2goYCR7bltzKytdfWApfXJldHVybiBfLmpvaW4oIiIpfXRvSlNPTigpe3JldHVybnskbnVtYmVyRGVjaW1hbDp0aGlzLnRvU3RyaW5nKCl9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIEhlLmZyb21TdHJpbmcoZS4kbnVtYmVyRGVjaW1hbCl9aW5zcGVjdChlLHQsbil7bj8/PXc7cmV0dXJuYG5ldyBEZWNpbWFsMTI4KCR7bih0aGlzLnRvU3RyaW5nKCksdCl9KWB9fWNsYXNzIEtlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEb3VibGUifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1OdW1iZXIoZSk7aWYoIk5hTiI9PT1lKXJldHVybiBuZXcgS2UoTmFOKTtpZigiSW5maW5pdHkiPT09ZSlyZXR1cm4gbmV3IEtlKDEvMCk7aWYoIi1JbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoLTEvMCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSl0aHJvdyBuZXcgWihgSW5wdXQ6ICR7ZX0gaXMgbm90IHJlcHJlc2VudGFibGUgYXMgYSBEb3VibGVgKTtpZihlLnRyaW0oKSE9PWUpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgY29udGFpbnMgd2hpdGVzcGFjZWApO2lmKCIiPT09ZSl0aHJvdyBuZXcgWigiSW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nIik7aWYoL1teLTAtOS4rZUVdLy50ZXN0KGUpKXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBpbiBkZWNpbWFsIG9yIGV4cG9uZW50aWFsIG5vdGF0aW9uYCk7cmV0dXJuIG5ldyBLZSh0KX12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9KU09OKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9TdHJpbmcoZSl7cmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJihlLmxlZ2FjeXx8ZS5yZWxheGVkJiZpc0Zpbml0ZSh0aGlzLnZhbHVlKSk/dGhpcy52YWx1ZTpPYmplY3QuaXMoTWF0aC5zaWduKHRoaXMudmFsdWUpLC0wKT97JG51bWJlckRvdWJsZToiLTAuMCJ9OnskbnVtYmVyRG91YmxlOk51bWJlci5pc0ludGVnZXIodGhpcy52YWx1ZSk/dGhpcy52YWx1ZS50b0ZpeGVkKDEpOnRoaXMudmFsdWUudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdCBuPXBhcnNlRmxvYXQoZS4kbnVtYmVyRG91YmxlKTtyZXR1cm4gdCYmdC5yZWxheGVkP246bmV3IEtlKG4pfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IERvdWJsZSgke24odGhpcy52YWx1ZSx0KX0pYH19Y2xhc3MgWmUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkludDMyIn12YWx1ZTtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLGUgaW5zdGFuY2VvZiBOdW1iZXImJihlPWUudmFsdWVPZigpKSx0aGlzLnZhbHVlPTB8K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1PZShlKSxuPU51bWJlcihlKTtpZihtPG4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgZm9yIEludDMyYCk7aWYoUz5uKXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZighTnVtYmVyLmlzU2FmZUludGVnZXIobikpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7aWYobi50b1N0cmluZygpIT09dCl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSB2YWxpZCBJbnQzMiBzdHJpbmdgKTtyZXR1cm4gbmV3IFplKG4pfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUucmVsYXhlZHx8ZS5sZWdhY3kpP3RoaXMudmFsdWU6eyRudW1iZXJJbnQ6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe3JldHVybiB0JiZ0LnJlbGF4ZWQ/cGFyc2VJbnQoZS4kbnVtYmVySW50LDEwKTpuZXcgWmUoZS4kbnVtYmVySW50KX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PXcsYG5ldyBJbnQzMigke24odGhpcy52YWx1ZSx0KX0pYH19Y2xhc3MgR2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk1heEtleSJ9dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG1heEtleToxfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTigpe3JldHVybiBuZXcgR2V9aW5zcGVjdCgpe3JldHVybiJuZXcgTWF4S2V5KCkifX1jbGFzcyBYZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWluS2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWluS2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBYZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNaW5LZXkoKSJ9fWNvbnN0IFFlPW5ldyBXZWFrTWFwLGV0PVtdO2ZvcihsZXQgZT0wO2U8MjU2O2UrKylldC5wdXNoKGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSk7Y29uc3QgdHQ9bmV3IEludDhBcnJheSgxMDMpO2ZvcihsZXQgZT00ODtlPD01NztlKyspdHRbZV09ZS00ODtmb3IobGV0IGU9NjU7ZTw9NzA7ZSsrKXR0W2VdPWUtNTU7Zm9yKGxldCBlPTk3O2U8PTEwMjtlKyspdHRbZV09ZS04NztjbGFzcyBudCBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iT2JqZWN0SWQifXN0YXRpYyBpbmRleD0wO3N0YXRpYyBQUk9DRVNTX1VOSVFVRT1udWxsO3N0YXRpYyByZXNldFN0YXRlPSgpPT57dGhpcy5pbmRleD1NYXRoLmZsb29yKDE2Nzc3MjE2Kk1hdGgucmFuZG9tKCkpLHRoaXMuUFJPQ0VTU19VTklRVUU9bnVsbH07c3RhdGlje3RoaXMucmVzZXRTdGF0ZSgpO2NvbnN0e3N0YXJ0dXBTbmFwc2hvdDplfT1nbG9iYWxUaGlzPy5wcm9jZXNzPy5nZXRCdWlsdGluTW9kdWxlPy4oInY4Iik/P3t9O2U/LmlzQnVpbGRpbmdTbmFwc2hvdD8uKCkmJmU/LmFkZERlc2VyaWFsaXplQ2FsbGJhY2s/Lih0aGlzLnJlc2V0U3RhdGUpfXN0YXRpYyBjYWNoZUhleFN0cmluZztpMDtpMTtpMjtpMztzZXRGcm9tQnl0ZXMoZSx0PTApe3RoaXMuaTA9ZVt0XTw8MTZ8ZVt0KzFdPDw4fGVbdCsyXSx0aGlzLmkxPWVbdCszXTw8MTZ8ZVt0KzRdPDw4fGVbdCs1XSx0aGlzLmkyPWVbdCs2XTw8MTZ8ZVt0KzddPDw4fGVbdCs4XSx0aGlzLmkzPWVbdCs5XTw8MTZ8ZVt0KzEwXTw8OHxlW3QrMTFdfXNldEZyb21IZXgoZSl7Y29uc3QgdD10dDt0aGlzLmkwPXRbZS5jaGFyQ29kZUF0KDApXTw8MjB8dFtlLmNoYXJDb2RlQXQoMSldPDwxNnx0W2UuY2hhckNvZGVBdCgyKV08PDEyfHRbZS5jaGFyQ29kZUF0KDMpXTw8OHx0W2UuY2hhckNvZGVBdCg0KV08PDR8dFtlLmNoYXJDb2RlQXQoNSldLHRoaXMuaTE9dFtlLmNoYXJDb2RlQXQoNildPDwyMHx0W2UuY2hhckNvZGVBdCg3KV08PDE2fHRbZS5jaGFyQ29kZUF0KDgpXTw8MTJ8dFtlLmNoYXJDb2RlQXQoOSldPDw4fHRbZS5jaGFyQ29kZUF0KDEwKV08PDR8dFtlLmNoYXJDb2RlQXQoMTEpXSx0aGlzLmkyPXRbZS5jaGFyQ29kZUF0KDEyKV08PDIwfHRbZS5jaGFyQ29kZUF0KDEzKV08PDE2fHRbZS5jaGFyQ29kZUF0KDE0KV08PDEyfHRbZS5jaGFyQ29kZUF0KDE1KV08PDh8dFtlLmNoYXJDb2RlQXQoMTYpXTw8NHx0W2UuY2hhckNvZGVBdCgxNyldLHRoaXMuaTM9dFtlLmNoYXJDb2RlQXQoMTgpXTw8MjB8dFtlLmNoYXJDb2RlQXQoMTkpXTw8MTZ8dFtlLmNoYXJDb2RlQXQoMjApXTw8MTJ8dFtlLmNoYXJDb2RlQXQoMjEpXTw8OHx0W2UuY2hhckNvZGVBdCgyMildPDw0fHRbZS5jaGFyQ29kZUF0KDIzKV19Y29uc3RydWN0b3IoZSx0KXtpZihzdXBlcigpLCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdm9pZCB0aGlzLnNldEZyb21CeXRlcyhlLHQpO2xldCBuO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmZSYmImlkImluIGUpe2lmKG50LmlzKGUpJiYibnVtYmVyIj09dHlwZW9mIGUuaTAmJiJudW1iZXIiPT10eXBlb2YgZS5pMSYmIm51bWJlciI9PXR5cGVvZiBlLmkyJiYibnVtYmVyIj09dHlwZW9mIGUuaTMpcmV0dXJuIHRoaXMuaTA9ZS5pMCx0aGlzLmkxPWUuaTEsdGhpcy5pMj1lLmkyLHZvaWQodGhpcy5pMz1lLmkzKTtpZigic3RyaW5nIiE9dHlwZW9mIGUuaWQmJiFBcnJheUJ1ZmZlci5pc1ZpZXcoZS5pZCkpdGhyb3cgbmV3IFooIkFyZ3VtZW50IHBhc3NlZCBpbiBtdXN0IGhhdmUgYW4gaWQgdGhhdCBpcyBvZiB0eXBlIHN0cmluZyBvciBCdWZmZXIiKTtuPSJ0b0hleFN0cmluZyJpbiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b0hleFN0cmluZz9mZS5mcm9tSGV4KGUudG9IZXhTdHJpbmcoKSk6ZS5pZH1lbHNlIG49ZTtpZihudWxsPT1uKXtjb25zdCBlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpLHQ9bnQuZ2V0SW5jKCksbj1udC5QUk9DRVNTX1VOSVFVRT8/PWZlLnJhbmRvbUJ5dGVzKDUpO3RoaXMuaTA9ZT4+PjgmMTY3NzcyMTUsdGhpcy5pMT0oMjU1JmUpPDwxNnxuWzBdPDw4fG5bMV0sdGhpcy5pMj1uWzJdPDwxNnxuWzNdPDw4fG5bNF0sdGhpcy5pMz0xNjc3NzIxNSZ0fWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KG4pJiYxMj09PW4uYnl0ZUxlbmd0aCl0aGlzLnNldEZyb21CeXRlcyhuIGluc3RhbmNlb2YgVWludDhBcnJheT9uOmZlLnRvTG9jYWxCdWZmZXJUeXBlKG4pKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCFudC52YWxpZGF0ZUhleFN0cmluZyhuKSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLnNldEZyb21IZXgobiksbnQuY2FjaGVIZXhTdHJpbmcmJlFlLnNldCh0aGlzLG4pfX1nZXQgaWQoKXtjb25zdCBlPWZlLmFsbG9jYXRlVW5zYWZlKDEyKTtyZXR1cm4gZVswXT10aGlzLmkwPj4+MTYmMjU1LGVbMV09dGhpcy5pMD4+PjgmMjU1LGVbMl09MjU1JnRoaXMuaTAsZVszXT10aGlzLmkxPj4+MTYmMjU1LGVbNF09dGhpcy5pMT4+PjgmMjU1LGVbNV09MjU1JnRoaXMuaTEsZVs2XT10aGlzLmkyPj4+MTYmMjU1LGVbN109dGhpcy5pMj4+PjgmMjU1LGVbOF09MjU1JnRoaXMuaTIsZVs5XT10aGlzLmkzPj4+MTYmMjU1LGVbMTBdPXRoaXMuaTM+Pj44JjI1NSxlWzExXT0yNTUmdGhpcy5pMyxlfXNldCBpZChlKXtjb25zdCB0PWUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6ZmUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7dGhpcy5zZXRGcm9tQnl0ZXModCksbnQuY2FjaGVIZXhTdHJpbmcmJlFlLnNldCh0aGlzLGZlLnRvSGV4KHQpKX1zdGF0aWMgdmFsaWRhdGVIZXhTdHJpbmcoZSl7aWYoMjQhPT1lPy5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCB0PTA7dDwyNDt0Kyspe2NvbnN0IG49ZS5jaGFyQ29kZUF0KHQpO2lmKCEobj49NDgmJm48PTU3fHxuPj05NyYmbjw9MTAyfHxuPj02NSYmbjw9NzApKXJldHVybiExfXJldHVybiEwfXRvSGV4U3RyaW5nKCl7aWYobnQuY2FjaGVIZXhTdHJpbmcpe2NvbnN0IGU9UWUuZ2V0KHRoaXMpO2lmKGUpcmV0dXJuIGV9Y29uc3QgZT10aGlzLmkwLHQ9dGhpcy5pMSxuPXRoaXMuaTIscj10aGlzLmkzLGk9ZXRbZT4+PjE2JjI1NV0rZXRbZT4+PjgmMjU1XStldFsyNTUmZV0rZXRbdD4+PjE2JjI1NV0rZXRbdD4+PjgmMjU1XStldFsyNTUmdF0rZXRbbj4+PjE2JjI1NV0rZXRbbj4+PjgmMjU1XStldFsyNTUmbl0rZXRbcj4+PjE2JjI1NV0rZXRbcj4+PjgmMjU1XStldFsyNTUmcl07cmV0dXJuIG50LmNhY2hlSGV4U3RyaW5nJiZRZS5zZXQodGhpcyxpKSxpfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gbnQuaW5kZXg9KG50LmluZGV4KzEpJTE2Nzc3MjE2fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PW50LmdldEluYygpLG49ZmUuYWxsb2NhdGVVbnNhZmUoMTIpO3BlLnNldEludDMyQkUobiwwLGUpO2NvbnN0IHI9dGhpcy5QUk9DRVNTX1VOSVFVRT8/PWZlLnJhbmRvbUJ5dGVzKDUpO3JldHVybiBuWzRdPXJbMF0sbls1XT1yWzFdLG5bNl09clsyXSxuWzddPXJbM10sbls4XT1yWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+Pj44JjI1NSxuWzldPXQ+Pj4xNiYyNTUsbn10b1N0cmluZyhlKXtyZXR1cm4iYmFzZTY0Ij09PWU/ZmUudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9c3RhdGljIGlzKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJfYnNvbnR5cGUiaW4gZSYmIk9iamVjdElkIj09PWUuX2Jzb250eXBlfWVxdWFscyhlKXtpZihudWxsPT1lKXJldHVybiExO2lmKG50LmlzKGUpJiYibnVtYmVyIj09dHlwZW9mIGUuaTAmJiJudW1iZXIiPT10eXBlb2YgZS5pMSYmIm51bWJlciI9PXR5cGVvZiBlLmkyJiYibnVtYmVyIj09dHlwZW9mIGUuaTMpcmV0dXJuIHRoaXMuaTM9PT1lLmkzJiZ0aGlzLmkwPT09ZS5pMCYmdGhpcy5pMT09PWUuaTEmJnRoaXMuaTI9PT1lLmkyO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9MjU2KnRoaXMuaTArKHRoaXMuaTE+Pj4xNik7cmV0dXJuIGUuc2V0VGltZSgxZTMqdCksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IG50fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmkwPj4+MTYmMjU1LGVbdCsxXT10aGlzLmkwPj4+OCYyNTUsZVt0KzJdPTI1NSZ0aGlzLmkwLGVbdCszXT10aGlzLmkxPj4+MTYmMjU1LGVbdCs0XT10aGlzLmkxPj4+OCYyNTUsZVt0KzVdPTI1NSZ0aGlzLmkxLGVbdCs2XT10aGlzLmkyPj4+MTYmMjU1LGVbdCs3XT10aGlzLmkyPj4+OCYyNTUsZVt0KzhdPTI1NSZ0aGlzLmkyLGVbdCs5XT10aGlzLmkzPj4+MTYmMjU1LGVbdCsxMF09dGhpcy5pMz4+PjgmMjU1LGVbdCsxMV09MjU1JnRoaXMuaTMsMTJ9c3RhdGljIGNyZWF0ZUZyb21UaW1lKGUpe2NvbnN0IHQ9ZmUuYWxsb2NhdGUoMTIpO2ZvcihsZXQgZT0xMTtlPj00O2UtLSl0W2VdPTA7cmV0dXJuIHBlLnNldEludDMyQkUodCwwLGUpLG5ldyBudCh0KX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtpZigyNCE9PWU/Lmxlbmd0aCl0aHJvdyBuZXcgWigiaGV4IHN0cmluZyBtdXN0IGJlIDI0IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IG50KGZlLmZyb21IZXgoZSkpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe2lmKDE2IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJiYXNlNjQgc3RyaW5nIG11c3QgYmUgMTYgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgbnQoZmUuZnJvbUJhc2U2NChlKSl9c3RhdGljIGlzVmFsaWQoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIG50LnZhbGlkYXRlSGV4U3RyaW5nKGUpO3RyeXtyZXR1cm4gbmV3IG50KGUpLCEwfWNhdGNoe3JldHVybiExfX10b0V4dGVuZGVkSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nP3skb2lkOnRoaXMudG9IZXhTdHJpbmcoKX06eyRvaWQ6dGhpcy50b1N0cmluZygiaGV4Iil9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe3JldHVybiBuZXcgbnQoZS4kb2lkKX1pc0NhY2hlZCgpe3JldHVybiBudC5jYWNoZUhleFN0cmluZyYmUWUuaGFzKHRoaXMpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IE9iamVjdElkKCR7bih0aGlzLnRvSGV4U3RyaW5nKCksdCl9KWB9fWZ1bmN0aW9uIHJ0KGUsdCxuPSExLHI9ITEsaT0hMSxvLHMpe3N3aXRjaCgiZnVuY3Rpb24iPT10eXBlb2YgdD8udG9CU09OJiYodD10LnRvQlNPTigpKSx0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOnJldHVybiAxK2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErNCtmZS51dGY4Qnl0ZUxlbmd0aCh0KSsxO2Nhc2UibnVtYmVyIjpyZXR1cm4gTWF0aC5mbG9vcih0KT09PXQmJnQ+PUUmJnQ8PVUmJnQ+PVMmJnQ8PW0/ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSs1OmZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErOTtjYXNlInVuZGVmaW5lZCI6cmV0dXJuIHJ8fCFpP2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMTowO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxO2lmKCJPYmplY3RJZCI9PT10Ll9ic29udHlwZSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxMztpZih0IGluc3RhbmNlb2YgRGF0ZXx8Yih0KSlyZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzYrdC5ieXRlTGVuZ3RoO2lmKCJMb25nIj09PXQuX2Jzb250eXBlfHwiRG91YmxlIj09PXQuX2Jzb250eXBlfHwiVGltZXN0YW1wIj09PXQuX2Jzb250eXBlKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzk7aWYoIkRlY2ltYWwxMjgiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMTc7aWYoIkludDMyIj09PXQuX2Jzb250eXBlKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzU7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpe2lmKG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wKXtpZihzLmhhcyh0LnNjb3BlKSl0aHJvdyBuZXcgWigiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTtyZXR1cm4gby5wdXNoKHtvYmplY3Q6dC5zY29wZSxpZ25vcmVVbmRlZmluZWQ6aSxleGl0OiExfSksZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrNCtmZS51dGY4Qnl0ZUxlbmd0aCh0LmNvZGUudG9TdHJpbmcoKSkrMX1yZXR1cm4gZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrZmUudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzF9aWYoIkJpbmFyeSI9PT10Ll9ic29udHlwZSl7Y29uc3Qgbj10O3JldHVybiBuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZP2ZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErKG4ucG9zaXRpb24rMSs0KzErNCk6ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsobi5wb3NpdGlvbisxKzQrMSl9aWYoIkJTT05TeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErZmUudXRmOEJ5dGVMZW5ndGgodC52YWx1ZSkrNCsxKzE7aWYoIkRCUmVmIj09PXQuX2Jzb250eXBlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oeyRyZWY6dC5jb2xsZWN0aW9uLCRpZDp0Lm9pZH0sdC5maWVsZHMpO3JldHVybiBudWxsIT10LmRiJiYobi4kZGI9dC5kYiksby5wdXNoKHtvYmplY3Q6bixpZ25vcmVVbmRlZmluZWQ6ITAsZXhpdDohMX0pLGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMX1pZih0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpKXJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzErZmUudXRmOEJ5dGVMZW5ndGgodC5zb3VyY2UpKzErKHQuZ2xvYmFsPzE6MCkrKHQuaWdub3JlQ2FzZT8xOjApKyh0Lm11bHRpbGluZT8xOjApKzE7aWYoIkJTT05SZWdFeHAiPT09dC5fYnNvbnR5cGUpcmV0dXJuIGZlLnV0ZjhCeXRlTGVuZ3RoKGUpKzErMStmZS51dGY4Qnl0ZUxlbmd0aCh0LnBhdHRlcm4pKzErZmUudXRmOEJ5dGVMZW5ndGgodC5vcHRpb25zKSsxO2lmKHMuaGFzKHQpKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO3JldHVybiBvLnB1c2goe29iamVjdDp0LGlnbm9yZVVuZGVmaW5lZDppLGV4aXQ6ITF9KSxmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzE7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIG4/ZmUudXRmOEJ5dGVMZW5ndGgoZSkrMSsxKzQrZmUudXRmOEJ5dGVMZW5ndGgodC50b1N0cmluZygpKSsxOjA7Y2FzZSJiaWdpbnQiOnJldHVybiBmZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PVJlO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPVJlLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihSZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChSZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KFJlLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoUmUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9UmUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPVJlLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9UmUuZnJvbU51bWJlcihVKSxfdD1SZS5mcm9tTnVtYmVyKEUpO2Z1bmN0aW9uIGx0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBmdW5jdGlvbihlLHQsbixyPSExKXtuPXsuLi5ufTtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxfPW4ucHJvbW90ZVZhbHVlcz8/ITAsbD1uLnVzZUJpZ0ludDY0Pz8hMTtpZihsJiYhXyl0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2NvbnN0IHU9bnVsbD09bi52YWxpZGF0aW9uP3t1dGY4OiEwfTpuLnZhbGlkYXRpb247bGV0IGYsZyxoPSEwO2NvbnN0IGQ9dS51dGY4O2lmKCJib29sZWFuIj09dHlwZW9mIGQpZj1kO2Vsc2V7aD0hMTtjb25zdCBlPU9iamVjdC5rZXlzKGQpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGRbZV19KSk7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJVVEYtOCB2YWxpZGF0aW9uIHNldHRpbmcgY2Fubm90IGJlIGVtcHR5Iik7aWYoImJvb2xlYW4iIT10eXBlb2YgZVswXSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiwgbXVzdCBzcGVjaWZ5IGJvb2xlYW4gdmFsdWVzIik7aWYoZj1lWzBdLCFlLmV2ZXJ5KChlPT5lPT09ZikpKXRocm93IG5ldyBaKCJJbnZhbGlkIFVURi04IHZhbGlkYXRpb24gb3B0aW9uIC0ga2V5cyBtdXN0IGJlIGFsbCB0cnVlIG9yIGFsbCBmYWxzZSIpfWlmKCFoKXtnPW5ldyBTZXQ7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMoZCkpZy5hZGQoZSl9Y29uc3QgYj10O2lmKGUubGVuZ3RoPDUpdGhyb3cgbmV3IFooImNvcnJ1cHQgYnNvbiBtZXNzYWdlIDwgNSBieXRlcyBsb25nIik7Y29uc3Qgdz1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCx3PDV8fHc+ZS5sZW5ndGgpdGhyb3cgbmV3IFooImNvcnJ1cHQgYnNvbiBtZXNzYWdlIik7Y29uc3QgcD1yP1tdOnt9O2xldCB5PTAsbT0hciYmbnVsbCxTPW51bGwseD1wLEI9cjtmb3IoOzspe2NvbnN0IG49ZVt0KytdO2lmKDA9PT1uKXtpZihTKXtpZih0PT09Uy5sYXN0SW5kZXgpe2NvbnN0IGU9UztTPWUucHJldixudWxsPT09Uz8oeD1wLEI9cik6KHg9Uy5ob2xkaW5nRG9jdW1lbnQsQj1TLmlzQXJyYXkpO2xldCB0PWUuaG9sZGluZ0RvY3VtZW50O3N3aXRjaChlLmVsZW1lbnRUeXBlKXtjYXNlIE46ZS5pc1Bvc3NpYmxlREJSZWYmJih0PWd0KHQpKTticmVhaztjYXNlIHY6YnJlYWs7Y2FzZSBEOnQ9bmV3IFVlKGUuZnVuY3Rpb25TdHJpbmcsZS5ob2xkaW5nRG9jdW1lbnQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVuZXhwZWN0ZWQgZWxlbWVudCB0eXBlIGluIGZyYW1lIHN0YWNrIil9ZnQoeCxlLnByb3BlcnR5TmFtZSx0KTtjb250aW51ZX1pZihTLmVsZW1lbnRUeXBlPT09dil0aHJvdyBuZXcgWigiY29ycnVwdGVkIGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IG9iamVjdCBub3QgcHJvcGVybHkgdGVybWluYXRlZCIpfWJyZWFrfWxldCB1PXQ7Zm9yKDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IGQ9Qj9udWxsIT09Uz9TLmFycmF5SW5kZXgrKzp5Kys6ZmUudG9VVEY4KGUsdCx1LCExKTtsZXQgYix3O2I9bnVsbCE9PVM/Uy52YWxpZGF0aW9uU2V0dGluZzpofHxnPy5oYXMoZCk/ZjohZixudWxsIT09Uz8hMSE9PVMuaXNQb3NzaWJsZURCUmVmJiYic3RyaW5nIj09dHlwZW9mIGQmJiIkIj09PWRbMF0mJihTLmlzUG9zc2libGVEQlJlZj11dC50ZXN0KGQpKTohMSE9PW0mJiIkIj09PWRbMF0mJihtPXV0LnRlc3QoZCkpO2xldCBVPSExO2lmKHQ9dSsxLG49PT1PKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7dz1mZS50b1VURjgoZSx0LHQrbi0xLGIpLHQrPW59ZWxzZSBpZihuPT09TCl3PW5ldyBudChlLHQpLHQrPTEyO2Vsc2UgaWYobj09PVYmJiExPT09Xyl3PW5ldyBaZShwZS5nZXRJbnQzMkxFKGUsdCkpLHQrPTQ7ZWxzZSBpZihuPT09Vil3PXBlLmdldEludDMyTEUoZSx0KSx0Kz00O2Vsc2UgaWYobj09PUkpdz1wZS5nZXRGbG9hdDY0TEUoZSx0KSx0Kz04LCExPT09XyYmKHc9bmV3IEtlKHcpKTtlbHNlIGlmKG49PT1qKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KSxyPXBlLmdldEludDMyTEUoZSx0KzQpO3QrPTgsdz1uZXcgRGF0ZShuZXcgUmUobixyKS50b051bWJlcigpKX1lbHNlIGlmKG49PT1BKXtpZigwIT09ZVt0XSYmMSE9PWVbdF0pdGhyb3cgbmV3IFooImlsbGVnYWwgYm9vbGVhbiB0eXBlIHZhbHVlIik7dz0xPT09ZVt0KytdfWVsc2UgaWYobj09PU4pe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKG48NXx8bj5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvfHxTPy5yYXcpdz1lLnN1YmFycmF5KHQsdCtuKSx0Kz1uO2Vsc2V7VT0hMDtjb25zdCBlPXtob2xkaW5nRG9jdW1lbnQ6e30sZWxlbWVudFR5cGU6Tixwcm9wZXJ0eU5hbWU6ZCxmdW5jdGlvblN0cmluZzpudWxsLGxhc3RJbmRleDp0K24saXNBcnJheTohMSxhcnJheUluZGV4OjAscmF3OiExLGlzUG9zc2libGVEQlJlZjpudWxsLHZhbGlkYXRpb25TZXR0aW5nOmIscHJldjpTfTtTPWUseD1lLmhvbGRpbmdEb2N1bWVudCxCPSExLHQrPTR9fWVsc2UgaWYobj09PXYpe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKG48NXx8bj5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgYXJyYXkgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXQrbixvPSEoIWl8fCFpW2RdKXx8KFM/LnJhdz8/ITEpO1U9ITA7Y29uc3Qgcz17aG9sZGluZ0RvY3VtZW50OltdLGVsZW1lbnRUeXBlOnYscHJvcGVydHlOYW1lOmQsZnVuY3Rpb25TdHJpbmc6bnVsbCxsYXN0SW5kZXg6cixpc0FycmF5OiEwLGFycmF5SW5kZXg6MCxyYXc6byxpc1Bvc3NpYmxlREJSZWY6ITEsdmFsaWRhdGlvblNldHRpbmc6YixwcmV2OlN9O1M9cyx4PXMuaG9sZGluZ0RvY3VtZW50LEI9ITAsdCs9NH1lbHNlIGlmKG49PT0kKXc9dm9pZCAwO2Vsc2UgaWYobj09PVIpdz1udWxsO2Vsc2UgaWYobj09PVApaWYobCl3PXBlLmdldEJpZ0ludDY0TEUoZSx0KSx0Kz04O2Vsc2V7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04O2NvbnN0IGk9bmV3IFJlKG4scik7dz1jJiYhMD09PV8mJmkubGVzc1RoYW5PckVxdWFsKGN0KSYmaS5ncmVhdGVyVGhhbk9yRXF1YWwoX3QpP2kudG9OdW1iZXIoKTppfWVsc2UgaWYobj09PUope2NvbnN0IG49ZmUuYWxsb2NhdGVVbnNhZmUoMTYpO2ZvcihsZXQgcj0wO3I8MTY7cisrKW5bcl09ZVt0K3JdO3QrPTE2LHc9bmV3IEhlKG4pfWVsc2UgaWYobj09PVQpe2xldCBuPXBlLmdldEludDMyTEUoZSx0KTt0Kz00O2NvbnN0IHI9bixpPWVbdCsrXTtpZihuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCIpO2lmKG4+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJCaW5hcnkgdHlwZSBzaXplIGxhcmdlciB0aGFuIGRvY3VtZW50IHNpemUiKTtpZihpPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZKXtpZihuPXBlLmdldEludDMyTEUoZSx0KSx0Kz00LG48MCl0aHJvdyBuZXcgWigiTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kIGZvciBzdWJ0eXBlIDB4MDIiKTtpZihuPnItNCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIGxvbmcgYmluYXJ5IHNpemUiKTtpZihuPHItNCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIHNob3J0IGJpbmFyeSBzaXplIil9YSYmXz93PWZlLnRvTG9jYWxCdWZmZXJUeXBlKGUuc3ViYXJyYXkodCx0K24pKToodz1uZXcgeWUoZS5zdWJhcnJheSh0LHQrbiksaSksaT09PUgmJkJlLmlzVmFsaWQodykmJih3PXcudG9VVUlEKCkpKSx0Kz1ufWVsc2UgaWYobj09PUYmJiExPT09cyl7Zm9yKHU9dDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj1mZS50b1VURjgoZSx0LHUsITEpO2Zvcih1PXQ9dSsxOzAhPT1lW3VdJiZ1PGUubGVuZ3RoOyl1Kys7aWYodT49ZS5sZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdSwhMSk7dD11KzE7Y29uc3QgaT1uZXcgQXJyYXkoci5sZW5ndGgpO2Zvcih1PTA7dTxyLmxlbmd0aDt1Kyspc3dpdGNoKHJbdV0pe2Nhc2UibSI6aVt1XT0ibSI7YnJlYWs7Y2FzZSJzIjppW3VdPSJnIjticmVhaztjYXNlImkiOmlbdV09ImkifXc9bmV3IFJlZ0V4cChuLGkuam9pbigiIikpfWVsc2UgaWYobj09PUYmJiEwPT09cyl7Zm9yKHU9dDswIT09ZVt1XSYmdTxlLmxlbmd0aDspdSsrO2lmKHU+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj1mZS50b1VURjgoZSx0LHUsITEpO2Zvcih1PXQ9dSsxOzAhPT1lW3VdJiZ1PGUubGVuZ3RoOyl1Kys7aWYodT49ZS5sZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdSwhMSk7dD11KzEsdz1uZXcgaXQobixyKX1lbHNlIGlmKG49PT1DKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1mZS50b1VURjgoZSx0LHQrbi0xLGIpO3c9Xz9yOm5ldyBvdChyKSx0Kz1ufWVsc2UgaWYobj09PU0pdz1uZXcgYXQoe2k6cGUuZ2V0VWludDMyTEUoZSx0KSx0OnBlLmdldFVpbnQzMkxFKGUsdCs0KX0pLHQrPTg7ZWxzZSBpZihuPT09Vyl3PW5ldyBYZTtlbHNlIGlmKG49PT1ZKXc9bmV3IEdlO2Vsc2UgaWYobj09PXope2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPWZlLnRvVVRGOChlLHQsdCtuLTEsYik7dz1uZXcgVWUociksdCs9bn1lbHNlIGlmKG49PT1EKXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48MTMpdGhyb3cgbmV3IFooImNvZGVfd19zY29wZSB0b3RhbCBzaXplIHNob3J0ZXIgbWluaW11bSBleHBlY3RlZCBsZW5ndGgiKTtjb25zdCByPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LHI8PTB8fHI+ZS5sZW5ndGgtdHx8MCE9PWVbdCtyLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3QgaT1mZS50b1VURjgoZSx0LHQrci0xLGIpLG89dCs9cixzPXBlLmdldEludDMyTEUoZSx0KTtpZihzPDV8fHM+ZS5sZW5ndGgtdCl0aHJvdyBuZXcgWigiYmFkIHNjb3BlIGRvY3VtZW50IHNpemUgaW4gY29kZV93X3Njb3BlIik7aWYobjw4K3Mrcil0aHJvdyBuZXcgWigiY29kZV93X3Njb3BlIHRvdGFsIHNpemUgaXMgdG9vIHNob3J0LCB0cnVuY2F0aW5nIHNjb3BlIik7aWYobj44K3Mrcil0aHJvdyBuZXcgWigiY29kZV93X3Njb3BlIHRvdGFsIHNpemUgaXMgdG9vIGxvbmcsIGNsaXBzIG91dGVyIGRvY3VtZW50Iik7VT0hMDtjb25zdCBhPXtob2xkaW5nRG9jdW1lbnQ6e30sZWxlbWVudFR5cGU6RCxwcm9wZXJ0eU5hbWU6ZCxmdW5jdGlvblN0cmluZzppLGxhc3RJbmRleDpvK3MsaXNBcnJheTohMSxhcnJheUluZGV4OjAscmF3OiExLGlzUG9zc2libGVEQlJlZjpudWxsLHZhbGlkYXRpb25TZXR0aW5nOmIscHJldjpTfTtTPWEseD1hLmhvbGRpbmdEb2N1bWVudCxCPSExLHQrPTR9ZWxzZXtpZihuIT09ayl0aHJvdyBuZXcgWihgRGV0ZWN0ZWQgdW5rbm93biBCU09OIHR5cGUgJHtuLnRvU3RyaW5nKDE2KX0gZm9yIGZpZWxkbmFtZSAiJHtkfSJgKTt7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9ZmUudG9VVEY4KGUsdCx0K24tMSxiKTt0Kz1uO2NvbnN0IGk9ZmUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgbj0wO248MTI7bisrKWlbbl09ZVt0K25dO2NvbnN0IG89bmV3IG50KGkpO3QrPTEyLHc9bmV3IEllKHIsbyl9fVV8fGZ0KHgsZCx3KX1pZihudWxsIT09Uyl0aHJvdyBuZXcgWigiY29ycnVwdGVkIGJzb24sIG1vcmUgb2JqZWN0cyBleHBlY3RlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudCBzaXplIik7Y29uc3QgVT1wO2lmKHchPT10LWIpe2lmKHIpdGhyb3cgbmV3IFooImNvcnJ1cHQgYXJyYXkgYnNvbiIpO3Rocm93IG5ldyBaKCJjb3JydXB0IG9iamVjdCBic29uIil9cmV0dXJuIG0/Z3QoVSk6VX0oZSxyLHQsbil9Y29uc3QgdXQ9L15cJHJlZiR8XlwkaWQkfF5cJGRiJC87ZnVuY3Rpb24gZnQoZSx0LG4peyJfX3Byb3RvX18iPT09dD9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6ZVt0XT1ufWZ1bmN0aW9uIGd0KGUpe2lmKEVlKGUpKXtjb25zdHskcmVmOnQsJGlkOm4sJGRiOnIsLi4uaX09ZTtyZXR1cm4gbmV3IEllKHQsbixyLGkpfXJldHVybiBlfWNvbnN0IGh0PS9ceDAwLyxkdD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109TztlWyhyPXIrZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1mZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gd3QoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9WOkk7ZVtyKytdPWk7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09Vj9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHB0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24geXQoZSx0LG4scil7ZVtyKytdPVI7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIG10KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPWo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9UmUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24geHQoZSx0LG4scil7ZVtyKytdPUY7aWYocis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChodCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9ZmUuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGh0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPWZlLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1SOiJNaW5LZXkiPT09bltnZV0/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1mZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gSXQoZSx0LG4scil7ZVtyKytdPVQ7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scil7ZVtyKytdPUo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIE50KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uW2dlXT9QOk07cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPVY7cmV0dXJuIHIrPWZlLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109STtyZXR1cm4gcis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89ZmUuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scil7ZVtyKytdPVQ7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPUM7cis9ZmUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9ZmUuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8pe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJue3NvdXJjZU9iamVjdDplLGlzQXJyYXk6ITAsb2JqZWN0U2l6ZUluZGV4OnQsY29kZVNpemVJbmRleDpuLGl0ZXJUYXJnZXQ6ZSxrZXlzOm51bGwsa2V5SW5kZXg6MCxtYXBJdGVyYXRvcjpudWxsLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b307aWYoZSBpbnN0YW5jZW9mIE1hcHx8ZChlKSlyZXR1cm57c291cmNlT2JqZWN0OmUsaXNBcnJheTohMSxvYmplY3RTaXplSW5kZXg6dCxjb2RlU2l6ZUluZGV4Om4saXRlclRhcmdldDplLGtleXM6bnVsbCxrZXlJbmRleDowLG1hcEl0ZXJhdG9yOmUuZW50cmllcygpLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b307bGV0IHM9ZTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcz8udG9CU09OJiYocz1zLnRvQlNPTigpLG51bGwhPXMmJiJvYmplY3QiIT10eXBlb2YgcykpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtyZXR1cm57c291cmNlT2JqZWN0OmUsaXNBcnJheTohMSxvYmplY3RTaXplSW5kZXg6dCxjb2RlU2l6ZUluZGV4Om4saXRlclRhcmdldDpzLGtleXM6T2JqZWN0LmtleXMocyksa2V5SW5kZXg6MCxtYXBJdGVyYXRvcjpudWxsLHByZXY6cixjaGVja0tleXM6aSxpZ25vcmVVbmRlZmluZWQ6b319ZnVuY3Rpb24gUnQoZSx0LG4scixpLG8scyl7aWYobnVsbD09cyl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihiKHQpfHxoKHQpfHxmKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTtzPW5ldyBTZXR9cy5hZGQodCk7bGV0IGE9anQodCxyLG51bGwsbnVsbCxuLG8pLGM9cis0O2Zvcig7bnVsbCE9PWE7KXtjb25zdCB0PWE7bGV0IG4scjtpZihudWxsIT09dC5tYXBJdGVyYXRvcil7Y29uc3QgaT10Lm1hcEl0ZXJhdG9yLm5leHQoKTtpZihpLmRvbmUpe2VbYysrXT0wLHBlLnNldEludDMyTEUoZSx0Lm9iamVjdFNpemVJbmRleCxjLXQub2JqZWN0U2l6ZUluZGV4KSxudWxsIT09dC5jb2RlU2l6ZUluZGV4JiZwZS5zZXRJbnQzMkxFKGUsdC5jb2RlU2l6ZUluZGV4LGMtdC5jb2RlU2l6ZUluZGV4KSxzLmRlbGV0ZSh0LnNvdXJjZU9iamVjdCksYT10LnByZXY7Y29udGludWV9bj1pLnZhbHVlWzBdLHI9aS52YWx1ZVsxXX1lbHNlIGlmKG51bGwhPT10LmtleXMpe2lmKHQua2V5SW5kZXg+PXQua2V5cy5sZW5ndGgpe2VbYysrXT0wLHBlLnNldEludDMyTEUoZSx0Lm9iamVjdFNpemVJbmRleCxjLXQub2JqZWN0U2l6ZUluZGV4KSxudWxsIT09dC5jb2RlU2l6ZUluZGV4JiZwZS5zZXRJbnQzMkxFKGUsdC5jb2RlU2l6ZUluZGV4LGMtdC5jb2RlU2l6ZUluZGV4KSxzLmRlbGV0ZSh0LnNvdXJjZU9iamVjdCksYT10LnByZXY7Y29udGludWV9bj10LmtleXNbdC5rZXlJbmRleCsrXSxyPXQuaXRlclRhcmdldFtuXX1lbHNle2NvbnN0IGk9dC5pdGVyVGFyZ2V0O2lmKHQua2V5SW5kZXg+PWkubGVuZ3RoKXtlW2MrK109MCxwZS5zZXRJbnQzMkxFKGUsdC5vYmplY3RTaXplSW5kZXgsYy10Lm9iamVjdFNpemVJbmRleCksbnVsbCE9PXQuY29kZVNpemVJbmRleCYmcGUuc2V0SW50MzJMRShlLHQuY29kZVNpemVJbmRleCxjLXQuY29kZVNpemVJbmRleCkscy5kZWxldGUodC5zb3VyY2VPYmplY3QpLGE9dC5wcmV2O2NvbnRpbnVlfWNvbnN0IG89dC5rZXlJbmRleCsrO249U3RyaW5nKG8pLHI9aVtvXX1pZigiZnVuY3Rpb24iPT10eXBlb2Ygcj8udG9CU09OJiYocj1yLnRvQlNPTigpKSwhKHQuaXNBcnJheXx8InN0cmluZyIhPXR5cGVvZiBufHwiJCI9PT1uWzBdJiZkdC5oYXMobikpKXtpZihodC50ZXN0KG4pKXRocm93IG5ldyBaKCJrZXkgIituKyIgbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIik7aWYodC5jaGVja0tleXMpe2lmKCIkIj09PW5bMF0pdGhyb3cgbmV3IFooImtleSAiK24rIiBtdXN0IG5vdCBzdGFydCB3aXRoICckJyIpO2lmKG4uaW5jbHVkZXMoIi4iKSl0aHJvdyBuZXcgWigia2V5ICIrbisiIG11c3Qgbm90IGNvbnRhaW4gJy4nIil9fWNvbnN0IG89dHlwZW9mIHI7aWYodm9pZCAwPT09cikodC5pc0FycmF5fHwhMT09PXQuaWdub3JlVW5kZWZpbmVkKSYmKGM9eXQoZSxuLDAsYykpO2Vsc2UgaWYobnVsbD09PXIpYz15dChlLG4sMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09byljPWJ0KGUsbixyLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1vKWM9d3QoZSxuLHIsYyk7ZWxzZSBpZigiYmlnaW50Ij09PW8pYz1wdChlLG4scixjKTtlbHNlIGlmKCJib29sZWFuIj09PW8pYz1tdChlLG4scixjKTtlbHNlIGlmKCJvYmplY3QiPT09byYmbnVsbD09ci5fYnNvbnR5cGUpaWYociBpbnN0YW5jZW9mIERhdGV8fGIocikpYz1TdChlLG4scixjKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxmKHIpKWM9SXQoZSxuLHIsYyk7ZWxzZSBpZihyIGluc3RhbmNlb2YgUmVnRXhwfHxoKHIpKWM9eHQoZSxuLHIsYyk7ZWxzZXtpZihzLmhhcyhyKSl0aHJvdyBuZXcgWigiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTtjb25zdCBpPUFycmF5LmlzQXJyYXkocik7ZVtjKytdPWk/djpOLGMrPWZlLmVuY29kZVVURjhJbnRvKGUsbixjKSxlW2MrK109MDtjb25zdCBvPWM7cy5hZGQociksYT1qdChyLG8sbnVsbCx0LHQuY2hlY2tLZXlzLHQuaWdub3JlVW5kZWZpbmVkKSxjKz00fWVsc2UgaWYoIm9iamVjdCI9PT1vKXtpZihyW3ldIT09cCl0aHJvdyBuZXcgRztjb25zdCBpPXJbZ2VdO2lmKCJPYmplY3RJZCI9PT1pKWM9RXQoZSxuLHIsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1pKWM9T3QoZSxuLHIsYyk7ZWxzZSBpZigiTG9uZyI9PT1pfHwiVGltZXN0YW1wIj09PWkpYz1OdChlLG4scixjKTtlbHNlIGlmKCJEb3VibGUiPT09aSljPVR0KGUsbixyLGMpO2Vsc2UgaWYoIkNvZGUiPT09aSl7Y29uc3QgaT1yO2lmKGkuc2NvcGUmJiJvYmplY3QiPT10eXBlb2YgaS5zY29wZSl7ZVtjKytdPUQsYys9ZmUuZW5jb2RlVVRGOEludG8oZSxuLGMpLGVbYysrXT0wO2NvbnN0IHI9YztjKz00O2NvbnN0IG89aS5jb2RlLF89ZmUuZW5jb2RlVVRGOEludG8oZSxvLGMrNCkrMTtwZS5zZXRJbnQzMkxFKGUsYyxfKSxlW2MrNCtfLTFdPTAsYz1jK18rNDtjb25zdCBsPWkuc2NvcGU7aWYocy5oYXMobCkpdGhyb3cgbmV3IFooIkNhbm5vdCBjb252ZXJ0IGNpcmN1bGFyIHN0cnVjdHVyZSB0byBCU09OIik7cy5hZGQobCksYT1qdChsLGMscix0LHQuY2hlY2tLZXlzLHQuaWdub3JlVW5kZWZpbmVkKSxjKz00fWVsc2V7ZVtjKytdPXosYys9ZmUuZW5jb2RlVVRGOEludG8oZSxuLGMpLGVbYysrXT0wO2NvbnN0IHQ9aS5jb2RlLnRvU3RyaW5nKCkscj1mZS5lbmNvZGVVVEY4SW50byhlLHQsYys0KSsxO3BlLnNldEludDMyTEUoZSxjLHIpLGM9Yys0K3ItMSxlW2MrK109MH19ZWxzZSBpZigiQmluYXJ5Ij09PWkpYz1MdChlLG4scixjKTtlbHNlIGlmKCJCU09OU3ltYm9sIj09PWkpYz1BdChlLG4scixjKTtlbHNlIGlmKCJEQlJlZiI9PT1pKXtjb25zdCBpPXIsbz1PYmplY3QuYXNzaWduKHskcmVmOmkuY29sbGVjdGlvbiwkaWQ6aS5vaWR9LG51bGwhPWkuZGI/eyRkYjppLmRifTpudWxsLGkuZmllbGRzKTtlW2MrK109TixjKz1mZS5lbmNvZGVVVEY4SW50byhlLG4sYyksZVtjKytdPTAscy5hZGQobyksYT1qdChvLGMsbnVsbCx0LCExLCEwKSxjKz00fWVsc2UgaWYoIkJTT05SZWdFeHAiPT09aSljPUJ0KGUsbixyLGMpO2Vsc2UgaWYoIkludDMyIj09PWkpYz12dChlLG4scixjKTtlbHNlIGlmKCJNaW5LZXkiPT09aXx8Ik1heEtleSI9PT1pKWM9VXQoZSxuLHIsYyk7ZWxzZSBpZih2b2lkIDAhPT1yLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhyLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT1vJiZpJiYoYz0kdChlLG4scixjKSl9cmV0dXJuIGN9Y29uc3QgRnQ9eyRvaWQ6bnQsJGJpbmFyeTp5ZSwkdXVpZDp5ZSwkc3ltYm9sOm90LCRudW1iZXJJbnQ6WmUsJG51bWJlckRlY2ltYWw6SGUsJG51bWJlckRvdWJsZTpLZSwkbnVtYmVyTG9uZzpSZSwkbWluS2V5OlhlLCRtYXhLZXk6R2UsJHJlZ2V4Oml0LCRyZWd1bGFyRXhwcmVzc2lvbjppdCwkdGltZXN0YW1wOmF0fTtmdW5jdGlvbiBrdChlLHQ9e30pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7Y29uc3Qgbj1lPD1tJiZlPj1TLHI9ZTw9eCYmZT49QjtpZih0LnJlbGF4ZWR8fHQubGVnYWN5KXJldHVybiBlO2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKG4pcmV0dXJuIG5ldyBaZShlKTtpZihyKXJldHVybiB0LnVzZUJpZ0ludDY0P0JpZ0ludChlKTpSZS5mcm9tTnVtYmVyKGUpfXJldHVybiBuZXcgS2UoZSl9aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiBlO2lmKGUuJHVuZGVmaW5lZClyZXR1cm4gbnVsbDtjb25zdCBuPU9iamVjdC5rZXlzKGUpLmZpbHRlcigodD0+dC5zdGFydHNXaXRoKCIkIikmJm51bGwhPWVbdF0pKTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7Y29uc3QgaT1GdFtuW3JdXTtpZihpKXJldHVybiBpLmZyb21FeHRlbmRlZEpTT04oZSx0KX1pZihudWxsIT1lLiRkYXRlKXtjb25zdCBuPWUuJGRhdGUscj1uZXcgRGF0ZTtpZih0LmxlZ2FjeSlpZigibnVtYmVyIj09dHlwZW9mIG4pci5zZXRUaW1lKG4pO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgWCgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNlIGlmKFJlLmlzTG9uZyhuKSlyLnNldFRpbWUobi50b051bWJlcigpKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdC5yZWxheGVkKXIuc2V0VGltZShuKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgWCgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfXJldHVybiByfWlmKG51bGwhPWUuJGNvZGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gZS4kc2NvcGUmJih0LiRzY29wZT1rdChlLiRzY29wZSkpLFVlLmZyb21FeHRlbmRlZEpTT04oZSl9aWYoRWUoZSl8fGUuJGRiUG9pbnRlcil7Y29uc3QgdD1lLiRyZWY/ZTplLiRkYlBvaW50ZXI7aWYodCBpbnN0YW5jZW9mIEllKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmtleXModCkuZmlsdGVyKChlPT5lLnN0YXJ0c1dpdGgoIiQiKSkpO2xldCByPSEwO2lmKG4uZm9yRWFjaCgoZT0+ey0xPT09WyIkcmVmIiwiJGlkIiwiJGRiIl0uaW5kZXhPZihlKSYmKHI9ITEpfSkpLHIpcmV0dXJuIEllLmZyb21FeHRlbmRlZEpTT04odCl9cmV0dXJuIGV9ZnVuY3Rpb24genQoZSl7Y29uc3QgdD1lLnRvSVNPU3RyaW5nKCk7cmV0dXJuIDAhPT1lLmdldFVUQ01pbGxpc2Vjb25kcygpP3Q6dC5zbGljZSgwLC01KSsiWiJ9ZnVuY3Rpb24gQ3QoZSx0KXtpZihlIGluc3RhbmNlb2YgTWFwfHxkKGUpKXtjb25zdCBuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGNvbnN0W3Qscl1vZiBlKXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooIkNhbiBvbmx5IHNlcmlhbGl6ZSBtYXBzIHdpdGggc3RyaW5nIGtleXMiKTtuW3RdPXJ9cmV0dXJuIEN0KG4sdCl9aWYoKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZudWxsIT09ZSl7Y29uc3Qgbj10LnNlZW5PYmplY3RzLmZpbmRJbmRleCgodD0+dC5vYmo9PT1lKSk7aWYoLTEhPT1uKXtjb25zdCBlPXQuc2Vlbk9iamVjdHMubWFwKChlPT5lLnByb3BlcnR5TmFtZSkpLHI9ZS5zbGljZSgwLG4pLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLGk9ZVtuXSxvPSIgLT4gIitlLnNsaWNlKG4rMSxlLmxlbmd0aC0xKS5tYXAoKGU9PmAke2V9IC0+IGApKS5qb2luKCIiKSxzPWVbZS5sZW5ndGgtMV0sYT0iICIucmVwZWF0KHIubGVuZ3RoK2kubGVuZ3RoLzIpLGM9Ii0iLnJlcGVhdChvLmxlbmd0aCsoaS5sZW5ndGgrcy5sZW5ndGgpLzItMSk7dGhyb3cgbmV3IFooYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEVKU09OOlxuICAgICR7cn0ke2l9JHtvfSR7c31cbiAgICAke2F9XFwke2N9L2ApfXQuc2Vlbk9iamVjdHNbdC5zZWVuT2JqZWN0cy5sZW5ndGgtMV0ub2JqPWV9aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoKChlLG4pPT57dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6YGluZGV4ICR7bn1gLG9iajpudWxsfSk7dHJ5e3JldHVybiBDdChlLHQpfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19KSl9KGUsdCk7aWYodm9pZCAwPT09ZSlyZXR1cm4gdC5pZ25vcmVVbmRlZmluZWQ/dm9pZCAwOm51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGV8fGIoZSkpe2NvbnN0IG49ZS5nZXRUaW1lKCkscj1uPi0xJiZuPDI1MzQwMjMwMDhlNTtyZXR1cm4gdC5sZWdhY3k/dC5yZWxheGVkJiZyP3skZGF0ZTplLmdldFRpbWUoKX06eyRkYXRlOnp0KGUpfTp0LnJlbGF4ZWQmJnI/eyRkYXRlOnp0KGUpfTp7JGRhdGU6eyRudW1iZXJMb25nOmUuZ2V0VGltZSgpLnRvU3RyaW5nKCl9fX1pZighKCJudW1iZXIiIT10eXBlb2YgZXx8dC5yZWxheGVkJiZpc0Zpbml0ZShlKSkpe2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKGU+PVMmJmU8PW0pcmV0dXJueyRudW1iZXJJbnQ6ZS50b1N0cmluZygpfTtpZihlPj1CJiZlPD14KXJldHVybnskbnVtYmVyTG9uZzplLnRvU3RyaW5nKCl9fXJldHVybnskbnVtYmVyRG91YmxlOk9iamVjdC5pcyhlLC0wKT8iLTAuMCI6ZS50b1N0cmluZygpfX1pZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuIHQucmVsYXhlZD9OdW1iZXIoQmlnSW50LmFzSW50Tig2NCxlKSk6eyRudW1iZXJMb25nOkJpZ0ludC5hc0ludE4oNjQsZSkudG9TdHJpbmcoKX07aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cHx8aChlKSl7bGV0IG49ZS5mbGFncztpZih2b2lkIDA9PT1uKXtjb25zdCB0PWUudG9TdHJpbmcoKS5tYXRjaCgvW2dpbXV5XSokLyk7dCYmKG49dFswXSl9cmV0dXJuIG5ldyBpdChlLnNvdXJjZSxuKS50b0V4dGVuZGVkSlNPTih0KX1yZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2Z1bmN0aW9uKGUsdCl7aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBaKCJub3QgYW4gb2JqZWN0IGluc3RhbmNlIik7Y29uc3Qgbj1lLl9ic29udHlwZTtpZih2b2lkIDA9PT1uKXtjb25zdCBuPXt9O2Zvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKGUpKXt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpyLG9iajpudWxsfSk7dHJ5e2NvbnN0IGk9Q3QoZVtyXSx0KTsiX19wcm90b19fIj09PXI/T2JqZWN0LmRlZmluZVByb3BlcnR5KG4scix7dmFsdWU6aSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOm5bcl09aX1maW5hbGx5e3Quc2Vlbk9iamVjdHMucG9wKCl9fXJldHVybiBufWlmKG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBlLl9ic29udHlwZSYmZVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9ic29udHlwZSJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlfShlKSl7bGV0IHI9ZTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygci50b0V4dGVuZGVkSlNPTil7Y29uc3QgdD1EdFtlLl9ic29udHlwZV07aWYoIXQpdGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogIitlLl9ic29udHlwZSk7cj10KHIpfXJldHVybiJDb2RlIj09PW4mJnIuc2NvcGU/cj1uZXcgVWUoci5jb2RlLEN0KHIuc2NvcGUsdCkpOiJEQlJlZiI9PT1uJiZyLm9pZCYmKHI9bmV3IEllKEN0KHIuY29sbGVjdGlvbix0KSxDdChyLm9pZCx0KSxDdChyLmRiLHQpLEN0KHIuZmllbGRzLHQpKSksci50b0V4dGVuZGVkSlNPTih0KX10aHJvdyBuZXcgWigiX2Jzb250eXBlIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCB3YXM6ICIrdHlwZW9mIG4pfShlLHQpOmV9Y29uc3QgRHQ9e0JpbmFyeTplPT5uZXcgeWUoZS52YWx1ZSgpLGUuc3ViX3R5cGUpLENvZGU6ZT0+bmV3IFVlKGUuY29kZSxlLnNjb3BlKSxEQlJlZjplPT5uZXcgSWUoZS5jb2xsZWN0aW9ufHxlLm5hbWVzcGFjZSxlLm9pZCxlLmRiLGUuZmllbGRzKSxEZWNpbWFsMTI4OmU9Pm5ldyBIZShlLmJ5dGVzKSxEb3VibGU6ZT0+bmV3IEtlKGUudmFsdWUpLEludDMyOmU9Pm5ldyBaZShlLnZhbHVlKSxMb25nOmU9PlJlLmZyb21CaXRzKG51bGwhPWUubG93P2UubG93OmUubG93XyxudWxsIT1lLmxvdz9lLmhpZ2g6ZS5oaWdoXyxudWxsIT1lLmxvdz9lLnVuc2lnbmVkOmUudW5zaWduZWRfKSxNYXhLZXk6KCk9Pm5ldyBHZSxNaW5LZXk6KCk9Pm5ldyBYZSxPYmplY3RJZDplPT5uZXcgbnQoZSksQlNPTlJlZ0V4cDplPT5uZXcgaXQoZS5wYXR0ZXJuLGUub3B0aW9ucyksQlNPTlN5bWJvbDplPT5uZXcgb3QoZS52YWx1ZSksVGltZXN0YW1wOmU9PmF0LmZyb21CaXRzKGUubG93LGUuaGlnaCl9O2Z1bmN0aW9uIFZ0KGUsdCl7Y29uc3Qgbj17dXNlQmlnSW50NjQ6dD8udXNlQmlnSW50NjQ/PyExLHJlbGF4ZWQ6dD8ucmVsYXhlZD8/ITAsbGVnYWN5OnQ/LmxlZ2FjeT8/ITF9O3JldHVybiBKU09OLnBhcnNlKGUsKChlLHQpPT57aWYoLTEhPT1lLmluZGV4T2YoIlwwIikpdGhyb3cgbmV3IFooYEJTT04gRG9jdW1lbnQgZmllbGQgbmFtZXMgY2Fubm90IGNvbnRhaW4gbnVsbCBieXRlcywgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIGt0KHQsbil9KSl9ZnVuY3Rpb24gTXQoZSx0LG4scil7bnVsbCE9biYmIm9iamVjdCI9PXR5cGVvZiBuJiYocj1uLG49dm9pZCAwKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDApO2NvbnN0IGk9Q3QoZSxPYmplY3QuYXNzaWduKHtyZWxheGVkOiEwLGxlZ2FjeTohMX0scix7c2Vlbk9iamVjdHM6W3twcm9wZXJ0eU5hbWU6Iihyb290KSIsb2JqOm51bGx9XX0pKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSx0LG4pfWNvbnN0IFB0PU9iamVjdC5jcmVhdGUobnVsbCk7UHQucGFyc2U9VnQsUHQuc3RyaW5naWZ5PU10LFB0LnNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LEpTT04ucGFyc2UoTXQoZSx0KSl9LFB0LmRlc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8e30sVnQoSlNPTi5zdHJpbmdpZnkoZSksdCl9LE9iamVjdC5mcmVlemUoUHQpO2NvbnN0IEp0PTEsV3Q9MixZdD0zLHF0PTQsSHQ9NSxLdD02LFp0PTcsR3Q9OCxYdD05LFF0PTEwLGVuPTExLHRuPTEyLG5uPTEzLHJuPTE0LG9uPTE1LHNuPTE2LGFuPTE3LGNuPTE4LF9uPTE5LGxuPTI1NSx1bj0xMjc7ZnVuY3Rpb24gZm4oZSx0KXt0cnl7cmV0dXJuIHBlLmdldE5vbm5lZ2F0aXZlSW50MzJMRShlLHQpfWNhdGNoKGUpe3Rocm93IG5ldyBRKCJCU09OIHNpemUgY2Fubm90IGJlIG5lZ2F0aXZlIix0LHtjYXVzZTplfSl9fWZ1bmN0aW9uIGduKGUsdCl7bGV0IG49dDtmb3IoOzAhPT1lW25dO24rKyk7aWYobj09PWUubGVuZ3RoLTEpdGhyb3cgbmV3IFEoIk51bGwgdGVybWluYXRvciBub3QgZm91bmQiLHQpO3JldHVybiBufWNvbnN0IGhuPU9iamVjdC5jcmVhdGUobnVsbCk7aG4ucGFyc2VUb0VsZW1lbnRzPWZ1bmN0aW9uKGUsdD0wKXtpZih0Pz89MCxlLmxlbmd0aDw1KXRocm93IG5ldyBRKGBJbnB1dCBtdXN0IGJlIGF0IGxlYXN0IDUgYnl0ZXMsIGdvdCAke2UubGVuZ3RofSBieXRlc2AsdCk7Y29uc3Qgbj1mbihlLHQpO2lmKG4+ZS5sZW5ndGgtdCl0aHJvdyBuZXcgUShgUGFyc2VkIGRvY3VtZW50U2l6ZSAoJHtufSBieXRlcykgZG9lcyBub3QgbWF0Y2ggaW5wdXQgbGVuZ3RoICgke2UubGVuZ3RofSBieXRlcylgLHQpO2lmKDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgUSgiQlNPTiBkb2N1bWVudHMgbXVzdCBlbmQgaW4gMHgwMCIsdCtuKTtjb25zdCByPVtdO2xldCBpPXQrNDtmb3IoO2k8PW4rdDspe2NvbnN0IG89ZVtpXTtpZihpKz0xLDA9PT1vKXtpZihpLXQhPT1uKXRocm93IG5ldyBRKCJJbnZhbGlkIDB4MDAgdHlwZSBieXRlIixpKTticmVha31jb25zdCBzPWksYT1nbihlLGkpLXM7bGV0IGM7aWYoaSs9YSsxLG89PT1KdHx8bz09PWNufHxvPT09WHR8fG89PT1hbiljPTg7ZWxzZSBpZihvPT09c24pYz00O2Vsc2UgaWYobz09PVp0KWM9MTI7ZWxzZSBpZihvPT09X24pYz0xNjtlbHNlIGlmKG89PT1HdCljPTE7ZWxzZSBpZihvPT09UXR8fG89PT1LdHx8bz09PXVufHxvPT09bG4pYz0wO2Vsc2UgaWYobz09PWVuKWM9Z24oZSxnbihlLGkpKzEpKzEtaTtlbHNlIGlmKG89PT1ZdHx8bz09PXF0fHxvPT09b24pYz1mbihlLGkpO2Vsc2V7aWYobyE9PVd0JiZvIT09SHQmJm8hPT10biYmbyE9PW5uJiZvIT09cm4pdGhyb3cgbmV3IFEoYEludmFsaWQgMHgke28udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKX0gdHlwZSBieXRlYCxpKTtjPWZuKGUsaSkrNCxvPT09SHQmJihjKz0xKSxvPT09dG4mJihjKz0xMil9aWYoYz5uKXRocm93IG5ldyBRKCJ2YWx1ZSByZXBvcnRzIGxlbmd0aCBsYXJnZXIgdGhhbiBkb2N1bWVudCIsaSk7ci5wdXNoKFtvLHMsYSxpLGNdKSxpKz1jfXJldHVybiByfSxobi5CeXRlVXRpbHM9ZmUsaG4uTnVtYmVyVXRpbHM9cGUsT2JqZWN0LmZyZWV6ZShobik7Y29uc3QgZG49MTc4MjU3OTI7bGV0IGJuPWZlLmFsbG9jYXRlKGRuKTt2YXIgd249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQlNPTkVycm9yOlosQlNPTk9mZnNldEVycm9yOlEsQlNPTlJlZ0V4cDppdCxCU09OUnVudGltZUVycm9yOlgsQlNPTlN5bWJvbDpvdCxCU09OVHlwZTpLLEJTT05WYWx1ZTpoZSxCU09OVmVyc2lvbkVycm9yOkcsQmluYXJ5OnllLEJ5dGVVdGlsczpmZSxDb2RlOlVlLERCUmVmOkllLERlY2ltYWwxMjg6SGUsRG91YmxlOktlLEVKU09OOlB0LEludDMyOlplLExvbmc6UmUsTWF4S2V5OkdlLE1pbktleTpYZSxOdW1iZXJVdGlsczpwZSxPYmplY3RJZDpudCxUaW1lc3RhbXA6YXQsVVVJRDpCZSxic29uVHlwZTpnZSxjYWxjdWxhdGVPYmplY3RTaXplOmZ1bmN0aW9uKGUsdD17fSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtjb25zdCByPVt7b2JqZWN0OmUsaWdub3JlVW5kZWZpbmVkOm4/PyExLGV4aXQ6ITF9XSxpPW5ldyBTZXQ7bGV0IG89MDtmb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBlPXIucG9wKCk7aWYoZS5leGl0KXtpLmRlbGV0ZShlLm9iamVjdCk7Y29udGludWV9Y29uc3R7b2JqZWN0Om4saWdub3JlVW5kZWZpbmVkOnN9PWU7aS5hZGQobiksZS5leGl0PSEwLHIucHVzaChlKSxvKz01O2NvbnN0IGE9QXJyYXkuaXNBcnJheShuKSxjPSFhJiYobiBpbnN0YW5jZW9mIE1hcHx8ZChuKSk7bGV0IF89bjtpZihhfHxjfHwiZnVuY3Rpb24iIT10eXBlb2Ygbj8udG9CU09OfHwoXz1uLnRvQlNPTigpKSxhKXtjb25zdCBlPV87Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspbys9cnQobi50b1N0cmluZygpLGVbbl0sdCwhMCxzLHIsaSl9ZWxzZSBpZihjKWZvcihjb25zdFtlLG5db2YgXylvKz1ydChlLG4sdCwhMSxzLHIsaSk7ZWxzZSBmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhfKSlvKz1ydChlLF9bZV0sdCwhMSxzLHIsaSl9cmV0dXJuIG99KGUsImJvb2xlYW4iPT10eXBlb2YodD10fHx7fSkuc2VyaWFsaXplRnVuY3Rpb25zJiZ0LnNlcmlhbGl6ZUZ1bmN0aW9ucywiYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQpfSxkZXNlcmlhbGl6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBsdChmZS50b0xvY2FsQnVmZmVyVHlwZShlKSx0KX0sZGVzZXJpYWxpemVTdHJlYW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe2NvbnN0IHM9T2JqZWN0LmFzc2lnbih7YWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemU6ITAsaW5kZXg6MH0sbyksYT1mZS50b0xvY2FsQnVmZmVyVHlwZShlKTtsZXQgYz10O2ZvcihsZXQgZT0wO2U8bjtlKyspe2NvbnN0IHQ9cGUuZ2V0SW50MzJMRShhLGMpO3MuaW5kZXg9YyxyW2krZV09bHQoYSxzKSxjKz10fXJldHVybiBjfSxvbkRlbWFuZDpobixzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtjb25zdCBuPSJib29sZWFuIj09dHlwZW9mIHQuY2hlY2tLZXlzJiZ0LmNoZWNrS2V5cyxyPSJib29sZWFuIj09dHlwZW9mIHQuc2VyaWFsaXplRnVuY3Rpb25zJiZ0LnNlcmlhbGl6ZUZ1bmN0aW9ucyxpPSJib29sZWFuIiE9dHlwZW9mIHQuaWdub3JlVW5kZWZpbmVkfHx0Lmlnbm9yZVVuZGVmaW5lZCxvPSJudW1iZXIiPT10eXBlb2YgdC5taW5JbnRlcm5hbEJ1ZmZlclNpemU/dC5taW5JbnRlcm5hbEJ1ZmZlclNpemU6ZG47Ym4ubGVuZ3RoPG8mJihibj1mZS5hbGxvY2F0ZShvKSk7Y29uc3Qgcz1SdChibixlLG4sMCxyLGksbnVsbCksYT1mZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQoYm4uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPVJ0KGJuLGUsciwwLGksbyxudWxsKTtyZXR1cm4gdC5zZXQoYm4uc3ViYXJyYXkoMCxhKSxzKSxzK2EtMX0sc2V0SW50ZXJuYWxCdWZmZXJTaXplOmZ1bmN0aW9uKGUpe2JuLmxlbmd0aDxlJiYoYm49ZmUuYWxsb2NhdGUoZSkpfX0pO2NsYXNzIHBue2NvbnN0cnVjdG9yKCl7fXN0YXRpYyB1cmxDb25zdHJ1Y3RGcm9tKGUpe2NvbnN0IHQ9Ii93cy9tb2RlbGluZy9jb21tYW5kcyIrZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBlIG9mIHIpdC5hcHBlbmQobixTdHJpbmcoZSkpO2Vsc2UgdC5hcHBlbmQobixTdHJpbmcocikpO2NvbnN0IG49dC50b1N0cmluZygpO3JldHVybiBuP2A/JHtufWA6IiJ9KHt2aWRlb19yZXNfd2lkdGg6ZS52aWRlb19yZXNfd2lkdGgsdmlkZW9fcmVzX2hlaWdodDplLnZpZGVvX3Jlc19oZWlnaHQsZnBzOmUuZnBzLHVubG9ja2VkX2ZyYW1lcmF0ZTplLnVubG9ja2VkX2ZyYW1lcmF0ZSxwb3N0X2VmZmVjdDplLnBvc3RfZWZmZWN0LHdlYnJ0YzplLndlYnJ0YyxnZW9tZXRyeV9vbmx5OmUuZ2VvbWV0cnlfb25seSxwb29sOmUucG9vbCxzaG93X2dyaWQ6ZS5zaG93X2dyaWQscmVwbGF5OmUucmVwbGF5LGFwaV9jYWxsX2lkOmUuYXBpX2NhbGxfaWQsb3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5OmUub3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5LGtjbF92ZXJzaW9uOmUua2NsX3ZlcnNpb24scHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gd24uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHduLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiB3bi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiB3bi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgeW57c3RhdGljIF9fd3JhcChlKXtlPj4+PTA7Y29uc3QgdD1PYmplY3QuY3JlYXRlKHluLnByb3RvdHlwZSk7cmV0dXJuIHQuX193YmdfcHRyPWUsQW4ucmVnaXN0ZXIodCx0Ll9fd2JnX3B0cix0KSx0fV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsQW4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuX193YmdfY29udGV4dF9mcmVlKGUsMCl9YWRkX2NvbnN0cmFpbnQoZSx0LG4scixpKXtjb25zdCBvPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxzPXVyLGE9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyO3JldHVybiBsci5jb250ZXh0X2FkZF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLG8scyxhLGMsXyxsLHUsZixpKX1hZGRfZmlsZShlLHQpe2NvbnN0IG49aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9dXI7cmV0dXJuIGxyLmNvbnRleHRfYWRkX2ZpbGUodGhpcy5fX3diZ19wdHIsZSxuLHIpfWFkZF9zZWdtZW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cjt2YXIgZj10cihyKT8wOmlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyO2NvbnN0IGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfYWRkX3NlZ21lbnQodGhpcy5fX3diZ19wdHIscyxhLGMsXyxsLHUsZixnLGgsZCxvKX1idXN0Q2FjaGVBbmRSZXNldFNjZW5lKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cjt2YXIgaT10cih0KT8wOmlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5jb250ZXh0X2J1c3RDYWNoZUFuZFJlc2V0U2NlbmUodGhpcy5fX3diZ19wdHIsbixyLGksbyl9Y2hhaW5fc2VnbWVudChlLHQsbixyLGksbyxzKXtjb25zdCBhPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9dXIsdT1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj11cixnPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxoPXVyO3ZhciBkPXRyKGkpPzA6aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9dXI7Y29uc3Qgdz1pcihvLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscD11cjtyZXR1cm4gbHIuY29udGV4dF9jaGFpbl9zZWdtZW50KHRoaXMuX193YmdfcHRyLGEsYyxfLGwsdSxmLGcsaCxkLGIsdyxwLHMpfWNsZWFyX3NrZXRjaF9jaGVja3BvaW50cygpe3JldHVybiBsci5jb250ZXh0X2NsZWFyX3NrZXRjaF9jaGVja3BvaW50cyh0aGlzLl9fd2JnX3B0cil9Y2xvbmVXaXRoRXhlY3V0ZUNhbGxiYWNrcyhlKXtjb25zdCB0PWxyLmNvbnRleHRfY2xvbmVXaXRoRXhlY3V0ZUNhbGxiYWNrcyh0aGlzLl9fd2JnX3B0cixlKTtyZXR1cm4geW4uX193cmFwKHQpfWRlbGV0ZV9vYmplY3RzKGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfZGVsZXRlX29iamVjdHModGhpcy5fX3diZ19wdHIscyxhLGMsXyxsLHUsZixnLGgsZCxvKX1kZWxldGVfc2tldGNoKGUsdCxuKXtjb25zdCByPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxpPXVyLG89aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9dXIsYT1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cjtyZXR1cm4gbHIuY29udGV4dF9kZWxldGVfc2tldGNoKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1lZGl0X2FuZ2xlX2NvbnN0cmFpbnQoZSx0LG4scixpLG8scyl7Y29uc3QgYT1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cixfPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxsPXVyLHU9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9dXIsZz1pcihyLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD11cixkPWlyKGksbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxiPXVyO3JldHVybiBsci5jb250ZXh0X2VkaXRfYW5nbGVfY29uc3RyYWludCh0aGlzLl9fd2JnX3B0cixhLGMsXyxsLHUsZixnLGgsZCxiLG8scyl9ZWRpdF9jb25zdHJhaW50X3ZhbHVlKGUsdCxuLHIsaSxvKXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXI7cmV0dXJuIGxyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50X3ZhbHVlKHRoaXMuX193YmdfcHRyLHMsYSxjLF8sbCx1LGYsZyxoLGQsbyl9ZWRpdF9kaXN0YW5jZV9jb25zdHJhaW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyLGc9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9dXIsZD1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj11cjtyZXR1cm4gbHIuY29udGV4dF9lZGl0X2Rpc3RhbmNlX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsYSxjLF8sbCx1LGYsZyxoLGQsYixvLHMpfWVkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbihlLHQsbixyLGksbyxzLGEpe2NvbnN0IGM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT11cixmPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxnPXVyLGg9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGQ9dXIsYj1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksdz11cixwPWlyKHMsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSx5PXVyO3JldHVybiBsci5jb250ZXh0X2VkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbih0aGlzLl9fd2JnX3B0cixjLF8sbCx1LGYsZyxoLGQsYix3LG8scCx5LGEpfWVkaXRfc2VnbWVudHMoZSx0LG4scixpLG8scyxhLGMpe2NvbnN0IF89aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9dXIsdT1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj11cixnPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxoPXVyLGQ9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9dXIsdz1pcihvLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscD11cix5PWlyKHMsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxtPXVyLFM9aXIoYyxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHg9dXI7cmV0dXJuIGxyLmNvbnRleHRfZWRpdF9zZWdtZW50cyh0aGlzLl9fd2JnX3B0cixfLGwsdSxmLGcsaCxkLGIsaSx3LHAseSxtLGEsUyx4KX1lZGl0X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9dXIsYT1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz11cixfPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxsPXVyLHU9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9dXIsZz1pcihpLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD11cjtyZXR1cm4gbHIuY29udGV4dF9lZGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLF8sbCx1LGYsZyxoKX1ldmFsdWF0ZUV4cHJlc3Npb24oZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyLGk9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7cmV0dXJuIGxyLmNvbnRleHRfZXZhbHVhdGVFeHByZXNzaW9uKHRoaXMuX193YmdfcHRyLG4scixpLG8pfWV4ZWN1dGUoZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7dmFyIG89dHIodCk/MDppcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cjtjb25zdCBhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X2V4ZWN1dGUodGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfWV4ZWN1dGVNb2NrKGUsdCxuLHIpe2NvbnN0IGk9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7dmFyIHM9dHIodCk/MDppcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT11cjtjb25zdCBjPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxfPXVyO3JldHVybiBsci5jb250ZXh0X2V4ZWN1dGVNb2NrKHRoaXMuX193YmdfcHRyLGksbyxzLGEsYyxfLHIpfWV4ZWN1dGVfdHJpbShlLHQsbixyKXtjb25zdCBpPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1ycihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jKSxfPXVyLGw9aXIocixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9dXI7cmV0dXJuIGxyLmNvbnRleHRfZXhlY3V0ZV90cmltKHRoaXMuX193YmdfcHRyLGksbyxzLGEsYyxfLGwsdSl9ZXhpdF9za2V0Y2goZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X2V4aXRfc2tldGNoKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1leHBvcnQoZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyLGk9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89dXI7cmV0dXJuIGxyLmNvbnRleHRfZXhwb3J0KHRoaXMuX193YmdfcHRyLG4scixpLG8pfWdldF9maWxlKGUsdCl7cmV0dXJuIGxyLmNvbnRleHRfZ2V0X2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX1nZXRfcHJvamVjdChlKXtyZXR1cm4gbHIuY29udGV4dF9nZXRfcHJvamVjdCh0aGlzLl9fd2JnX3B0cixlKX1oYWNrX3NldF9wcm9ncmFtKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cixpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5jb250ZXh0X2hhY2tfc2V0X3Byb2dyYW0odGhpcy5fX3diZ19wdHIsbixyLGksbyl9Y29uc3RydWN0b3IoZSx0LG4scil7Y29uc3QgaT1sci5jb250ZXh0X25ldyhlLHQsdHIobik/MDpWbihuKSx0cihyKT8xNjc3NzIxNTpyPzE6MCk7aWYoaVsyXSl0aHJvdyBvcihpWzFdKTtyZXR1cm4gdGhpcy5fX3diZ19wdHI9aVswXT4+PjAsQW4ucmVnaXN0ZXIodGhpcyx0aGlzLl9fd2JnX3B0cix0aGlzKSx0aGlzfW5ld19za2V0Y2goZSx0LG4scixpKXtjb25zdCBvPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxzPXVyLGE9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9dXIsXz1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD11cix1PWlyKHIsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxmPXVyLGc9aXIoaSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9dXI7cmV0dXJuIGxyLmNvbnRleHRfbmV3X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLF8sbCx1LGYsZyxoKX1vcGVuX3Byb2plY3QoZSx0LG4pe2NvbnN0IHI9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7cmV0dXJuIGxyLmNvbnRleHRfb3Blbl9wcm9qZWN0KHRoaXMuX193YmdfcHRyLGUscixpLG4pfXJlZnJlc2goZSl7cmV0dXJuIGxyLmNvbnRleHRfcmVmcmVzaCh0aGlzLl9fd2JnX3B0cixlKX1yZW1vdmVfZmlsZShlLHQpe3JldHVybiBsci5jb250ZXh0X3JlbW92ZV9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9cmVzdG9yZV9za2V0Y2hfY2hlY2twb2ludChlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyO3JldHVybiBsci5jb250ZXh0X3Jlc3RvcmVfc2tldGNoX2NoZWNrcG9pbnQodGhpcy5fX3diZ19wdHIsdCxuKX1zZW5kUmVzcG9uc2UoZSl7cmV0dXJuIGxyLmNvbnRleHRfc2VuZFJlc3BvbnNlKHRoaXMuX193YmdfcHRyLGUpfXNrZXRjaF9leGVjdXRlX21vY2soZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyO3JldHVybiBsci5jb250ZXh0X3NrZXRjaF9leGVjdXRlX21vY2sodGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfXN3aXRjaF9maWxlKGUsdCl7cmV0dXJuIGxyLmNvbnRleHRfc3dpdGNoX2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX11cGRhdGVfZmlsZShlLHQsbil7Y29uc3Qgcj1pcihuLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT11cjtyZXR1cm4gbHIuY29udGV4dF91cGRhdGVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQscixpKX19U3ltYm9sLmRpc3Bvc2UmJih5bi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPXluLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBtbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGUsMCl9Z2V0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSgpe3JldHVybiBsci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfYXV0b0FsbG9jYXRlQ2h1bmtTaXplKHRoaXMuX193YmdfcHRyKT4+PjB9Y2FuY2VsKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gbHIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9c3RhcnQoZSl7bHIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3N0YXJ0KHRoaXMuX193YmdfcHRyLGUpfWdldCB0eXBlKCl7Y29uc3QgZT1sci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIExuW2VdfX1TeW1ib2wuZGlzcG9zZSYmKG1uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09bW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIFNue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsUm4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZSwwKX1hYm9ydChlKXtjb25zdCB0PXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc2lua19hYm9ydCh0LGUpfWNsb3NlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiBsci5pbnRvdW5kZXJseWluZ3NpbmtfY2xvc2UoZSl9d3JpdGUoZSl7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc2lua193cml0ZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihTbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVNuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyB4bntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEZuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO2xyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZSwwKX1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7bHIuaW50b3VuZGVybHlpbmdzb3VyY2VfY2FuY2VsKGUpfXB1bGwoZSl7cmV0dXJuIGxyLmludG91bmRlcmx5aW5nc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9fVN5bWJvbC5kaXNwb3NlJiYoeG4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT14bi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQm57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxrbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlLDApfWNvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCByPWxyLmxzcHNlcnZlcmNvbmZpZ19uZXcoZSx0LG4pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yPj4+MCxrbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9fVN5bWJvbC5kaXNwb3NlJiYoQm4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Cbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgVW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCx6bi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlLDApfWNvbnN0cnVjdG9yKCl7Y29uc3QgZT1sci5yZXNwb25zZWNvbnRleHRfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPWU+Pj4wLHpuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZW5kX3Jlc3BvbnNlKGUpe3JldHVybiBsci5yZXNwb25zZWNvbnRleHRfc2VuZF9yZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihVbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBFbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoRW4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxDbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxDbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlLDApfWdldCBhcmNfbGVuZ3RoKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX2xlbmd0aCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeCgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeSgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IGNjdygpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2Njdyh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl94KCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiBsci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgZW5kX2FuZ2xlKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZW5kX2FuZ2xlKHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIGxyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyKX1nZXQgc3RhcnRfYW5nbGUoKXtyZXR1cm4gbHIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cil9c2V0IGFyY19sZW5ndGgoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyLGUpfXNldCBhcmNfbWlkX3BvaW50X3goZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbWlkX3BvaW50X3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeShlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2N3KGUpe2xyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeChlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyLGUpfXNldCBlbmRfYW5nbGUoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXtsci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX1zZXQgc3RhcnRfYW5nbGUoZSl7bHIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihFbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBJbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoSW4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxEbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtsci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZSwwKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gbHIuX193YmdfZ2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiBsci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IHJhZGl1cygpe3JldHVybiBsci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIpfXNldCBjZW50ZXJfeChlKXtsci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2VudGVyX3koZSl7bHIuX193Ymdfc2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXtsci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIsZSl9fWZ1bmN0aW9uIE9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5wYXJzZV93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBvcihyWzFdKTtyZXR1cm4gb3IoclswXSl9ZnVuY3Rpb24gTm4oKXtjb25zdCBlPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl81NTUzODQ4M2RlNmUzYWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEVycm9yKEduKGUsdCkpfSxfX3diZ19fX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0X2ZlMmEyNGZkZmRiNDA2NGY6ZnVuY3Rpb24oZSl7Y29uc3QgdD0iYm9vbGVhbiI9PXR5cGVvZiBlP2U6dm9pZCAwO3JldHVybiB0cih0KT8xNjc3NzIxNTp0PzE6MH0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfZDg5NjI3MjAyZDAxNTViNzpmdW5jdGlvbihlLHQpe2NvbnN0IG49aXIoSm4odCksbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyO0huKCkuc2V0SW50MzIoZSs0LHIsITApLEhuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJhOTU0MDY0MjNlYTg2MjY6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF84ZDkwNTI0YzllMGFmMTgzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZX0sX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNTlhMDAyZTc2YjA1OTMxMjpmdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF84N2EzYTgzN2YzMzFmZWY1OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSxfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfZjExNjEzOTA0MTRmOWI1OTpmdW5jdGlvbihlLHQpe2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiB0P3Q6dm9pZCAwO3ZhciByPXRyKG4pPzA6aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXI7SG4oKS5zZXRJbnQzMihlKzQsaSwhMCksSG4oKS5zZXRJbnQzMihlKzAsciwhMCl9LF9fd2JnX19fd2JpbmRnZW5fdGhyb3dfNTU0OTQ5MmRhZWRhZDEzOTpmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBFcnJvcihHbihlLHQpKX0sX193YmdfX3diZ19jYl91bnJlZl9mYmU2OWJiMDc2YzE2YmFkOmZ1bmN0aW9uKGUpe2UuX3diZ19jYl91bnJlZigpfSxfX3diZ19idWZmZXJfMGE1Nzc4OGNkZmNlMjFiYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LF9fd2JnX2J5b2JSZXF1ZXN0X2FiMGU1N2Y1NWJmNzc0ZjI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJ5b2JSZXF1ZXN0O3JldHVybiB0cih0KT8wOlZuKHQpfSxfX3diZ19ieXRlTGVuZ3RoXzk5MzFkYjAwZTU4NjFiZjk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZUxlbmd0aH0sX193YmdfYnl0ZU9mZnNldF8wYTk4NWE5OGY4ZmZiOGQ3OmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ5dGVPZmZzZXR9LF9fd2JnX2NhbGxfOGY1ZDdiYjA3MDI4MzUwODpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmNhbGwodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzYyZjZhNGVhZGM5NDU2NWY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzg3MWU1MTZhMjczZDE1Zjg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0sX193YmdfY2xvc2VfZjI4NzA1ODcxNjA4OGE1MDpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfZG9uZV8xOWY5MmNiMWY4NzM4YWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmV9LF9fd2JnX2VucXVldWVfZWUwNTkzY2VhOWJlOTNiZDpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0KXtlLmVucXVldWUodCl9KSxhcmd1bWVudHMpfSxfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7bj1lLHI9dCxjb25zb2xlLmVycm9yKEduKGUsdCkpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LF9fd2JnX2Vycm9yX2RlNmI4NmU1OTg1MDUyNDY6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sX193YmdfZXhpc3RzX2ZlMjI4YmQ1MDE0NmFjMTY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmV4aXN0cyhHbih0LG4pKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtXzQ0NTNmYTFiMDg0ZTdiZjU6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgXyxsLHUsZixnLGgsZCxiO3RyeXtfPXQsbD1uLHU9cixmPWksZz1vLGg9cyxkPWEsYj1jLGUuZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKEduKHQsbiksR24ocixpKSxHbihvLHMpLEduKGEsYykpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKF8sbCwxKSxsci5fX3diaW5kZ2VuX2ZyZWUodSxmLDEpLGxyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksbHIuX193YmluZGdlbl9mcmVlKGQsYiwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRBbGxGaWxlc182NWRhZjE3ODAxZGMxNjNlOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5nZXRBbGxGaWxlcyhHbih0LG4pKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzNmNDRiNzAwMzk1MDYyZTU6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFluKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzY5NmIzZDhkN2EwYmIzZjk6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKFluKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0V3JpdGVyXzdjOTUzMTQ5YWYyNzNjMjk6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFdyaXRlcigpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0X2ZmNWYxZmIyMjAyMzM0Nzc6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0KGUsdCl9KSxhcmd1bWVudHMpfSxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfY2UyNGQ1OGE1ZjRiZGNjMzpmdW5jdGlvbihlKXtsZXQgdDt0cnl7dD1lIGluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dpbmRvd18yZmE4ZDljMmQ1YjYxMDRhOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXaW5kb3d9Y2F0Y2goZSl7dD0hMX1yZXR1cm4gdH0sX193YmdfaW5zdGFuY2VvZl9Xb3JrZXJHbG9iYWxTY29wZV9hNDMwN2M4NWY3M2Q4M2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19sZW5ndGhfZTZlMTYzM2ZiZWE2Y2ZhOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGh9LF9fd2JnX2xvZ182YTc1YjcxZDYzMTZlOTM1OmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxfX3diZ19uZXdfMWQ5NjY3OGFhYWNjYTMyZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LF9fd2JnX25ld18yMjdkN2MwNTQxNGViODYxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcn0sX193YmdfbmV3XzRhODQzZmUyZWU0MDgyYTk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IEVycm9yKEduKGUsdCkpfSxfX3diZ19uZXdfZnJvbV9zbGljZV8wYmM1OGUzNmY4MmExYjUwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFluKGUsdCkpfSxfX3diZ19uZXdfdHlwZWRfMjVkZGEyMzg4ZDdlNWU5ZjpmdW5jdGlvbihlLHQpe3RyeXt2YXIgbj17YTplLGI6dH07Y29uc3Qgcj1uZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPW4uYTtuLmE9MDt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe2xyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX2pzX3N5c183MGEzNTE1MDU0YzQzYTM3X19fRnVuY3Rpb25fZm5fd2FzbV9iaW5kZ2VuX2U3YTFmZWQzNTM4Yjg2NGJfX19Kc1ZhbHVlX19fX193YXNtX2JpbmRnZW5fZTdhMWZlZDM1MzhiODY0Yl9fX3N5c19fVW5kZWZpbmVkX19fanNfc3lzXzcwYTM1MTUwNTRjNDNhMzdfX19GdW5jdGlvbl9mbl93YXNtX2JpbmRnZW5fZTdhMWZlZDM1MzhiODY0Yl9fX0pzVmFsdWVfX19fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fc3lzX19VbmRlZmluZWRfX19fX19fdHJ1ZV8oZSx0LG4scil9KHIsbi5iLGUsdCl9ZmluYWxseXtuLmE9cn19KSk7cmV0dXJuIHJ9ZmluYWxseXtuLmE9MH19LF9fd2JnX25ld193aXRoX2J5dGVfb2Zmc2V0X2FuZF9sZW5ndGhfYWIxZTEwMDJkN2E2OTRlNDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUsdD4+PjAsbj4+PjApfSxfX3diZ19uZXh0XzFiN2I1YzAwNzk2NjU2MGY6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHQoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX25vd19hOWFmNDU1NGVkYjdhYzc4OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19ub3dfZTdjNjc5NWE3ZjgxZTEwZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub3coKX0sX193Ymdfb25PcGVyYXRpb25fZTAxMzExNWE0M2UxZTJhNDpmdW5jdGlvbihlLHQpe2Uub25PcGVyYXRpb24odCl9LF9fd2JnX3BhcnNlX2U1NzAzZmQ1MjIxMWU2ODg6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04ucGFyc2UoR24oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19wZXJmb3JtYW5jZV8zZmNmNmUzMmE3ZTFlZDBhOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBlcmZvcm1hbmNlfSxfX3diZ19wcm90b3R5cGVzZXRjYWxsXzM4NzVkNTRkMTJlZjJlZWM6ZnVuY3Rpb24oZSx0LG4pe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFluKGUsdCksbil9LF9fd2JnX3F1ZXVlTWljcm90YXNrXzg4NjgzNjUxMTRmZTIzYjU6ZnVuY3Rpb24oZSl7cXVldWVNaWNyb3Rhc2soZSl9LF9fd2JnX3F1ZXVlTWljcm90YXNrX2NmYzVhMGU2MmY5ZWJkYmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucXVldWVNaWNyb3Rhc2t9LF9fd2JnX3JlYWRGaWxlXzlmYWE2YjU0ODZlYzc5ZmM6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLnJlYWRGaWxlKEduKHQsbikpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19yZWFkeV81ODU2ZGI2ZjAwZTNlMjBhOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlYWR5fSxfX3diZ19yZWxlYXNlTG9ja185NWJiYzdjZjdiODc5NzdkOmZ1bmN0aW9uKGUpe2UucmVsZWFzZUxvY2soKX0sX193YmdfcmVzb2x2ZV9kODA1OWJjMTEzZTIxNWJmOmZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9LF9fd2JnX3Jlc3BvbmRfMWVjMjkzOTVlZGJlN2ZjZTpmdW5jdGlvbigpe3JldHVybiBlcigoZnVuY3Rpb24oZSx0KXtlLnJlc3BvbmQodD4+PjApfSksYXJndW1lbnRzKX0sX193Ymdfc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtX2FjZmZiNThiN2Y3NGQ2NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgXyxsLHUsZixnLGgsZCxiO3RyeXtfPXQsbD1uLHU9cixmPWksZz1vLGg9cyxkPWEsYj1jO3JldHVybiBlLnNlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbShHbih0LG4pLEduKHIsaSksR24obyxzKSxHbihhLGMpKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShfLGwsMSksbHIuX193YmluZGdlbl9mcmVlKHUsZiwxKSxsci5fX3diaW5kZ2VuX2ZyZWUoZyxoLDEpLGxyLl9fd2JpbmRnZW5fZnJlZShkLGIsMSl9fSksYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF80NjZkNTBmMzUxMjI0NWNiOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuc2V0VGltZW91dCh0LG4pfSksYXJndW1lbnRzKX0sX193Ymdfc2V0VGltZW91dF9jMWM5YTE4YjYzNDNlYmQzOmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuc2V0VGltZW91dCh0LG4pfSksYXJndW1lbnRzKX0sX193Ymdfc2V0XzI5NWJhZDNiNWVhZDRlOTk6ZnVuY3Rpb24oZSx0LG4pe2Uuc2V0KFluKHQsbikpfSxfX3diZ19zdGFja18zYjBkOTc0YmJmMzFlNDRmOmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1pcih0LnN0YWNrLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cjtIbigpLnNldEludDMyKGUrNCxyLCEwKSxIbigpLnNldEludDMyKGUrMCxuLCEwKX0sX193Ymdfc3RhcnROZXdTZXNzaW9uXzc3OWY1Njk0MjAyMWFhM2Y6ZnVuY3Rpb24oKXtyZXR1cm4gZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXJ0TmV3U2Vzc2lvbigpfSksYXJndW1lbnRzKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF84ZGZiN2Y1ZTI2ZWJlNTIzOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbD9udWxsOmdsb2JhbDtyZXR1cm4gdHIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTXzk0MTE1NGVmYzgzOTVjZGQ6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9udWxsOmdsb2JhbFRoaXM7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9TRUxGXzU4ZGFjOWFmODIyZjU2MWY6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj9udWxsOnNlbGY7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9XSU5ET1dfZWU2NGYwYjNkODM1NGMwYjpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3c/bnVsbDp3aW5kb3c7cmV0dXJuIHRyKGUpPzA6Vm4oZSl9LF9fd2JnX3N0cmluZ2lmeV9iNjdlMmM4YzYwYjkzZjY5OmZ1bmN0aW9uKCl7cmV0dXJuIGVyKChmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9KSxhcmd1bWVudHMpfSxfX3diZ190aGVuXzAxNTAzNTJlNGFkMjAzNDQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnRoZW4odCxuKX0sX193YmdfdGhlbl81MTYwNDg2YzY3ZGRiOThhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudGhlbih0KX0sX193YmdfdG9TdHJpbmdfNTUzYjVmNmU5NWUzZTQxYjpmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSxfX3diZ190b1N0cmluZ185ZTczNTNhNzdjYjQxNWEyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9LF9fd2JnX3ZhbHVlX2Q1YjI0OGNlODQxOWJkMWI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWV9LF9fd2JnX3ZpZXdfMzhhOTMwODQ0Yzk2NDEwMzpmdW5jdGlvbihlKXtjb25zdCB0PWUudmlldztyZXR1cm4gdHIodCk/MDpWbih0KX0sX193Ymdfd2Fybl84NmVmMDNkYjhjZmI0ZGQ0OmZ1bmN0aW9uKGUpe2NvbnNvbGUud2FybihlKX0sX193Ymdfd3JpdGVfZmYzYTNkZTQ5MDJhYThiZjpmdW5jdGlvbihlLHQpe3JldHVybiBlLndyaXRlKHQpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMTpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsVG4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMjpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsJG4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMzpmdW5jdGlvbihlLHQpe3JldHVybiBucihlLHQsdm4pfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNDpmdW5jdGlvbihlLHQpe3JldHVybiBHbihlLHQpfSxfX3diaW5kZ2VuX2luaXRfZXh0ZXJucmVmX3RhYmxlOmZ1bmN0aW9uKCl7Y29uc3QgZT1sci5fX3diaW5kZ2VuX2V4dGVybnJlZnMsdD1lLmdyb3coNCk7ZS5zZXQoMCx2b2lkIDApLGUuc2V0KHQrMCx2b2lkIDApLGUuc2V0KHQrMSxudWxsKSxlLnNldCh0KzIsITApLGUuc2V0KHQrMywhMSl9fTtyZXR1cm57X19wcm90b19fOm51bGwsIi4va2NsX3dhc21fbGliX2JnLmpzIjplfX1mdW5jdGlvbiB2bihlLHQpe2xyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX19fX190cnVlXyhlLHQpfWZ1bmN0aW9uIFRuKGUsdCxuKXtjb25zdCByPWxyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fSnNWYWx1ZV9fY29yZV9lZDcxOGMzZDYwZWJkNTQ2X19fcmVzdWx0X19SZXN1bHRfX19fX3dhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fSnNFcnJvcl9fX3RydWVfKGUsdCxuKTtpZihyWzFdKXRocm93IG9yKHJbMF0pfWZ1bmN0aW9uICRuKGUsdCxuKXtjb25zdCByPWxyLndhc21fYmluZGdlbl9lN2ExZmVkMzUzOGI4NjRiX19fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9fX2pzX3N5c183MGEzNTE1MDU0YzQzYTM3X19fSXRlcmF0b3JOZXh0X19jb3JlX2VkNzE4YzNkNjBlYmQ1NDZfX19yZXN1bHRfX1Jlc3VsdF9fX19fd2FzbV9iaW5kZ2VuX2U3YTFmZWQzNTM4Yjg2NGJfX19Kc0Vycm9yX19fdHJ1ZV8oZSx0LG4pO2lmKHJbMV0pdGhyb3cgb3IoclswXSl9U3ltYm9sLmRpc3Bvc2UmJihJbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUluLnByb3RvdHlwZS5mcmVlKTtjb25zdCBMbj1bImJ5dGVzIl0sQW49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX2NvbnRleHRfZnJlZShlPj4+MCwxKSkpLGpuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfZnJlZShlPj4+MCwxKSkpLFJuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ3NpbmtfZnJlZShlPj4+MCwxKSkpLEZuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diZ19pbnRvdW5kZXJseWluZ3NvdXJjZV9mcmVlKGU+Pj4wLDEpKSksa249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX2xzcHNlcnZlcmNvbmZpZ19mcmVlKGU+Pj4wLDEpKSksem49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3Jlc3BvbnNlY29udGV4dF9mcmVlKGU+Pj4wLDEpKSksQ249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9mcmVlKGU+Pj4wLDEpKSksRG49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PmxyLl9fd2JnX3dhc21jaXJjbGVwYXJhbXNfZnJlZShlPj4+MCwxKSkpO2Z1bmN0aW9uIFZuKGUpe2NvbnN0IHQ9bHIuX19leHRlcm5yZWZfdGFibGVfYWxsb2MoKTtyZXR1cm4gbHIuX193YmluZGdlbl9leHRlcm5yZWZzLnNldCh0LGUpLHR9ZnVuY3Rpb24gTW4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGluc3RhbmNlIG9mICR7dC5uYW1lfWApfWNvbnN0IFBuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT5sci5fX3diaW5kZ2VuX2Rlc3Ryb3lfY2xvc3VyZShlLmEsZS5iKSkpO2Z1bmN0aW9uIEpuKGUpe2NvbnN0IHQ9dHlwZW9mIGU7aWYoIm51bWJlciI9PXR8fCJib29sZWFuIj09dHx8bnVsbD09ZSlyZXR1cm5gJHtlfWA7aWYoInN0cmluZyI9PXQpcmV0dXJuYCIke2V9ImA7aWYoInN5bWJvbCI9PXQpe2NvbnN0IHQ9ZS5kZXNjcmlwdGlvbjtyZXR1cm4gbnVsbD09dD8iU3ltYm9sIjpgU3ltYm9sKCR7dH0pYH1pZigiZnVuY3Rpb24iPT10KXtjb25zdCB0PWUubmFtZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQubGVuZ3RoPjA/YEZ1bmN0aW9uKCR7dH0pYDoiRnVuY3Rpb24ifWlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IHQ9ZS5sZW5ndGg7bGV0IG49IlsiO3Q+MCYmKG4rPUpuKGVbMF0pKTtmb3IobGV0IHI9MTtyPHQ7cisrKW4rPSIsICIrSm4oZVtyXSk7cmV0dXJuIG4rPSJdIixufWNvbnN0IG49L1xbb2JqZWN0IChbXlxdXSspXF0vLmV4ZWModG9TdHJpbmcuY2FsbChlKSk7bGV0IHI7aWYoIShuJiZuLmxlbmd0aD4xKSlyZXR1cm4gdG9TdHJpbmcuY2FsbChlKTtpZihyPW5bMV0sIk9iamVjdCI9PXIpdHJ5e3JldHVybiJPYmplY3QoIitKU09OLnN0cmluZ2lmeShlKSsiKSJ9Y2F0Y2goZSl7cmV0dXJuIk9iamVjdCJ9cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj9gJHtlLm5hbWV9OiAke2UubWVzc2FnZX1cbiR7ZS5zdGFja31gOnJ9ZnVuY3Rpb24gV24oZSx0KXtlPj4+PTA7Y29uc3Qgbj1IbigpLHI9W107Zm9yKGxldCBpPWU7aTxlKzQqdDtpKz00KXIucHVzaChsci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuZ2V0KG4uZ2V0VWludDMyKGksITApKSk7cmV0dXJuIGxyLl9fZXh0ZXJucmVmX2Ryb3Bfc2xpY2UoZSx0KSxyfWZ1bmN0aW9uIFluKGUsdCl7cmV0dXJuIGU+Pj49MCxRbigpLnN1YmFycmF5KGUvMSxlLzErdCl9bGV0IHFuPW51bGw7ZnVuY3Rpb24gSG4oKXtyZXR1cm4obnVsbD09PXFufHwhMD09PXFuLmJ1ZmZlci5kZXRhY2hlZHx8dm9pZCAwPT09cW4uYnVmZmVyLmRldGFjaGVkJiZxbi5idWZmZXIhPT1sci5tZW1vcnkuYnVmZmVyKSYmKHFuPW5ldyBEYXRhVmlldyhsci5tZW1vcnkuYnVmZmVyKSkscW59bGV0IEtuPW51bGw7ZnVuY3Rpb24gWm4oKXtyZXR1cm4gbnVsbCE9PUtuJiYwIT09S24uYnl0ZUxlbmd0aHx8KEtuPW5ldyBGbG9hdDY0QXJyYXkobHIubWVtb3J5LmJ1ZmZlcikpLEtufWZ1bmN0aW9uIEduKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Y3IrPXQsY3I+PWFyJiYoc3I9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pLHNyLmRlY29kZSgpLGNyPXQpO3JldHVybiBzci5kZWNvZGUoUW4oKS5zdWJhcnJheShlLGUrdCkpfShlPj4+PTAsdCl9bGV0IFhuPW51bGw7ZnVuY3Rpb24gUW4oKXtyZXR1cm4gbnVsbCE9PVhuJiYwIT09WG4uYnl0ZUxlbmd0aHx8KFhuPW5ldyBVaW50OEFycmF5KGxyLm1lbW9yeS5idWZmZXIpKSxYbn1mdW5jdGlvbiBlcihlLHQpe3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLHQpfWNhdGNoKGUpe2NvbnN0IHQ9Vm4oZSk7bHIuX193YmluZGdlbl9leG5fc3RvcmUodCl9fWZ1bmN0aW9uIHRyKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG5yKGUsdCxuKXtjb25zdCByPXthOmUsYjp0LGNudDoxfSxpPSguLi5lKT0+e3IuY250Kys7Y29uc3QgdD1yLmE7ci5hPTA7dHJ5e3JldHVybiBuKHQsci5iLC4uLmUpfWZpbmFsbHl7ci5hPXQsaS5fd2JnX2NiX3VucmVmKCl9fTtyZXR1cm4gaS5fd2JnX2NiX3VucmVmPSgpPT57MD09LS1yLmNudCYmKGxyLl9fd2JpbmRnZW5fZGVzdHJveV9jbG9zdXJlKHIuYSxyLmIpLHIuYT0wLFBuLnVucmVnaXN0ZXIocikpfSxQbi5yZWdpc3RlcihpLHIsciksaX1mdW5jdGlvbiBycihlLHQpe2NvbnN0IG49dCg4KmUubGVuZ3RoLDgpPj4+MDtyZXR1cm4gWm4oKS5zZXQoZSxuLzgpLHVyPWUubGVuZ3RoLG59ZnVuY3Rpb24gaXIoZSx0LG4pe2lmKHZvaWQgMD09PW4pe2NvbnN0IG49X3IuZW5jb2RlKGUpLHI9dChuLmxlbmd0aCwxKT4+PjA7cmV0dXJuIFFuKCkuc3ViYXJyYXkocixyK24ubGVuZ3RoKS5zZXQobiksdXI9bi5sZW5ndGgscn1sZXQgcj1lLmxlbmd0aCxpPXQociwxKT4+PjA7Y29uc3Qgbz1RbigpO2xldCBzPTA7Zm9yKDtzPHI7cysrKXtjb25zdCB0PWUuY2hhckNvZGVBdChzKTtpZih0PjEyNylicmVhaztvW2krc109dH1pZihzIT09cil7MCE9PXMmJihlPWUuc2xpY2UocykpLGk9bihpLHIscj1zKzMqZS5sZW5ndGgsMSk+Pj4wO2NvbnN0IHQ9UW4oKS5zdWJhcnJheShpK3MsaStyKTtzKz1fci5lbmNvZGVJbnRvKGUsdCkud3JpdHRlbixpPW4oaSxyLHMsMSk+Pj4wfXJldHVybiB1cj1zLGl9ZnVuY3Rpb24gb3IoZSl7Y29uc3QgdD1sci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuZ2V0KGUpO3JldHVybiBsci5fX2V4dGVybnJlZl90YWJsZV9kZWFsbG9jKGUpLHR9bGV0IHNyPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KTtzci5kZWNvZGUoKTtjb25zdCBhcj0yMTQ2NDM1MDcyO2xldCBjcj0wO2NvbnN0IF9yPW5ldyBUZXh0RW5jb2RlcjsiZW5jb2RlSW50byJpbiBfcnx8KF9yLmVuY29kZUludG89ZnVuY3Rpb24oZSx0KXtjb25zdCBuPV9yLmVuY29kZShlKTtyZXR1cm4gdC5zZXQobikse3JlYWQ6ZS5sZW5ndGgsd3JpdHRlbjpuLmxlbmd0aH19KTtsZXQgbHIsdXI9MDtmdW5jdGlvbiBmcihlLHQpe3JldHVybiBscj1lLmV4cG9ydHMscW49bnVsbCxLbj1udWxsLFhuPW51bGwsbHIuX193YmluZGdlbl9zdGFydCgpLGxyfWFzeW5jIGZ1bmN0aW9uIGdyKGUpe2lmKHZvaWQgMCE9PWxyKXJldHVybiBscjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZV9vcl9wYXRoOmV9PWUpOmNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb247IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKSksdm9pZCAwPT09ZSYmKGU9bmV3IFVSTCgia2NsX3dhc21fbGliX2JnLndhc20iLGRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJiJTQ1JJUFQiPT09ZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkmJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjfHxuZXcgVVJMKCJ3b3JrZXItZW5naW5lLmpzIixkb2N1bWVudC5iYXNlVVJJKS5ocmVmKSk7Y29uc3QgdD1ObigpOygic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBSZXF1ZXN0JiZlIGluc3RhbmNlb2YgUmVxdWVzdHx8ImZ1bmN0aW9uIj09dHlwZW9mIFVSTCYmZSBpbnN0YW5jZW9mIFVSTCkmJihlPWZldGNoKGUpKTtjb25zdHtpbnN0YW5jZTpuLG1vZHVsZTpyfT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmZSBpbnN0YW5jZW9mIFJlc3BvbnNlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcpdHJ5e3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhlLHQpfWNhdGNoKHQpe2lmKCFlLm9rfHwhZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiYmFzaWMiOmNhc2UiY29ycyI6Y2FzZSJkZWZhdWx0IjpyZXR1cm4hMH1yZXR1cm4hMX0oZS50eXBlKXx8ImFwcGxpY2F0aW9uL3dhc20iPT09ZS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIikpdGhyb3cgdDtjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLHQpfWNvbnN0IG49YXdhaXQgZS5hcnJheUJ1ZmZlcigpO3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShuLHQpfXtjb25zdCBuPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCk7cmV0dXJuIG4gaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2U6bixtb2R1bGU6ZX06bn19KGF3YWl0IGUsdCk7cmV0dXJuIGZyKG4pfXZhciBocj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxDb250ZXh0OnluLEludG9VbmRlcmx5aW5nQnl0ZVNvdXJjZTptbixJbnRvVW5kZXJseWluZ1Npbms6U24sSW50b1VuZGVybHlpbmdTb3VyY2U6eG4sTHNwU2VydmVyQ29uZmlnOkJuLFJlc3BvbnNlQ29udGV4dDpVbixUYW5nZW50aWFsQXJjSW5mb091dHB1dFdhc206RW4sV2FzbUNpcmNsZVBhcmFtczpJbixiYXNlNjRfZGVjb2RlOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5iYXNlNjRfZGVjb2RlKHQsbik7aWYoclszXSl0aHJvdyBvcihyWzJdKTt2YXIgaT1ZbihyWzBdLHJbMV0pLnNsaWNlKCk7cmV0dXJuIGxyLl9fd2JpbmRnZW5fZnJlZShyWzBdLDEqclsxXSwxKSxpfSxjYWxjdWxhdGVfY2lyY2xlX2Zyb21fM19wb2ludHM6ZnVuY3Rpb24oZSx0LG4scixpLG8pe2NvbnN0IHM9bHIuY2FsY3VsYXRlX2NpcmNsZV9mcm9tXzNfcG9pbnRzKGUsdCxuLHIsaSxvKTtyZXR1cm4gSW4uX193cmFwKHMpfSxjaGFuZ2VfZGVmYXVsdF91bml0czpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz11cixsPWxyLmNoYW5nZV9kZWZhdWx0X3VuaXRzKHMsYSxjLF8pO3ZhciBpPWxbMF0sbz1sWzFdO2lmKGxbM10pdGhyb3cgaT0wLG89MCxvcihsWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGNoYW5nZV9leHBlcmltZW50YWxfZmVhdHVyZXM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9aXIodCxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89dXIsbD1sci5jaGFuZ2VfZXhwZXJpbWVudGFsX2ZlYXR1cmVzKHMsYSxjLF8pO3ZhciBpPWxbMF0sbz1sWzFdO2lmKGxbM10pdGhyb3cgaT0wLG89MCxvcihsWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGNoYW5nZV9rY2xfdmVyc2lvbjpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXIsYz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz11cixsPWxyLmNoYW5nZV9rY2xfdmVyc2lvbihzLGEsYyxfKTt2YXIgaT1sWzBdLG89bFsxXTtpZihsWzNdKXRocm93IGk9MCxvPTAsb3IobFsyXSk7cmV0dXJuIG49aSxyPW8sR24oaSxvKX1maW5hbGx5e2xyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxkZWZhdWx0X2FwcF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9bHIuZGVmYXVsdF9hcHBfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IG9yKGVbMV0pO3JldHVybiBvcihlWzBdKX0sZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKCl7Y29uc3QgZT1sci5kZWZhdWx0X3Byb2plY3Rfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IG9yKGVbMV0pO3JldHVybiBvcihlWzBdKX0sZm9ybWF0X251bWJlcl9saXRlcmFsOmZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtjb25zdCBhPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89bHIuZm9ybWF0X251bWJlcl9saXRlcmFsKGUsYSxjLHRyKG4pPzQyOTQ5NjcyOTc6bj4+PjApO3ZhciBvPV9bMF0scz1fWzFdO2lmKF9bM10pdGhyb3cgbz0wLHM9MCxvcihfWzJdKTtyZXR1cm4gcj1vLGk9cyxHbihvLHMpfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19LGZvcm1hdF9udW1iZXJfdmFsdWU6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9bHIuZm9ybWF0X251bWJlcl92YWx1ZShlLHMsYSk7dmFyIGk9Y1swXSxvPWNbMV07aWYoY1szXSl0aHJvdyBpPTAsbz0wLG9yKGNbMl0pO3JldHVybiBuPWkscj1vLEduKGksbyl9ZmluYWxseXtsci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZ2V0X2tjbF92ZXJzaW9uOmZ1bmN0aW9uKCl7bGV0IGUsdDt0cnl7Y29uc3Qgbj1sci5nZXRfa2NsX3ZlcnNpb24oKTtyZXR1cm4gZT1uWzBdLHQ9blsxXSxHbihuWzBdLG5bMV0pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKGUsdCwxKX19LGdldF90YW5nZW50aWFsX2FyY190b19pbmZvOmZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9bHIuZ2V0X3RhbmdlbnRpYWxfYXJjX3RvX2luZm8oZSx0LG4scixpLG8scyk7cmV0dXJuIEVuLl9fd3JhcChhKX0saHVtYW5fZGlzcGxheV9udW1iZXI6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxhPXVyLGM9bHIuaHVtYW5fZGlzcGxheV9udW1iZXIoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxvcihjWzJdKTtyZXR1cm4gbj1pLHI9byxHbihpLG8pfWZpbmFsbHl7bHIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGltcG9ydF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPWxyLmltcG9ydF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IG9yKGVbMl0pO3ZhciB0PVduKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gbHIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LGlzX2tjbF9lbXB0eV9vcl9vbmx5X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5pc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxpc19wb2ludHNfY2N3OmZ1bmN0aW9uKGUpe2NvbnN0IHQ9cnIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyksbj11cjtyZXR1cm4gbHIuaXNfcG9pbnRzX2Njdyh0LG4pfSxrY2xfbGFuZ3VhZ2VfdmVyc2lvbjpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIua2NsX2xhbmd1YWdlX3ZlcnNpb24odCxuKTtpZihyWzJdKXRocm93IG9yKHJbMV0pO3JldHVybiBvcihyWzBdKX0sa2NsX2xpbnQ6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxyPXVyO3JldHVybiBsci5rY2xfbGludChuLHIsdCl9LGtjbF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIua2NsX3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBvcihyWzFdKTtyZXR1cm4gb3IoclswXSl9LGxzcF9ydW5fY29waWxvdDpmdW5jdGlvbihlLHQsbil7TW4oZSxCbik7dmFyIHI9ZS5fX2Rlc3Ryb3lfaW50b19yYXcoKTtjb25zdCBpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXI7cmV0dXJuIGxyLmxzcF9ydW5fY29waWxvdChyLGksbyxzLGEpfSxsc3BfcnVuX2tjbDpmdW5jdGlvbihlLHQsbil7TW4oZSxCbik7dmFyIHI9ZS5fX2Rlc3Ryb3lfaW50b19yYXcoKTtjb25zdCBpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyLHM9aXIobixsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9dXI7cmV0dXJuIGxyLmxzcF9ydW5fa2NsKHIsaSxvLHMsYSl9LG5vZGVfcGF0aF9mcm9tX3JhbmdlOmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1pcihlLGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscj11cixpPWlyKHQsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxvPXVyO3JldHVybiBsci5ub2RlX3BhdGhfZnJvbV9yYW5nZShuLHIsaSxvKX0scGFyc2VfYXBwX3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5wYXJzZV9hcHBfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IG9yKHJbMV0pO3JldHVybiBvcihyWzBdKX0scGFyc2VfcHJvamVjdF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIucGFyc2VfcHJvamVjdF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxwYXJzZV93YXNtOk9uLHBvaW50X3RvX3VuaXQ6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9dXIsbz1pcih0LGxyLl9fd2JpbmRnZW5fbWFsbG9jLGxyLl9fd2JpbmRnZW5fcmVhbGxvYykscz11cixhPWlyKG4sbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxjPXVyLF89bHIucG9pbnRfdG9fdW5pdChyLGksbyxzLGEsYyk7aWYoX1szXSl0aHJvdyBvcihfWzJdKTt2YXIgbCx1LGY9KGw9X1swXSx1PV9bMV0sbD4+Pj0wLFpuKCkuc3ViYXJyYXkobC84LGwvOCt1KSkuc2xpY2UoKTtyZXR1cm4gbHIuX193YmluZGdlbl9mcmVlKF9bMF0sOCpfWzFdLDgpLGZ9LHJlY2FzdF93YXNtOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSxsci5fX3diaW5kZ2VuX21hbGxvYyxsci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49dXIscj1sci5yZWNhc3Rfd2FzbSh0LG4pO2lmKHJbMl0pdGhyb3cgb3IoclsxXSk7cmV0dXJuIG9yKHJbMF0pfSxyZWxldmFudF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPWxyLnJlbGV2YW50X2ZpbGVfZXh0ZW5zaW9ucygpO2lmKGVbM10pdGhyb3cgb3IoZVsyXSk7dmFyIHQ9V24oZVswXSxlWzFdKS5zbGljZSgpO3JldHVybiBsci5fX3diaW5kZ2VuX2ZyZWUoZVswXSw0KmVbMV0sNCksdH0sc2VyaWFsaXplX2NvbmZpZ3VyYXRpb246ZnVuY3Rpb24oZSl7Y29uc3QgdD1sci5zZXJpYWxpemVfY29uZmlndXJhdGlvbihlKTtpZih0WzJdKXRocm93IG9yKHRbMV0pO3JldHVybiBvcih0WzBdKX0sc2VyaWFsaXplX3Byb2plY3RfY29uZmlndXJhdGlvbjpmdW5jdGlvbihlKXtjb25zdCB0PWxyLnNlcmlhbGl6ZV9wcm9qZWN0X2NvbmZpZ3VyYXRpb24oZSk7aWYodFsyXSl0aHJvdyBvcih0WzFdKTtyZXR1cm4gb3IodFswXSl9LHNldF9rY2xfcnVudGltZV9mbGFnczpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsbHIuX193YmluZGdlbl9tYWxsb2MsbHIuX193YmluZGdlbl9yZWFsbG9jKSxuPXVyLHI9bHIuc2V0X2tjbF9ydW50aW1lX2ZsYWdzKHQsbik7aWYoclsxXSl0aHJvdyBvcihyWzBdKX0sc2tldGNoX2NoZWNrcG9pbnRfbGltaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbHIuc2tldGNoX2NoZWNrcG9pbnRfbGltaXQoKT4+PjB9LGluaXRTeW5jOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWxyKXJldHVybiBscjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZTplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IHQ9Tm4oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZXx8KGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShlKSksZnIobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKGUsdCkpfSxkZWZhdWx0OmdyfSk7bGV0IGRyLGJyPUpTT04uc3RyaW5naWZ5KHtzZXR0aW5nczp7bW9kZWxpbmc6e2VuYWJsZV9zc2FvOiExfX19KTtmdW5jdGlvbiB3cihlKXtyZXR1cm4gZHI/LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmKGRyLnNlbmQoZSksITApfWNvbnN0IHByPXtmaXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7fSxhc3luYyBzZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7aWYocG9zdE1lc3NhZ2Uoe3RvOiJ3ZWJzb2NrZXQiLHBheWxvYWQ6e3R5cGU6InNlbmQiLGRhdGE6bn19KSx3cihuKSlyZXR1cm4gbmV3IFByb21pc2UoKHQ9Pntjb25zdCBuPXI9PntpZihyLmRhdGEuaW5kZXhPZihlKTwwKXJldHVybjtjb25zdCBpPShvPUpTT04ucGFyc2Uoci5kYXRhKSxuZXcgbChzKS5lbmNvZGVTaGFyZWRSZWYobykpO3ZhciBvLHM7dChpKSxkci5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX07ZHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9KSl9LGFzeW5jIHN0YXJ0TmV3U2Vzc2lvbigpe319O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50byl7Y2FzZSJ3b3JrZXIiOnJldHVybiB2b2lkKCJzdGFydCI9PT10LnBheWxvYWQudHlwZSYmKGFzeW5jIGU9Pnthd2FpdCBmZXRjaChuZXcgVVJMKCIva2NsX3dhc21fbGliX2JnLndhc20iLGxvY2F0aW9uLm9yaWdpbikpLnRoZW4oKGU9PmUuYXJyYXlCdWZmZXIoKSkpLnRoZW4oKGU9PmdyKHttb2R1bGVfb3JfcGF0aDplfSkpKSxicj1KU09OLnN0cmluZ2lmeSh7c2V0dGluZ3M6e21vZGVsaW5nOntlbmFibGVfc3NhbzplLmVuYWJsZV9zc2FvPz8hMX19fSksZHI9bmV3IFdlYlNvY2tldChwbi51cmxDb25zdHJ1Y3RGcm9tKHt3ZWJydGM6ZS53ZWJydGM/PyEwLC4uLmV9KSksZHIuYmluYXJ5VHlwZT0iYXJyYXlidWZmZXIiLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgoKT0+e3BuLmF1dGhlbnRpY2F0ZSh7Y2xpZW50OmUuY2xpZW50fSxkcil9KSx7b25jZTohMH0pLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToibWVzc2FnZSIsZGF0YTplLmRhdGF9fSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57ZHIucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiZkci5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwaW5nIn0pKX0pLDRlMyl9KSh0LnBheWxvYWQuZGF0YVswXSkpO2Nhc2Uid2Vic29ja2V0IjppZigic2VuZCI9PT10LnBheWxvYWQudHlwZSl7Y29uc3RbZV09dC5wYXlsb2FkLmRhdGE7cmV0dXJuIHZvaWQoKCJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpJiZ3cihlKSl9cmV0dXJuIHZvaWQgZHI/Llt0LnBheWxvYWQudHlwZV0oLi4udC5wYXlsb2FkLmRhdGEpO2Nhc2Uid2FzbSI6cmV0dXJuIHZvaWQoImV4ZWN1dGUiPT09dC5wYXlsb2FkLnR5cGU/KChlLHQ9e21haW5LY2xQYXRoTmFtZToibWFpbi5rY2wifSk9Pntjb25zdCBuPSJzdHJpbmciPT10eXBlb2YgZT8oaT1lLHtyZWFkRmlsZTphc3luYyBlPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoaSksZXhpc3RzOmFzeW5jIGU9PiExLGdldEFsbEZpbGVzOmFzeW5jIGU9PltpXX0pOihyPWUse2FzeW5jIHJlYWRGaWxlKGUpe2NvbnN0IHQ9ci5nZXQoZSk/PyIiO3JldHVybihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX0sZXhpc3RzOmFzeW5jIGU9PnIuaGFzKGUpLGdldEFsbEZpbGVzOmFzeW5jIGU9PkFycmF5LmZyb20oci52YWx1ZXMoKSl9KTt2YXIgcixpO2NvbnN0IG89InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5nZXQodC5tYWluS2NsUGF0aE5hbWUpLHM9bmV3IHluKHByLG4pLGE9T24obylbMF07cmV0dXJuIHMuZXhlY3V0ZShKU09OLnN0cmluZ2lmeShhKSx0Lm1haW5LY2xQYXRoTmFtZSxicil9KSh0LnBheWxvYWQuZGF0YVswXSx0LnBheWxvYWQuZGF0YVsxXSkudGhlbigoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3YXNtIixwYXlsb2FkOnt0eXBlOiJleGVjdXRlIixkYXRhOmV9fSl9KSkuY2F0Y2goKGU9Pntwb3N0TWVzc2FnZSh7ZnJvbToid2FzbSIscGF5bG9hZDp7dHlwZToiZXhlY3V0ZSIsZGF0YTplfX0pfSkpOnBvc3RNZXNzYWdlKGhyW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSkpKX19KSl9KCk7Cgo=",null,!1);const An=(t,e)=>{let n;return{fn:(...t)=>{n=t},intervalId:setInterval((()=>{if(void 0===n)return;const e=n;n=void 0,window.requestAnimationFrame((()=>{t(...e)}))}),e)}};var $n=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}($n||{}),qn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(qn||{});const ti={[$n.DOWN]:"camera_drag_start",[$n.UP]:"camera_drag_end"},ei={[qn.MIDDLE]:"pan",[qn.RIGHT]:"rotatetrackball"};class ni extends EventTarget{removeMouseEvents=()=>{};removeResizeObserver=()=>{};constructor(t){super(),this.zooClientArgs={...t,enable_ssao:t.enable_ssao??!0},this.workerEngine=new Dn,this.rtcPeerConnection=new RTCPeerConnection({bundlePolicy:"max-bundle"}),this.rtcPeerConnection.addTransceiver("video",{direction:"recvonly"}),this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"),this.ice(),this.rtcPeerConnection.addEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.addEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.addEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this))}deconstructor(){this.removeMouseEvents(),this.removeResizeObserver(),this.deice(),this.rtcPeerConnection.removeEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.removeEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.removeEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this)),this.workerEngine.terminate(),this.rtcPeerConnection.close()}async start(){const e=t=>{const n=t.data;"from"in n&&"websocket"===n.from&&"payload"in n&&"object"==typeof n.payload&&"data"in n.payload&&"string"==typeof n.payload.data&&n.payload.data.indexOf("auth_token_invalid")>=0&&(this.workerEngine.removeEventListener("message",e),this.zooClientArgs.client.oauth2.fetchAuthorizationCode())},n=()=>{var t;this.workerEngine.addEventListener("message",e),this.workerEngine.postMessage({to:"worker",payload:{type:"start",data:[(t=this.zooClientArgs,JSON.parse(JSON.stringify(t)))]}})};this.zooClientArgs.client.token?n():this.zooClientArgs.client.oauth2.getAccessToken().then((t=>{t?.token?.value&&(this.zooClientArgs.client.token=t?.token?.value),void 0===this.zooClientArgs.client.token&&(this.zooClientArgs.client.token="00000000-0000-0000-0000-000000000000"),n()})).catch((e=>{"object"==typeof e&&"kind"in e&&[t.EErrorOAuth2.ErrorNoAuthCode,t.EErrorOAuth2.ErrorAccessTokenResponse].some((t=>t===e.kind))&&this.zooClientArgs.client.oauth2.fetchAuthorizationCode()}))}wasm(t,...e){return new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&(this.workerEngine.removeEventListener("message",i),n(e.payload.data))};this.workerEngine.addEventListener("message",i),this.workerEngine.postMessage({to:"wasm",payload:{type:t,data:e??[]}})}))}executor(){return{addEventListener:this.workerEngine.addEventListener.bind(this.workerEngine,"message"),removeEventListener:this.workerEngine.removeEventListener.bind(this.workerEngine,"message"),submit:(t,e={mainKclPathName:"main.kcl"})=>new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&"execute"===e.payload.type&&(this.workerEngine.removeEventListener("message",i),n(e.payload.data))};this.workerEngine.addEventListener("message",i),this.workerEngine.postMessage({to:"wasm",payload:{type:"execute",data:[t,e]}})}))}}webRTCOnConnectionStateChange(){if("disconnected"===this.rtcPeerConnection.connectionState)this.dispatchEvent(new Event("close"))}webRTCOnTrack(t){this.track=t,this.dispatchEvent(new Event("track"))}webRTCOnDataChannel(t){this.channel=t.channel,this.dispatchEvent(new Event("datachannel")),this.dispatchEvent(new Event("connected"))}async iceOnIceServerInfo(t){if(0==t.data.ice_servers.length)return;this.rtcPeerConnection.setConfiguration({bundlePolicy:"max-bundle",iceServers:t.data.ice_servers,iceTransportPolicy:"relay"});const e=await this.rtcPeerConnection.createOffer();await this.rtcPeerConnection.setLocalDescription(e),this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"sdp_offer",offer:e})]}})}async iceOnSdpAnswer(t){await this.rtcPeerConnection.setRemoteDescription(t.data.answer)}async iceOnTrickleIce(t){await this.rtcPeerConnection.addIceCandidate(t.data.candidate)}iceOnIceCandidate(t){null!==t.candidate&&this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"trickle_ice",candidate:{candidate:t.candidate.candidate,sdpMid:t.candidate.sdpMid||void 0,sdpMLineIndex:t.candidate.sdpMLineIndex||void 0,usernameFragment:t.candidate.usernameFragment||void 0}})]}})}iceOnMessage(t){const e=Sn.parseMessage(t);if("resp"in e)switch(e.resp.type){case"ice_server_info":this.iceOnIceServerInfo(e.resp);break;case"sdp_answer":this.iceOnSdpAnswer(e.resp);break;case"trickle_ice":this.iceOnTrickleIce(e.resp)}}workerEngineOnMessage(t){const e=t.data;"from"in e&&"websocket"===e.from&&"message"===e.payload.type&&this.iceOnMessage(e.payload)}ice(){this.workerEngine.addEventListener("message",this.workerEngineOnMessage.bind(this)),this.rtcPeerConnection.addEventListener("icecandidate",this.iceOnIceCandidate.bind(this))}deice(){this.workerEngine.removeEventListener("message",this.workerEngineOnMessage.bind(this)),this.rtcPeerConnection.removeEventListener("icecandidate",this.iceOnIceCandidate)}addMouseEvents(t){let e,n=$n.UP;const i=t=>i=>{const l=ei[i.button];if(void 0===l)return;const o={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:ti[t],interaction:l,window:{x:i.offsetX,y:i.offsetY}}})]};this.workerEngine.postMessage({to:"websocket",payload:o}),this.channel?.send(o.data[0]),e=i.button,n=t},l=i($n.DOWN),o=i($n.UP),c=t=>{const i=ei[e];if(void 0===i)return;n=$n.UP;const l={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:ti[n],interaction:i,window:{x:t.offsetX,y:t.offsetY}}})]};this.workerEngine.postMessage({to:"websocket",payload:l}),this.channel?.send(l.data[0])};let s=0;const a=An((t=>{n===$n.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:ei[e],window:{x:t.offsetX,y:t.offsetY}}})),s+=1,this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"mouse_move",sequence:s,window:{x:t.offsetX,y:t.offsetY}}}))}),1e3/30),d=An((t=>{t.preventDefault(),this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"default_camera_zoom",magnitude:-1*Math.sign(t.deltaY)*window.devicePixelRatio*50}}))}),1e3/30),b=e=>{this.channel=e.channel,t.addEventListener("pointerdown",l),t.addEventListener("pointermove",a.fn),t.addEventListener("pointerup",o),t.addEventListener("pointerleave",c),t.addEventListener("wheel",d.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",b),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",b),t.removeEventListener("pointerdown",l),t.removeEventListener("pointermove",a.fn),clearInterval(a.intervalId),t.removeEventListener("pointerup",o),t.removeEventListener("pointerleave",c),t.removeEventListener("wheel",d.fn),clearInterval(d.intervalId)}}resize(t){window.requestAnimationFrame((()=>{this.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"reconfigure_stream",...t,fps:30}}))}))}addResizeObserver(t){const e=t.querySelector("video"),n=An((t=>{for(const n of t){const t=n.contentRect.width-n.contentRect.width%4,i=n.contentRect.height-n.contentRect.height%4;e.width=t,e.height=i,this.resize({width:t,height:i})}}),62.5),i=new ResizeObserver(n.fn);i.observe(t),this.removeResizeObserver=()=>{clearInterval(n.intervalId),i.disconnect()}}send(...t){return new Promise((e=>{const n=t=>{const i=t.data;"from"in i&&"websocket"===i.from&&(this.workerEngine.removeEventListener("message",n),e(i.payload.data))};this.workerEngine.addEventListener("message",n),this.workerEngine.postMessage({to:"websocket",payload:{type:"send",data:t}})}))}}const ii={get_api_call:async function({client:t,id:e}){const i=`/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_org:async function({client:t,id:e}){const i=`/org/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_user:async function({client:t,id:e}){const i=`/user/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_async_operation:async function({client:t,id:e}){const i=`/async/operations/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_calls_for_user:a,list_api_calls_for_user_pager:function(t){return s(a,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return s(d,t,"page_token")},user_list_api_calls:b,user_list_api_calls_pager:function(t){return s(b,t,"page_token")}},li={create_api_token_for_user:async function({client:t,label:e}){const i="/user/api-tokens"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_tokens_for_user:r,list_api_tokens_for_user_pager:function(t){return s(r,t,"page_token")}},oi={create_executor_term:class{constructor(){}static urlConstructFrom(t){const e="/ws/executor/term"+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},create_file_execution:async function({client:t,lang:e,output:i,body:l}){const c=`/file/execute/${e}`+n({output:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},ci={create_user_factory_job:async function({client:t,files:e}){const i="/user/factory/jobs"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,r=await b(l,d);return await o(r),await r.json()},get_org_factory_job:async function({client:t,job_id:e}){const i=`/org/factory/jobs/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_factory_finishes:Vn,get_user_factory_finishes_pager:function(t){return s(Vn,t,"page_token")},get_user_factory_job:async function({client:t,job_id:e}){const i=`/user/factory/jobs/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_factory_materials:Wn,get_user_factory_materials_pager:function(t){return s(Wn,t,"page_token")},list_org_factory_jobs:fn,list_org_factory_jobs_pager:function(t){return s(fn,t,"page_token")},list_user_factory_jobs:gn,list_user_factory_jobs_pager:function(t){return s(gn,t,"page_token")}},si={create_file_bounding_box:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/bounding-box"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_center_of_mass:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/center-of-mass"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_conversion:async function({client:t,src_format:e,output_format:i,body:l}){const c=`/file/conversion/${e}/${i}`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_conversion_options:async function({client:t,files:e,body:i}){const l="/file/conversion"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("body",new Blob([JSON.stringify(i)],{type:"application/json"}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},create_file_density:async function({client:t,src_format:e,material_mass:i,material_mass_unit:l,output_unit:c,body:s}){const a="/file/density"+n({src_format:e,material_mass:i,material_mass_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`),r["Content-Type"]="application/octet-stream";const Z={method:"POST",headers:r,body:s},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},create_file_mass:async function({client:t,src_format:e,material_density:i,material_density_unit:l,output_unit:c,body:s}){const a="/file/mass"+n({src_format:e,material_density:i,material_density_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`),r["Content-Type"]="application/octet-stream";const Z={method:"POST",headers:r,body:s},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},create_file_surface_area:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/surface-area"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},create_file_volume:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/volume"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},ai={community_sso:async function({client:t,sso:e,sig:i}){const l="/community/sso"+n({sso:e,sig:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_announcements:async function({client:t}={}){const e="/announcements"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_ipinfo:async function({client:t}={}){const e="/_meta/ipinfo"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_pricing_subscriptions:async function({client:t}={}){const e="/pricing/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_schema:async function({client:t}={}){const e="/"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},ping:async function({client:t}={}){const e="/ping"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}},di={create_custom_model:async function({client:t,body:e}){const i="/ml/custom/models"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_kcl_code_completions:async function({client:t,body:e}){const i="/ml/kcl/completions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_proprietary_to_kcl:async function({client:t,files:e,code_option:i}){const l="/ml/convert/proprietary-to-kcl"+n({code_option:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},create_text_to_cad_part_feedback:async function({client:t,id:e,feedback:i}){const l=`/user/text-to-cad/${e}`+n({feedback:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},get_custom_model:async function({client:t,id:e}){const i=`/ml/custom/models/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_text_to_cad_part_for_user:async function({client:t,id:e}){const i=`/user/text-to-cad/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},kcl_migration_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/kcl-migration"+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},list_conversations_for_user:In,list_conversations_for_user_pager:function(t){return s(In,t,"page_token")},list_text_to_cad_parts_for_user:Yn,list_text_to_cad_parts_for_user_pager:function(t){return s(Yn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/copilot"+n({replay:t.replay,conversation_id:t.conversation_id,replay_attachment_mode:t.replay_attachment_mode,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},ml_reasoning_ws:class{constructor(){}static urlConstructFrom(t){const e=`/ws/ml/reasoning/${t.id}`+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return yn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return yn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}if(Gn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return yn.deserialize(t)}return e}},update_custom_model:async function({client:t,id:e,body:i}){const l=`/ml/custom/models/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()}},bi={modeling_commands_ws:Sn},ri={approve_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/approve`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_oauth2_app:async function({client:t,body:e}){const i="/org/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_user_oauth2_app:async function({client:t,body:e}){const i="/user/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},deny_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/deny`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},device_access_token:async function({client:t,body:e}){const l="/oauth2/device/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},device_auth_confirm:async function({client:t,body:e}){const i="/oauth2/device/confirm"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},device_auth_request:async function({client:t,body:e}){const l="/oauth2/device/auth"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},device_auth_verify:async function({client:t,user_code:e,app_name:i}){const l="/oauth2/device/verify"+n({user_code:e,app_name:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_org_oauth2_apps:Jn,list_org_oauth2_apps_pager:function(t){return s(Jn,t,"page_token")},list_user_oauth2_apps:Rn,list_user_oauth2_apps_pager:function(t){return s(Rn,t,"page_token")},oauth2_authorize:async function({client:t,response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}){const b="/oauth2/authorize"+n({response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}),r=(t?.baseUrl||"https://api.zoo.dev")+b,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(r,u);return await o(p),await p.json()},oauth2_provider_callback:async function({client:t,provider:e,code:i,state:l,id_token:c,user:s}){const a=`/oauth2/provider/${e}/callback`+n({code:i,state:l,id_token:c,user:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",r={};b&&(r.Authorization=`Bearer ${b}`);const Z={method:"GET",headers:r},m=t?.fetch||fetch,u=await m(d,Z);return await o(u),await u.json()},oauth2_provider_callback_post:async function({client:t,provider:e,body:l}){const c=`/oauth2/provider/${e}/callback`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/x-www-form-urlencoded";const b={method:"POST",headers:d,body:i(l)},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},oauth2_provider_consent:async function({client:t,provider:e,callback_url:i}){const l=`/oauth2/provider/${e}/consent`+n({callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},oauth2_token:async function({client:t,body:e}){const l="/oauth2/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},oauth2_token_revoke:async function({client:t,body:e}){const l="/oauth2/token/revoke"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/org/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_user_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/user/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},verify_oauth_account_linking:async function({client:t,token:e,callback_url:i}){const l="/oauth2/verify-account-linking"+n({token:e,callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()}},Zi={create_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_dataset:async function({client:t,body:e}){const i="/org/datasets"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_member:async function({client:t,body:e}){const i="/org/members"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},download_org_dataset_conversion_original:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/original`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:e}){const i=`/org/datasets/${e}/bulk-download/kcl`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_org_dataset_conversion_stats:async function({client:t,id:e}){const i=`/org/datasets/${e}/stats`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_privacy_settings:async function({client:t}={}){const e="/org/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_shortlinks:xn,get_org_shortlinks_pager:function(t){return s(xn,t,"page_token")},get_user_org:async function({client:t}={}){const e="/user/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_org_dataset_conversions:Kn,list_org_dataset_conversions_pager:function(t){return s(Kn,t,"page_token")},list_org_datasets:Ln,list_org_datasets_pager:function(t){return s(Ln,t,"page_token")},list_org_members:Tn,list_org_members_pager:function(t){return s(Tn,t,"page_token")},list_org_skills:Un,list_org_skills_pager:function(t){return s(Un,t,"page_token")},org_dataset_s3_policies:async function({client:t,uri:e,role_arn:i}){const l="/org/dataset/s3/policies"+n({uri:e,role_arn:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},retrigger_org_dataset:async function({client:t,id:e,statuses:i}){const l=`/org/datasets/${e}/retrigger`+n({statuses:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},retrigger_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/retrigger`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},search_org_dataset_conversions:Nn,search_org_dataset_conversions_pager:function(t){return s(Nn,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:e,q:i,limit:l}){const c=`/org/datasets/${e}/search/semantic`+n({q:i,limit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},update_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_dataset:async function({client:t,id:e,body:i}){const l=`/org/datasets/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_member:async function({client:t,user_id:e,body:i}){const l=`/org/members/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},update_org_privacy_settings:async function({client:t,body:e}){const i="/org/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},upload_org_dataset_files:async function({client:t,files:e,id:i}){const l=`/org/datasets/${i}/uploads`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()}},mi={create_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_intent_for_org:async function({client:t}={}){const e="/org/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_payment_intent_for_user:async function({client:t}={}){const e="/user/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_method_for_org:async function({client:t,id:e}){const i=`/org/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_org_subscription:async function({client:t}={}){const e="/org/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_usage_collection_threshold:async function({client:t}={}){const e="/org/billing/usage-collection-threshold"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_balance_for_org:async function({client:t,include_total_due:e}){const i="/org/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_balance_for_user:async function({client:t,include_total_due:e}){const i="/user/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_subscription:async function({client:t}={}){const e="/user/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_usage_collection_threshold:async function({client:t}={}){const e="/user/billing/usage-collection-threshold"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_invoices_for_org:zn,list_invoices_for_org_pager:function(t){return s(zn,t,"page_token")},list_invoices_for_user:wn,list_invoices_for_user_pager:function(t){return s(wn,t,"page_token")},list_payment_methods_for_org:kn,list_payment_methods_for_org_pager:function(t){return s(kn,t,"page_token")},list_payment_methods_for_user:Hn,list_payment_methods_for_user_pager:function(t){return s(Hn,t,"page_token")},redirect_payment_method_portal_link_for_org:async function({client:t,return_url:e}){const i="/org/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},redirect_payment_method_portal_link_for_user:async function({client:t,return_url:e}){const i="/user/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},reset_org_usage_collection_threshold:async function({client:t,expected_version:e}){const i="/org/billing/usage-collection-threshold"+n({expected_version:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},reset_user_usage_collection_threshold:async function({client:t,expected_version:e}){const i="/user/billing/usage-collection-threshold"+n({expected_version:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},set_default_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}/default`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},set_org_usage_collection_threshold:async function({client:t,body:e}){const i="/org/billing/usage-collection-threshold"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},set_user_usage_collection_threshold:async function({client:t,body:e}){const i="/user/billing/usage-collection-threshold"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const e="/org/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},validate_customer_tax_information_for_user:async function({client:t}={}){const e="/user/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)}},ui={create_project:async function({client:t,files:e}){const i="/user/projects"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,r=await b(l,d);return await o(r),await r.json()},create_project_share_link:async function({client:t,id:e,body:i}){const l=`/user/projects/${e}/share-links`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},create_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_project_organization:async function({client:t,id:e}){const i=`/user/projects/${e}/organization`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_project_share_link:async function({client:t,id:e,key:i}){const l=`/user/projects/${e}/share-links/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"DELETE",headers:a},b=t?.fetch||fetch,r=await b(c,d);await o(r)},delete_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},download_project:async function({client:t,id:e,format:i}){const l=`/user/projects/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},download_project_version:async function({client:t,id:e,version_id:i,format:l}){const c=`/user/projects/${e}/versions/${i}/download`+n({format:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},download_public_project:async function({client:t,id:e,format:i}){const l=`/projects/public/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_project_thumbnail:async function({client:t,id:e}){const i=`/user/projects/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_project_version:async function({client:t,id:e,version_id:i}){const l=`/user/projects/${e}/versions/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_project_version_thumbnail:async function({client:t,id:e,version_id:i}){const l=`/user/projects/${e}/versions/${i}/thumbnail`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,r=await b(c,d);return await o(r),await r.json()},get_public_project:async function({client:t,id:e}){const i=`/projects/public/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_public_project_thumbnail:async function({client:t,id:e}){const i=`/projects/public/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_project_categories:async function({client:t}={}){const e="/projects/categories"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_project_share_links:Bn,list_project_share_links_pager:function(t){return s(Bn,t,"page_token")},list_project_versions:jn,list_project_versions_pager:function(t){return s(jn,t,"page_token")},list_projects:async function({client:t}={}){const e="/user/projects"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_public_projects:Cn,list_public_projects_pager:function(t){return s(Cn,t,"page_token")},publish_project:async function({client:t,id:e}){const i=`/user/projects/${e}/publish`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_project:async function({client:t,files:e,id:i}){const l=`/user/projects/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"PUT",headers:a,body:d},r=t?.fetch||fetch,Z=await r(c,b);return await o(Z),await Z.json()},update_project_organization:async function({client:t,id:e}){const i=`/user/projects/${e}/organization`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"PUT",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()}},hi={create_service_account_for_org:async function({client:t,label:e}){const i="/org/service-accounts"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_service_accounts_for_org:vn,list_service_accounts_for_org_pager:function(t){return s(vn,t,"page_token")}},pi={get_angle_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/angle/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_area_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/area/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_current_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/current/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_energy_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/energy/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_force_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/force/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_frequency_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/frequency/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_length_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/length/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_mass_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/mass/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_power_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/power/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_pressure_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/pressure/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_temperature_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/temperature/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_torque_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/torque/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()},get_volume_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/volume/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},r=t?.fetch||fetch,Z=await r(s,b);return await o(Z),await Z.json()}},Xi={create_user_shortlink:async function({client:t,body:e}){const i="/user/shortlinks"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_user_shortlink:async function({client:t,key:e}){const i=`/user/shortlinks/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_oauth2_providers_for_user:async function({client:t}={}){const e="/user/oauth2/providers"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_session_for_user:async function({client:t,token:e}){const i=`/user/session/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user:async function({client:t,id:e}){const i=`/users/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_cad_user_info_form:async function({client:t}={}){const e="/user/cad-user-info"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_extended:async function({client:t,id:e}){const i=`/users-extended/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_privacy_settings:async function({client:t}={}){const e="/user/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self_extended:async function({client:t}={}){const e="/user/extended"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_shortlinks:Mn,get_user_shortlinks_pager:function(t){return s(Mn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:e}){const i="/website/email-marketing-consent/request"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_mailing_list_subscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/subscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},put_public_mailing_list_unsubscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/unsubscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},put_public_sales_form:async function({client:t,body:e}){const i="/website/forms/sales"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_support_form:async function({client:t,body:e}){const i="/website/forms/support"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_user_cad_user_info_form:async function({client:t,body:e}){const i="/website/forms/cad-user-info"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},report_user_client_error:async function({client:t,body:e}){const i="/user/client-errors"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_privacy_settings:async function({client:t,body:e}){const i="/user/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_self:async function({client:t,body:e}){const i="/user"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_shortlink:async function({client:t,key:e,body:i}){const l=`/user/shortlinks/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,r=await b(c,d);await o(r)},user_email_marketing_consent_decline_post:async function({client:t}={}){const e="/user/email-marketing-consent/decline"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_get:async function({client:t}={}){const e="/user/email-marketing-consent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const e="/user/email-marketing-consent/request"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_seen_post:async function({client:t}={}){const e="/user/email-marketing-consent/seen"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_features_get:async function({client:t}={}){const e="/user/features"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}};exports.ApiError=l,exports.Client=class{constructor(t){const e="undefined"!=typeof process?process.env:void 0,n=e?.KITTYCAD_TOKEN||e?.KITTYCAD_API_TOKEN||e?.ZOO_API_TOKEN,i=e?.ZOO_HOST;"string"==typeof t?this.token=t:t&&"object"==typeof t&&(this.token=t.token,this.baseUrl=t.baseUrl,this.fetch=t.fetch,this.clientId=t.clientId,this.redirectUrl=t.redirectUrl,this.scopes=t.scopes,this.onAccessTokenExpiry=t.onAccessTokenExpiry,this.onInvalidGrant=t.onInvalidGrant),this.token??=n,this.baseUrl??=i,this.clientId&&"undefined"!=typeof localStorage&&(this.oauth2=this.createOAuth2Client(),this.oauth2.isHTTPDecoratorActive(!0),this.fetch=this.oauth2.decorateFetchHTTPClient(this.fetch||fetch))}authorize(t){return this.oauth2.fetchAuthorizationCode(t)}isReturningFromAuthServer(){return this.oauth2.isReturningFromAuthServer()}async getAccessToken(){const t=await this.oauth2.getAccessToken();return this.updateTokenFromAccessContext(t),t}resetOAuth2(){this.oauth2.reset(),this.token=void 0}createOAuth2Client(){const n=this.baseUrl||"https://api.zoo.dev",i=this.redirectUrl||("undefined"==typeof location?void 0:`${location.origin}${location.pathname}`);if(!i)throw new Error("OAuth2 requires redirectUrl when the current browser URL is unavailable.");return new t.OAuth2AuthCodePKCE({authorizationUrl:e(n,"/oauth2/authorize"),tokenUrl:e(n,"/oauth2/token"),clientId:this.clientId,redirectUrl:i,scopes:this.scopes||[],onAccessTokenExpiry:async t=>{const e=await(this.onAccessTokenExpiry?this.onAccessTokenExpiry(t):t());return this.updateTokenFromAccessContext(e),e},onInvalidGrant:this.onInvalidGrant||(()=>{})})}updateTokenFromAccessContext(t){t?.token?.value&&(this.token=t.token.value)}},exports.Pager=c,exports.WebRTC=ni,exports.api_calls=ii,exports.api_tokens=li,exports.createPager=s,exports.executor=oi,exports.factory=ci,exports.file=si,exports.meta=ai,exports.ml=di,exports.modeling=bi,exports.oauth2=ri,exports.orgs=Zi,exports.payments=mi,exports.projects=ui,exports.service_accounts=hi,exports.unit=pi,exports.users=Xi;