diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 7b1de4e..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - "env": { - "es6": true, - "node": true, - "mocha": true - }, - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "extends": "eslint:recommended", - "rules": { - "indent": [ - "error", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ] - } -}; diff --git a/build/browser.esm.js b/build/browser.esm.js index 09713f3..4445952 100644 --- a/build/browser.esm.js +++ b/build/browser.esm.js @@ -1,4 +1,3 @@ -/* global BigInt */ const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; function fromString(s, radix) { @@ -24,16 +23,16 @@ function fromArray(a, radix) { return acc; } -function bitLength$6(a) { +function bitLength(a) { const aS =a.toString(16); return (aS.length-1)*4 +hexLen[parseInt(aS[0], 16)]; } -function isNegative$4(a) { +function isNegative(a) { return BigInt(a) < BigInt(0); } -function isZero$1(a) { +function isZero(a) { return !a; } @@ -48,7 +47,7 @@ function shiftRight(a, n) { const shl = shiftLeft; const shr = shiftRight; -function isOdd$5(a) { +function isOdd(a) { return (BigInt(a) & BigInt(1)) == BigInt(1); } @@ -84,7 +83,7 @@ function bits(n) { return res; } -function toNumber$1(s) { +function toNumber(s) { if (s>BigInt(Number.MAX_SAFE_INTEGER )) { throw new Error("Number too big"); } @@ -119,7 +118,7 @@ function mul(a, b) { return BigInt(a) * BigInt(b); } -function square$2(a) { +function square(a) { return BigInt(a) * BigInt(a); } @@ -131,7 +130,7 @@ function exp$1(a, b) { return BigInt(a) ** BigInt(b); } -function abs$1(a) { +function abs(a) { return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a); } @@ -198,7 +197,7 @@ function toRprLE(buff, o, e, n8) { const l = (((s.length-7)*4 - 1) >> 5)+1; // Number of 32bit words; for (let i=0; i{ function exp(F, base, e) { - if (isZero$1(e)) return F.one; + if (isZero(e)) return F.one; const n = bits(e); @@ -1045,7 +1044,7 @@ function alg5_tonelliShanks(F) { F.sqrt_s = 0; F.sqrt_t = sub(F.sqrt_q, 1); - while (!isOdd$5(F.sqrt_t)) { + while (!isOdd(F.sqrt_t)) { F.sqrt_s = F.sqrt_s + 1; F.sqrt_t = div(F.sqrt_t, 2); } @@ -1261,15 +1260,22 @@ class ChaCha { } } +var os = {}; + function getRandomBytes(n) { let array = new Uint8Array(n); - { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } + // Feature-detect rather than rely on `true` (undefined under + // Vite/esbuild/SES -> ReferenceError). Prefer Node crypto (no per-call size + // limit); fall back to Web Crypto chunked to its 65536-byte cap. + if (os && os.randomFillSync) { // Node + os.randomFillSync(array); + } else if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.getRandomValues) { + for (let i = 0; i < n; i += 65536) { + globalThis.crypto.getRandomValues(array.subarray(i, Math.min(i + 65536, n))); + } + } else { // insecure last resort + for (let i=0; i>>0; } } return array; @@ -1441,8 +1447,6 @@ function __fft(PF, pall, bits, offset, step) { return out; } -/* global BigInt */ - class ZqField { constructor(p) { this.type="F1"; @@ -1453,7 +1457,7 @@ class ZqField { this.negone = this.p-this.one; this.two = BigInt(2); this.half = this.p >> this.one; - this.bitLength = bitLength$6(this.p); + this.bitLength = bitLength(this.p); this.mask = (this.one << BigInt(this.bitLength)) - this.one; this.n64 = Math.floor((this.bitLength - 1) / 64)+1; @@ -2757,3501 +2761,1708 @@ class EC { } -var utils$6 = {}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -utils$6.bigInt2BytesLE = function bigInt2BytesLE(_a, len) { - const b = Array(len); - let v = BigInt(_a); - for (let i=0; i> 8n; +function stringifyBigInts(o) { + if (typeof o == "bigint" || o.eq !== undefined) { + return o.toString(10); + } else if (o instanceof Uint8Array) { + return fromRprLE(o, 0); + } else if (Array.isArray(o)) { + return o.map(stringifyBigInts); + } else if (typeof o == "object") { + const res = {}; + const keys = Object.keys(o); + keys.forEach((k) => { + res[k] = stringifyBigInts(o[k]); + }); + return res; + } else { + return o; } - return b; -}; +} -utils$6.bigInt2U32LE = function bigInt2BytesLE(_a, len) { - const b = Array(len); - let v = BigInt(_a); - for (let i=0; i> 32n; +function unstringifyBigInts(o) { + if (typeof o == "string" && /^[0-9]+$/.test(o)) { + return BigInt(o); + } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { + return BigInt(o); + } else if (Array.isArray(o)) { + return o.map(unstringifyBigInts); + } else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + const keys = Object.keys(o); + keys.forEach((k) => { + res[k] = unstringifyBigInts(o[k]); + }); + return res; + } else { + return o; } - return b; -}; - -utils$6.isOcamNum = function(a) { - if (!Array.isArray(a)) return false; - if (a.length != 3) return false; - if (typeof a[0] !== "number") return false; - if (typeof a[1] !== "number") return false; - if (!Array.isArray(a[2])) return false; - return true; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_int = function buildInt(module, n64, _prefix) { - - const prefix = _prefix || "int"; - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = {}; - - const n32 = n64*2; - const n8 = n64*8; - - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("px", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); +} - for (let i=0; i 0) { + if (i >= 4) { + i -= 4; + res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); + offset += 4; + } else if (i >= 2) { + i -= 2; + res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); + offset += 2; + } else { + i -= 1; + res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); + offset += 1; } } + return res; +} - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i 0) { + if (o - 4 >= 0) { + o -= 4; + buffV.setUint32(o, Number(r & BigInt(0xffffffff))); + r = r >> BigInt(32); + } else if (o - 2 >= 0) { + o -= 2; + buffV.setUint16(o, Number(r & BigInt(0xffff))); + r = r >> BigInt(16); + } else { + o -= 1; + buffV.setUint8(o, Number(r & BigInt(0xff))); + r = r >> BigInt(8); } } - - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.i64_store( - c.getLocal("pr"), - 0, - c.i64_const(1) - ) - ); - for (let i=1; i> BigInt(32); + } else if (o + 2 <= len) { + buffV.setUint16(o, Number(r & BigInt(0xffff)), true); + o += 2; + r = r >> BigInt(16); + } else { + buffV.setUint8(o, Number(r & BigInt(0xff)), true); + o += 1; + r = r >> BigInt(8); } - - f.addCode(getCompCode(n64-1)); - f.addCode(c.ret(c.i32_const(0))); } + if (r) { + throw new Error("Number does not fit in this length"); + } + return buff; +} +function stringifyFElements(F, o) { + if (typeof o == "bigint" || o.eq !== undefined) { + return o.toString(10); + } else if (o instanceof Uint8Array) { + return F.toString(F.e(o)); + } else if (Array.isArray(o)) { + return o.map(stringifyFElements.bind(this, F)); + } else if (typeof o == "object") { + const res = {}; + const keys = Object.keys(o); + keys.forEach((k) => { + res[k] = stringifyFElements(F, o[k]); + }); + return res; + } else { + return o; + } +} +function unstringifyFElements(F, o) { + if (typeof o == "string" && /^[0-9]+$/.test(o)) { + return F.e(o); + } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { + return F.e(o); + } else if (Array.isArray(o)) { + return o.map(unstringifyFElements.bind(this, F)); + } else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + const keys = Object.keys(o); + keys.forEach((k) => { + res[k] = unstringifyFElements(F, o[k]); + }); + return res; + } else { + return o; + } +} - function buildGte() { - const f = module.addFunction(prefix+"_gte"); - f.addParam("px", "i32"); - f.addParam("py", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - function getCompCode(n) { - if (n==0) { - return c.ret(c.i64_ge_u( - c.i64_load(c.getLocal("px")), - c.i64_load(c.getLocal("py")) - )); - } - return c.if( - c.i64_lt_u( - c.i64_load(c.getLocal("px"), n*8 ), - c.i64_load(c.getLocal("py"), n*8 ) - ), - c.ret(c.i32_const(0)), - c.if( - c.i64_gt_u( - c.i64_load(c.getLocal("px"), n*8 ), - c.i64_load(c.getLocal("py"), n*8 ) - ), - c.ret(c.i32_const(1)), - getCompCode(n-1) - ) - ); - } +const _revTable = []; +for (let i = 0; i < 256; i++) { + _revTable[i] = _revSlow(i, 8); +} - f.addCode(getCompCode(n64-1)); - f.addCode(c.ret(c.i32_const(0))); +function _revSlow(idx, bits) { + let res = 0; + let a = idx; + for (let i = 0; i < bits; i++) { + res <<= 1; + res = res | (a & 1); + a >>= 1; } + return res; +} +function bitReverse(idx, bits) { + return ( + (_revTable[idx >>> 24] | + (_revTable[(idx >>> 16) & 0xff] << 8) | + (_revTable[(idx >>> 8) & 0xff] << 16) | + (_revTable[idx & 0xff] << 24)) >>> + (32 - bits) + ); +} +function log2(V) { + return ( + ((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) | + ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) | + ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) | + ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) | + ((V & 0xaaaaaaaa) !== 0) + ); +} - function buildAdd() { - - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - f.setReturnType("i32"); - f.addLocal("c", "i64"); - - const c = f.getCodeBuilder(); - - f.addCode(c.setLocal( - "c", - c.i64_add( - c.i64_load32_u(c.getLocal("x")), - c.i64_load32_u(c.getLocal("y")) - ) - )); - - f.addCode(c.i64_store32( - c.getLocal("r"), - c.getLocal("c"), - )); - - for (let i=1; i r) { + const tmp = buff.slice(i * eSize, (i + 1) * eSize); + buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); + buff.set(tmp, r * eSize); } + } +} - f.addCode(c.i32_wrap_i64(c.i64_shr_u (c.getLocal("c"), c.i64_const(32)))); - } - - - function buildSub() { - - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - f.setReturnType("i32"); - f.addLocal("c", "i64"); - - const c = f.getCodeBuilder(); - - f.addCode(c.setLocal( - "c", - c.i64_sub( - c.i64_load32_u(c.getLocal("x")), - c.i64_load32_u(c.getLocal("y")) - ) - )); - - f.addCode(c.i64_store32( - c.getLocal("r"), - c.i64_and( - c.getLocal("c"), - c.i64_const("0xFFFFFFFF") - ) - )); - - for (let i=1; i0) { + // bytes to copy from this page + const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; + const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset+o, l); + if (l == len) return srcView.slice(); + if (!buff) { + if (len <= PAGE_SIZE) { + buff = new Uint8Array(len); + } else { + buff = new BigBuffer(len); + } + } + buff.set(srcView, len-r); + r = r-l; + p ++; + o = 0; } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4*2-4, - c.getLocal(c0) - ) - ); + return buff; } + set(buff, offset) { + if (offset === undefined) offset = 0; + const len = buff.byteLength; - function buildSquare() { - - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("c0", "i64"); - f.addLocal("c1", "i64"); - f.addLocal("c0_old", "i64"); - f.addLocal("c1_old", "i64"); - - - for (let i=0;i>1) )&&(i0) { + const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; + const srcView = buff.slice( len -r, len -r+l); + const dstView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); + dstView.set(srcView); + r = r-l; + p ++; + o = 0; + } - if (k%2 == 0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - mulij(k>>1, k>>1) - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ) - ); - } + } +} - // Add the old carry - - if (k>0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - c.i64_and( - c.getLocal(c0_old), - c.i64_const(0xFFFFFFFF) - ), - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ), - c.getLocal(c1_old) - ) - ) - ); +function buildBatchConvert(tm, fnName, sIn, sOut) { + return async function batchConvert(buffIn) { + const nPoints = Math.floor(buffIn.byteLength / sIn); + if ( nPoints * sIn !== buffIn.byteLength) { + throw new Error("Invalid buffer size"); + } + const pointsPerChunk = Math.floor(nPoints/tm.concurrency); + const opPromises = []; + for (let i=0; i3)&&(Y[eY]==0) ey--; - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.i32_or( - c.i32_load8_u( - c.i32_add(Y , c.getLocal("eY")), - 0, - 0 - ), - c.i32_eq( - c.getLocal("eY"), - c.i32_const(3) - ) - ) - ), - c.setLocal("eY", c.i32_sub(c.getLocal("eY"), c.i32_const(1))), - c.br(0) - ))); - - f.addCode( - c.setLocal( - "sy", - c.i64_add( - c.i64_load32_u( - c.i32_sub( - c.i32_add( Y, c.getLocal("eY")), - c.i32_const(3) - ), - 0, - 0 - ), - c.i64_const(1) - ) - ) - ); + this.half = shiftRight(this.p, one); + this.nqr = this.two; + let r = this.exp(this.nqr, this.half); + while (!this.eq(r, this.negone)) { + this.nqr = this.add(this.nqr, this.one); + r = this.exp(this.nqr, this.half); + } - // Force a divide by 0 if quotien is 0 - f.addCode( - c.if( - c.i64_eq( - c.getLocal("sy"), - c.i64_const(1) - ), - c.drop(c.i64_div_u(c.i64_const(0), c.i64_const(0))) - ) - ); + this.shift = this.mul(this.nqr, this.nqr); + this.shiftInv = this.inv(this.shift); - f.addCode(c.block(c.loop( - - // while (eX>7)&&(Y[eX]==0) ex--; - c.block(c.loop( - c.br_if( - 1, - c.i32_or( - c.i32_load8_u( - c.i32_add(R , c.getLocal("eX")), - 0, - 0 - ), - c.i32_eq( - c.getLocal("eX"), - c.i32_const(7) - ) - ) - ), - c.setLocal("eX", c.i32_sub(c.getLocal("eX"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal( - "sx", - c.i64_load( - c.i32_sub( - c.i32_add( R, c.getLocal("eX")), - c.i32_const(7) - ), - 0, - 0 - ) - ), - - c.setLocal( - "sx", - c.i64_div_u( - c.getLocal("sx"), - c.getLocal("sy") - ) - ), - c.setLocal( - "ec", - c.i32_sub( - c.i32_sub( - c.getLocal("eX"), - c.getLocal("eY") - ), - c.i32_const(4) - ) - ), - - // While greater than 32 bits or ec is neg, shr and inc exp - c.block(c.loop( - c.br_if( - 1, - c.i32_and( - c.i64_eqz( - c.i64_and( - c.getLocal("sx"), - c.i64_const("0xFFFFFFFF00000000") - ) - ), - c.i32_ge_s( - c.getLocal("ec"), - c.i32_const(0) - ) - ) - ), - - c.setLocal( - "sx", - c.i64_shr_u( - c.getLocal("sx"), - c.i64_const(8) - ) - ), - - c.setLocal( - "ec", - c.i32_add( - c.getLocal("ec"), - c.i32_const(1) - ) - ), - c.br(0) - )), - - c.if( - c.i64_eqz(c.getLocal("sx")), - [ - ...c.br_if( - 2, - c.i32_eqz(c.call(prefix + "_gte", R, Y)) - ), - ...c.setLocal("sx", c.i64_const(1)), - ...c.setLocal("ec", c.i32_const(0)) - ] - ), - - c.call(prefix + "__mul1", Y, c.getLocal("sx"), R2), - c.drop(c.call( - prefix + "_sub", - R, - c.i32_sub(R2, c.getLocal("ec")), - R - )), - c.call( - prefix + "__add1", - c.i32_add(C, c.getLocal("ec")), - c.getLocal("sx") - ), - c.br(0) - ))); - } - - function buildInverseMod() { - - const f = module.addFunction(prefix+"_inverseMod"); - f.addParam("px", "i32"); - f.addParam("pm", "i32"); - f.addParam("pr", "i32"); - f.addLocal("t", "i32"); - f.addLocal("newt", "i32"); - f.addLocal("r", "i32"); - f.addLocal("qq", "i32"); - f.addLocal("qr", "i32"); - f.addLocal("newr", "i32"); - f.addLocal("swp", "i32"); - f.addLocal("x", "i32"); - f.addLocal("signt", "i32"); - f.addLocal("signnewt", "i32"); - f.addLocal("signx", "i32"); - - const c = f.getCodeBuilder(); - - const aux1 = c.i32_const(module.alloc(n8)); - const aux2 = c.i32_const(module.alloc(n8)); - const aux3 = c.i32_const(module.alloc(n8)); - const aux4 = c.i32_const(module.alloc(n8)); - const aux5 = c.i32_const(module.alloc(n8)); - const aux6 = c.i32_const(module.alloc(n8)); - const mulBuff = c.i32_const(module.alloc(n8*2)); - const aux7 = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("t", aux1), - c.call(prefix + "_zero", aux1), - c.setLocal("signt", c.i32_const(0)), - ); + this.s = 0; + let t = sub(this.p, one); - f.addCode( - c.setLocal("r", aux2), - c.call(prefix + "_copy", c.getLocal("pm"), aux2) - ); + while ( !isOdd(t) ) { + this.s = this.s + 1; + t = shiftRight(t, one); + } - f.addCode( - c.setLocal("newt", aux3), - c.call(prefix + "_one", aux3), - c.setLocal("signnewt", c.i32_const(0)), - ); + this.w = []; + this.w[this.s] = this.exp(this.nqr, t); - f.addCode( - c.setLocal("newr", aux4), - c.call(prefix + "_copy", c.getLocal("px"), aux4) - ); + for (let i= this.s-1; i>=0; i--) { + this.w[i] = this.square(this.w[i+1]); + } + if (!this.eq(this.w[0], this.one)) { + throw new Error("Error calculating roots of unity"); + } + this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); + this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); + } - f.addCode(c.setLocal("qq", aux5)); - f.addCode(c.setLocal("qr", aux6)); - f.addCode(c.setLocal("x", aux7)); - - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.call(prefix + "_isZero", c.getLocal("newr") ) - ), - c.call(prefix + "_div", c.getLocal("r"), c.getLocal("newr"), c.getLocal("qq"), c.getLocal("qr")), - - c.call(prefix + "_mul", c.getLocal("qq"), c.getLocal("newt"), mulBuff), - - c.if( - c.getLocal("signt"), - c.if( - c.getLocal("signnewt"), - c.if ( - c.call(prefix + "_gte", mulBuff, c.getLocal("t")), - [ - ...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - [ - ...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ], - ), - [ - ...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ] - ), - c.if( - c.getLocal("signnewt"), - [ - ...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - c.if ( - c.call(prefix + "_gte", c.getLocal("t"), mulBuff), - [ - ...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - [ - ...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ] - ) - ) - ), - - c.setLocal("swp", c.getLocal("t")), - c.setLocal("t", c.getLocal("newt")), - c.setLocal("newt", c.getLocal("x")), - c.setLocal("x", c.getLocal("swp")), - - c.setLocal("signt", c.getLocal("signnewt")), - c.setLocal("signnewt", c.getLocal("signx")), - - c.setLocal("swp", c.getLocal("r")), - c.setLocal("r", c.getLocal("newr")), - c.setLocal("newr", c.getLocal("qr")), - c.setLocal("qr", c.getLocal("swp")), - - c.br(0) - ))); - - f.addCode(c.if( - c.getLocal("signt"), - c.drop(c.call(prefix + "_sub", c.getLocal("pm"), c.getLocal("t"), c.getLocal("pr"))), - c.call(prefix + "_copy", c.getLocal("t"), c.getLocal("pr")) - )); - } - - - buildCopy(); - buildZero(); - buildIsZero(); - buildOne(); - buildEq(); - buildGte(); - buildAdd(); - buildSub(); - buildMul(); - buildSquare(); - buildSquareOld(); - buildDiv(); - buildInverseMod(); - module.exportFunction(prefix+"_copy"); - module.exportFunction(prefix+"_zero"); - module.exportFunction(prefix+"_one"); - module.exportFunction(prefix+"_isZero"); - module.exportFunction(prefix+"_eq"); - module.exportFunction(prefix+"_gte"); - module.exportFunction(prefix+"_add"); - module.exportFunction(prefix+"_sub"); - module.exportFunction(prefix+"_mul"); - module.exportFunction(prefix+"_square"); - module.exportFunction(prefix+"_squareOld"); - module.exportFunction(prefix+"_div"); - module.exportFunction(prefix+"_inverseMod"); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } - This file is part of wasmsnark (Web Assembly zkSnark Prover). + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ + add(a,b) { + return this.op2("_add", a, b); + } -var build_timesscalar = function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) { - const f = module.addFunction(fnName); - f.addParam("base", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLength", "i32"); - f.addParam("r", "i32"); - f.addLocal("i", "i32"); - f.addLocal("b", "i32"); + eq(a,b) { + return this.op2Bool("_eq", a, b); + } - const c = f.getCodeBuilder(); + isZero(a) { + return this.op1Bool("_isZero", a); + } - const aux = c.i32_const(module.alloc(elementLen)); + sub(a,b) { + return this.op2("_sub", a, b); + } - f.addCode( - c.if( - c.i32_eqz(c.getLocal("scalarLength")), - [ - ...c.call(opInit, c.getLocal("r")), - ...c.ret([]) - ] - ) - ); - f.addCode(c.call(opCopy, c.getLocal("base"), aux)); - f.addCode(c.call(opInit, c.getLocal("r"))); - f.addCode(c.setLocal("i", c.getLocal("scalarLength"))); - f.addCode(c.block(c.loop( - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - - c.setLocal( - "b", - c.i32_load8_u( - c.i32_add( - c.getLocal("scalar"), - c.getLocal("i") - ) - ) - ), - ...innerLoop(), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.br(0) - ))); - - - function innerLoop() { - const code = []; - for (let i=0; i<8; i++) { - code.push( - ...c.call(opAA, c.getLocal("r"), c.getLocal("r")), - ...c.if( - c.i32_ge_u( c.getLocal("b"), c.i32_const(0x80 >> i)), - [ - ...c.setLocal( - "b", - c.i32_sub( - c.getLocal("b"), - c.i32_const(0x80 >> i) - ) - ), - ...c.call(opAB, c.getLocal("r"),aux, c.getLocal("r")) - ] - ) - ); - } - return code; + neg(a) { + return this.op1("_neg", a); } -}; + inv(a) { + return this.op1("_inverse", a); + } -var build_batchinverse = buildBatchInverse$3; - -function buildBatchInverse$3(module, prefix) { - - - const n8 = module.modules[prefix].n64*8; - - const f = module.addFunction(prefix+"_batchInverse"); - f.addParam("pIn", "i32"); - f.addParam("inStep", "i32"); - f.addParam("n", "i32"); - f.addParam("pOut", "i32"); - f.addParam("outStep", "i32"); - f.addLocal("itAux", "i32"); - f.addLocal("itIn", "i32"); - f.addLocal("itOut","i32"); - f.addLocal("i","i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - - // Alloc Working space for accumulated umltiplications - f.addCode( - c.setLocal("itAux", c.i32_load( c.i32_const(0) )), - c.i32_store( - c.i32_const(0), - c.i32_add( - c.getLocal("itAux"), - c.i32_mul( - c.i32_add( - c.getLocal("n"), - c.i32_const(1) - ), - c.i32_const(n8) - ) - ) - ) - ); + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } - f.addCode( - - // aux[0] = a; - c.call(prefix+"_one", c.getLocal("itAux")), - // for (i=0;i b ? 1 : -1; -} -function square$1(n) { - return n * n; -} + fromRng(rng) { + let v; + const buff = new Uint8Array(this.n8); + do { + v = zero; + for (let i=0; i 0n; -} + toRprLE(buff, offset, a) { + buff.set(this.fromMontgomery(a), offset); + } -function bitLength$5(n) { - if (isNegative$3(n)) { - return n.toString(2).length - 1; // discard the - sign - } else { - return n.toString(2).length; + toRprBE(buff, offset, a) { + const buff2 = this.fromMontgomery(a); + for (let i=0; i= 0n ? a : -a; - b = b >= 0n ? b : -b; - return a === b ? 0 : a > b ? 1 : -1; -} + const buffChunk = buffIn.slice(i*pointsPerChunk*sIn, i*pointsPerChunk*sIn + n*sIn); + const task = [ + {cmd: "ALLOCSET", var: 0, buff:buffChunk}, + {cmd: "ALLOC", var: 1, len:sOut * n}, + {cmd: "CALL", fnName: this.prefix + "_batchInverse", params: [ + {var: 0}, + {val: sIn}, + {val: n}, + {var: 1}, + {val: sOut}, + ]}, + {cmd: "GET", out: 0, var: 1, len:sOut * n}, + ]; + opPromises.push( + this.tm.queueAction(task, [buffChunk.buffer]) + ); + } -function isDivisibleBy(a, n) { - if (n === 0n) return false; - if (isUnit(n)) return true; - if (compareAbs(n, 2n) === 0) return isEven(a); - return a % n === 0n; -} + const result = await Promise.all(opPromises); -function isBasicPrime(v) { - var n = abs(v); - if (isUnit(n)) return false; - if (n === 2n || n === 3n || n === 5n) return true; - if (isEven(n) || isDivisibleBy(n, 3n) || isDivisibleBy(n, 5n)) return false; - if (n < 49n) return true; - // we don't know if it's prime: let the other functions figure it out -} + let fullBuffOut; + if (buffIn instanceof BigBuffer) { + fullBuffOut = new BigBuffer(nPoints*sOut); + } else { + fullBuffOut = new Uint8Array(nPoints*sOut); + } -function prev(n) { - return n - 1n; -} + let p =0; + for (let i=0; i. -*/ - -const buildInt = build_int; -const utils$5 = utils$6; -const buildExp$2 = build_timesscalar; -const buildBatchInverse$2 = build_batchinverse; -const buildBatchConvertion$1 = build_batchconvertion; -const buildBatchOp = build_batchop; -const { bitLength: bitLength$4, modInv: modInv$2, modPow: modPow$1, isPrime, isOdd: isOdd$3, square } = bigint; - -var build_f1m = function buildF1m(module, _q, _prefix, _intPrefix) { - const q = BigInt(_q); - const n64 = Math.floor((bitLength$4(q - 1n) - 1)/64) +1; - const n32 = n64*2; - const n8 = n64*8; - - const prefix = _prefix || "f1m"; - if (module.modules[prefix]) return prefix; // already builded - - const intPrefix = buildInt(module, n64, _intPrefix); - const pq = module.alloc(n8, utils$5.bigInt2BytesLE(q, n8)); - - const pR2 = module.alloc(utils$5.bigInt2BytesLE(square(1n << BigInt(n64*64)) % q, n8)); - const pOne = module.alloc(utils$5.bigInt2BytesLE((1n << BigInt(n64*64)) % q, n8)); - const pZero = module.alloc(utils$5.bigInt2BytesLE(0n, n8)); - const _minusOne = q - 1n; - const _e = _minusOne >> 1n; // e = (p-1)/2 - const pe = module.alloc(n8, utils$5.bigInt2BytesLE(_e, n8)); - - const _ePlusOne = _e + 1n; // e = (p-1)/2 - const pePlusOne = module.alloc(n8, utils$5.bigInt2BytesLE(_ePlusOne, n8)); - - module.modules[prefix] = { - pq: pq, - pR2: pR2, - n64: n64, - q: q, - pOne: pOne, - pZero: pZero, - pePlusOne: pePlusOne - }; + this.F = F; + this.type = "F2"; + this.m = F.m * 2; + this.n8 = this.F.n8*2; + this.n32 = this.F.n32*2; + this.n64 = this.F.n64*2; - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("pr", "i32"); + this.pOp1 = tm.alloc(F.n8*2); + this.pOp2 = tm.alloc(F.n8*2); + this.pOp3 = tm.alloc(F.n8*2); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = tm.getBuff(this.pOp1, this.n8); - const c = f.getCodeBuilder(); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); - f.addCode(c.call(intPrefix + "_copy", c.i32_const(pOne), c.getLocal("pr"))); } - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.call(intPrefix+"_add", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); } - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.call(intPrefix+"_sub", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), - c.drop(c.call(intPrefix+"_add", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))) - ) - ); + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); } - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(prefix + "_sub", c.i32_const(pZero), c.getLocal("x"), c.getLocal("r")) - ); + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); + add(a,b) { + return this.op2("_add", a, b); + } - const AUX = c.i32_const(module.alloc(n8)); + eq(a,b) { + return this.op2Bool("_eq", a, b); + } - f.addCode( - c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), - c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne) ) - ); + isZero(a) { + return this.op1Bool("_isZero", a); } - function buildSign() { - const f = module.addFunction(prefix+"_sign"); - f.addParam("x", "i32"); - f.setReturnType("i32"); + sub(a,b) { + return this.op2("_sub", a, b); + } - const c = f.getCodeBuilder(); + neg(a) { + return this.op1("_neg", a); + } - const AUX = c.i32_const(module.alloc(n8)); + inv(a) { + return this.op1("_inverse", a); + } - f.addCode( - c.if ( - c.call(intPrefix + "_isZero", c.getLocal("x")), - c.ret(c.i32_const(0)) - ), - c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), - c.if( - c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne)), - c.ret(c.i32_const(-1)) - ), - c.ret(c.i32_const(1)) - ); + isNegative(a) { + return this.op1Bool("_isNegative", a); } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } - function buildMReduct() { - const carries = module.alloc(n32*n32*8); + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } - const f = module.addFunction(prefix+"_mReduct"); - f.addParam("t", "i32"); - f.addParam("r", "i32"); - f.addLocal("np32", "i64"); - f.addLocal("c", "i64"); - f.addLocal("m", "i64"); + mul(a,b) { + return this.op2("_mul", a, b); + } - const c = f.getCodeBuilder(); + mul1(a,b) { + return this.op2("_mul1", a, b); + } - const np32 = Number(0x100000000n - modInv$2(q, 0x100000000n)); + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } - f.addCode(c.setLocal("np32", c.i64_const(np32))); + square(a) { + return this.op1("_square", a); + } - for (let i=0; i=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) - ); - } - [c0, c1] = [c1, c0]; - f.addCode( - c.setLocal(c1, - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ); - } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0) - ) - ); + isZero(a) { + return this.op1Bool("_isZero", a); + } - f.addCode( - c.if( - c.i32_wrap_i64(c.getLocal(c1)), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); + add(a,b) { + return this.op2("_add", a, b); } + sub(a,b) { + return this.op2("_sub", a, b); + } - function buildSquare() { + neg(a) { + return this.op1("_neg", a); + } - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("c0", "i64"); - f.addLocal("c1", "i64"); - f.addLocal("c0_old", "i64"); - f.addLocal("c1_old", "i64"); - f.addLocal("np32", "i64"); + inv(a) { + return this.op1("_inverse", a); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } - for (let i=0;i>1) )&&(i>1, k>>1) - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ) - ); - } - - // Add the old carry - - if (k>0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - c.i64_and( - c.getLocal(c0_old), - c.i64_const(0xFFFFFFFF) - ), - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ), - c.getLocal(c1_old) - ) - ) - ); - } - - - for (let i=Math.max(1, k-n32+1); (i<=k)&&(i=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) - ); - } - f.addCode( - c.setLocal( - c0_old, - c.getLocal(c1) - ), - c.setLocal( - c1_old, - c.i64_shr_u( - c.getLocal(c0_old), - c.i64_const(32) - ) - ) - ); + e(a, b) { + if (a instanceof Uint8Array) return a; + if ((Array.isArray(a)) && (a.length == 3)) { + const c1 = this.F.e(a[0], b); + const c2 = this.F.e(a[1], b); + const c3 = this.F.e(a[2], b); + const res = new Uint8Array(this.F.n8*3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8*2); + return res; + } else { + throw new Error("invalid F3"); } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0_old) - ) - ); - - f.addCode( - c.if( - c.i32_wrap_i64(c.getLocal(c1_old)), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); } - - function buildSquareOld() { - const f = module.addFunction(prefix+"_squareOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); + toString(a, radix) { + const s1 = this.F.toString(a.slice(0, this.F.n8), radix); + const s2 = this.F.toString(a.slice(this.F.n8, this.F.n8*2), radix); + const s3 = this.F.toString(a.slice(this.F.n8*2), radix); + return `[${s1}, ${s2}, ${s3}]`; } - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(prefix+"_mul", c.getLocal("x"), c.i32_const(pR2), c.getLocal("r"))); + fromRng(rng) { + const c1 = this.F.fromRng(rng); + const c2 = this.F.fromRng(rng); + const c3 = this.F.fromRng(rng); + const res = new Uint8Array(this.F.n8*3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8*2); + return res; } - function buildFromMontgomery() { - - const pAux2 = module.alloc(n8*2); - - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(intPrefix + "_copy", c.getLocal("x"), c.i32_const(pAux2) )); - f.addCode(c.call(intPrefix + "_zero", c.i32_const(pAux2 + n8) )); - f.addCode(c.call(prefix+"_mReduct", c.i32_const(pAux2), c.getLocal("r"))); + random() { + return this.fromRng(getThreadRng()); } - function buildInverse() { - - const f = module.addFunction(prefix+ "_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(prefix + "_fromMontgomery", c.getLocal("x"), c.getLocal("r"))); - f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))); - f.addCode(c.call(prefix + "_toMontgomery", c.getLocal("r"), c.getLocal("r"))); + toObject(a) { + const c1 = this.F.toObject(a.slice(0, this.F.n8)); + const c2 = this.F.toObject(a.slice(this.F.n8, this.F.n8*2)); + const c3 = this.F.toObject(a.slice(this.F.n8*2, this.F.n8*3)); + return [c1, c2, c3]; } - // Calculate various valuse needed for sqrt - - - let _nqr = 2n; - if (isPrime(q)) { - while (modPow$1(_nqr, _e, q) !== _minusOne) _nqr = _nqr + 1n; + fromObject(a) { + const buff = new Uint8Array(this.F.n8*3); + const b1 = this.F.fromObject(a[0]); + const b2 = this.F.fromObject(a[1]); + const b3 = this.F.fromObject(a[2]); + buff.set(b1); + buff.set(b2, this.F.n8); + buff.set(b3, this.F.n8*2); + return buff; } - let s2 = 0; - let _t = _minusOne; - - while ((!isOdd$3(_t))&&(_t !== 0n)) { - s2++; - _t = _t >> 1n; + c1(a) { + return a.slice(0, this.F.n8); } - const pt = module.alloc(n8, utils$5.bigInt2BytesLE(_t, n8)); - const _nqrToT = modPow$1(_nqr, _t, q); - const pNqrToT = module.alloc(utils$5.bigInt2BytesLE((_nqrToT << BigInt(n64*64)) % q, n8)); - - const _tPlusOneOver2 = (_t + 1n) >> 1n; - const ptPlusOneOver2 = module.alloc(n8, utils$5.bigInt2BytesLE(_tPlusOneOver2, n8)); - - function buildSqrt() { - - const f = module.addFunction(prefix+ "_sqrt"); - f.addParam("n", "i32"); - f.addParam("r", "i32"); - f.addLocal("m", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - - const c = f.getCodeBuilder(); - - const ONE = c.i32_const(pOne); - const C = c.i32_const(module.alloc(n8)); - const T = c.i32_const(module.alloc(n8)); - const R = c.i32_const(module.alloc(n8)); - const SQ = c.i32_const(module.alloc(n8)); - const B = c.i32_const(module.alloc(n8)); - - f.addCode( + c2(a) { + return a.slice(this.F.n8, this.F.n8*2); + } - // If (n==0) return 0 - c.if( - c.call(prefix + "_isZero", c.getLocal("n")), - c.ret( - c.call(prefix + "_zero", c.getLocal("r")) - ) - ), + c3(a) { + return a.slice(this.F.n8*2); + } - c.setLocal("m", c.i32_const(s2)), - c.call(prefix + "_copy", c.i32_const(pNqrToT), C), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pt), c.i32_const(n8), T), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(ptPlusOneOver2), c.i32_const(n8), R), +} - c.block(c.loop( - c.br_if(1, c.call(prefix + "_eq", T, ONE)), +class WasmCurve { - c.call(prefix + "_square", T, SQ), - c.setLocal("i", c.i32_const(1)), - c.block(c.loop( - c.br_if(1, c.call(prefix + "_eq", SQ, ONE)), - c.call(prefix + "_square", SQ, SQ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), + constructor(tm, prefix, F, pGen, pGb, cofactor) { + this.tm = tm; + this.prefix = prefix; + this.F = F; - c.call(prefix + "_copy", C, B), - c.setLocal("j", c.i32_sub(c.i32_sub( c.getLocal("m"), c.getLocal("i")), c.i32_const(1)) ), - c.block(c.loop( - c.br_if(1, c.i32_eqz(c.getLocal("j"))), - c.call(prefix + "_square", B, B), - c.setLocal("j", c.i32_sub(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), + this.pOp1 = tm.alloc(F.n8*3); + this.pOp2 = tm.alloc(F.n8*3); + this.pOp3 = tm.alloc(F.n8*3); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = this.tm.getBuff(this.pOp1, F.n8*3); + this.tm.instance.exports[prefix + "_zeroAffine"](this.pOp1); + this.zeroAffine = this.tm.getBuff(this.pOp1, F.n8*2); + this.one = this.tm.getBuff(pGen, F.n8*3); + this.g = this.one; + this.oneAffine = this.tm.getBuff(pGen, F.n8*2); + this.gAffine = this.oneAffine; + this.b = this.tm.getBuff(pGb, F.n8); - c.setLocal("m", c.getLocal("i")), - c.call(prefix + "_square", B, C), - c.call(prefix + "_mul", T, C, T), - c.call(prefix + "_mul", R, B, R), + if (cofactor) { + this.cofactor = toLEBuff(cofactor); + } - c.br(0) - )), + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); - c.if( - c.call(prefix + "_isNegative", R), - c.call(prefix + "_neg", R, c.getLocal("r")), - c.call(prefix + "_copy", R, c.getLocal("r")), - ) - ); + this.batchLEMtoC = buildBatchConvert(tm, prefix + "_batchLEMtoC", F.n8*2, F.n8); + this.batchLEMtoU = buildBatchConvert(tm, prefix + "_batchLEMtoU", F.n8*2, F.n8*2); + this.batchCtoLEM = buildBatchConvert(tm, prefix + "_batchCtoLEM", F.n8, F.n8*2); + this.batchUtoLEM = buildBatchConvert(tm, prefix + "_batchUtoLEM", F.n8*2, F.n8*2); + this.batchToJacobian = buildBatchConvert(tm, prefix + "_batchToJacobian", F.n8*2, F.n8*3); + this.batchToAffine = buildBatchConvert(tm, prefix + "_batchToAffine", F.n8*3, F.n8*2); } - function buildIsSquare() { - const f = module.addFunction(prefix+"_isSquare"); - f.addParam("n", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const ONE = c.i32_const(pOne); - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("n")), - c.ret(c.i32_const(1)) - ), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pe), c.i32_const(n8), AUX), - c.call(prefix + "_eq", AUX, ONE) - ); + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8*3); } - - function buildLoad() { - const f = module.addFunction(prefix+"_load"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - f.addLocal("p", "i32"); - f.addLocal("l", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - const c = f.getCodeBuilder(); - - const R = c.i32_const(module.alloc(n8)); - const pAux = module.alloc(n8); - const AUX = c.i32_const(pAux); - - f.addCode( - c.call(intPrefix + "_zero", c.getLocal("r")), - c.setLocal("i", c.i32_const(n8)), - c.setLocal("p", c.getLocal("scalar")), - c.block(c.loop( - c.br_if(1, c.i32_gt_u(c.getLocal("i"), c.getLocal("scalarLen"))), - - c.if( - c.i32_eq(c.getLocal("i"), c.i32_const(n8)), - c.call(prefix + "_one", R), - c.call(prefix + "_mul", R, c.i32_const(pR2), R) - ), - c.call(prefix + "_mul", c.getLocal("p"), R, AUX), - c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r")), - - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(n8))), - c.br(0) - )), - - c.setLocal("l", c.i32_rem_u( c.getLocal("scalarLen"), c.i32_const(n8))), - c.if(c.i32_eqz(c.getLocal("l")), c.ret([])), - c.call(intPrefix + "_zero", AUX), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("l"))), - - c.i32_store8( - c.getLocal("j"), - pAux, - c.i32_load8_u(c.getLocal("p")), - ), - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(1))), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.if( - c.i32_eq(c.getLocal("i"), c.i32_const(n8)), - c.call(prefix + "_one", R), - c.call(prefix + "_mul", R, c.i32_const(pR2), R) - ), - c.call(prefix + "_mul", AUX, R, AUX), - c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r")), - ); + op2bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); } - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call(prefix + "_load", c.getLocal("scalar"), c.getLocal("scalarLen"), AUX), - c.call(prefix + "_toMontgomery", AUX, AUX), - c.call(prefix + "_mul", c.getLocal("x"), AUX, c.getLocal("r")), - ); + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8*3); } - function buildIsOne() { - const f = module.addFunction(prefix+"_isOne"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - f.addCode( - c.ret(c.call(intPrefix + "_eq", c.getLocal("x"), c.i32_const(pOne))) - ); + op1Affine(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8*2); } - - module.exportFunction(intPrefix + "_copy", prefix+"_copy"); - module.exportFunction(intPrefix + "_zero", prefix+"_zero"); - module.exportFunction(intPrefix + "_isZero", prefix+"_isZero"); - module.exportFunction(intPrefix + "_eq", prefix+"_eq"); - - buildIsOne(); - buildAdd(); - buildSub(); - buildNeg(); - buildMReduct(); - buildMul(); - buildSquare(); - buildSquareOld(); - buildToMontgomery(); - buildFromMontgomery(); - buildIsNegative(); - buildSign(); - buildInverse(); - buildOne(); - buildLoad(); - buildTimesScalar(); - buildBatchInverse$2(module, prefix); - buildBatchConvertion$1(module, prefix + "_batchToMontgomery", prefix + "_toMontgomery", n8, n8); - buildBatchConvertion$1(module, prefix + "_batchFromMontgomery", prefix + "_fromMontgomery", n8, n8); - buildBatchConvertion$1(module, prefix + "_batchNeg", prefix + "_neg", n8, n8); - buildBatchOp(module, prefix + "_batchAdd", prefix + "_add", n8, n8); - buildBatchOp(module, prefix + "_batchSub", prefix + "_sub", n8, n8); - buildBatchOp(module, prefix + "_batchMul", prefix + "_mul", n8, n8); - - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_isNegative"); - module.exportFunction(prefix + "_isOne"); - module.exportFunction(prefix + "_sign"); - module.exportFunction(prefix + "_mReduct"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_squareOld"); - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_inverse"); - module.exportFunction(prefix + "_one"); - module.exportFunction(prefix + "_load"); - module.exportFunction(prefix + "_timesScalar"); - buildExp$2( - module, - prefix + "_exp", - n8, - prefix + "_mul", - prefix + "_square", - intPrefix + "_copy", - prefix + "_one", - ); - module.exportFunction(prefix + "_exp"); - module.exportFunction(prefix + "_batchInverse"); - if (isPrime(q)) { - buildSqrt(); - buildIsSquare(); - module.exportFunction(prefix + "_sqrt"); - module.exportFunction(prefix + "_isSquare"); - } - module.exportFunction(prefix + "_batchToMontgomery"); - module.exportFunction(prefix + "_batchFromMontgomery"); - // console.log(module.functionIdxByName); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildF1m$2 =build_f1m; -const { bitLength: bitLength$3 } = bigint; - -var build_f1 = function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) { - - const q = BigInt(_q); - const n64 = Math.floor((bitLength$3(q - 1n) - 1)/64) +1; - const n8 = n64*8; - - const prefix = _prefix || "f1"; - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = { - n64: n64 - }; - - const intPrefix = _intPrefix || "int"; - const f1mPrefix = buildF1m$2(module, q, _f1mPrefix, intPrefix); - - - const pR2 = module.modules[f1mPrefix].pR2; - const pq = module.modules[f1mPrefix].pq; - const pePlusOne = module.modules[f1mPrefix].pePlusOne; - - function buildMul() { - const pAux1 = module.alloc(n8); - - const f = module.addFunction(prefix+ "_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(f1mPrefix + "_mul", c.getLocal("x"), c.getLocal("y"), c.i32_const(pAux1))); - f.addCode(c.call(f1mPrefix + "_mul", c.i32_const(pAux1), c.i32_const(pR2), c.getLocal("r"))); + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); } - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); + add(a,b) { + if (a.byteLength == this.F.n8*3) { + if (b.byteLength == this.F.n8*3) { + return this.op2("_add", a, b); + } else if (b.byteLength == this.F.n8*2) { + return this.op2("_addMixed", a, b); + } else { + throw new Error("invalid point size"); + } + } else if (a.byteLength == this.F.n8*2) { + if (b.byteLength == this.F.n8*3) { + return this.op2("_addMixed", b, a); + } else if (b.byteLength == this.F.n8*2) { + return this.op2("_addAffine", a, b); + } else { + throw new Error("invalid point size"); + } + } else { + throw new Error("invalid point size"); + } } - - function buildInverse() { - - const f = module.addFunction(prefix+ "_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("x"), c.i32_const(pq), c.getLocal("r"))); + sub(a,b) { + if (a.byteLength == this.F.n8*3) { + if (b.byteLength == this.F.n8*3) { + return this.op2("_sub", a, b); + } else if (b.byteLength == this.F.n8*2) { + return this.op2("_subMixed", a, b); + } else { + throw new Error("invalid point size"); + } + } else if (a.byteLength == this.F.n8*2) { + if (b.byteLength == this.F.n8*3) { + return this.op2("_subMixed", b, a); + } else if (b.byteLength == this.F.n8*2) { + return this.op2("_subAffine", a, b); + } else { + throw new Error("invalid point size"); + } + } else { + throw new Error("invalid point size"); + } } - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(intPrefix + "_gte", c.getLocal("x"), c.i32_const(pePlusOne) ) - ); + neg(a) { + if (a.byteLength == this.F.n8*3) { + return this.op1("_neg", a); + } else if (a.byteLength == this.F.n8*2) { + return this.op1Affine("_negAffine", a); + } else { + throw new Error("invalid point size"); + } } - - buildMul(); - buildSquare(); - buildInverse(); - buildIsNegative(); - module.exportFunction(f1mPrefix + "_add", prefix + "_add"); - module.exportFunction(f1mPrefix + "_sub", prefix + "_sub"); - module.exportFunction(f1mPrefix + "_neg", prefix + "_neg"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_inverse"); - module.exportFunction(prefix + "_isNegative"); - module.exportFunction(f1mPrefix + "_copy", prefix+"_copy"); - module.exportFunction(f1mPrefix + "_zero", prefix+"_zero"); - module.exportFunction(f1mPrefix + "_one", prefix+"_one"); - module.exportFunction(f1mPrefix + "_isZero", prefix+"_isZero"); - module.exportFunction(f1mPrefix + "_eq", prefix+"_eq"); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildExp$1 = build_timesscalar; -const buildBatchInverse$1 = build_batchinverse; -const utils$4 = utils$6; - -var build_f2m = function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { - - if (module.modules[prefix]) return prefix; // already builded - - const f1n8 = module.modules[f1mPrefix].n64*8; - const q = module.modules[f1mPrefix].q; - - module.modules[prefix] = { - n64: module.modules[f1mPrefix].n64*2 - }; - - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_add", x0, y0, r0), - c.call(f1mPrefix+"_add", x1, y1, r1), - ); + double(a) { + if (a.byteLength == this.F.n8*3) { + return this.op1("_double", a); + } else if (a.byteLength == this.F.n8*2) { + return this.op1("_doubleAffine", a); + } else { + throw new Error("invalid point size"); + } } - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), - c.call(f1mPrefix+"_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1), - ); + isZero(a) { + if (a.byteLength == this.F.n8*3) { + return this.op1Bool("_isZero", a); + } else if (a.byteLength == this.F.n8*2) { + return this.op1Bool("_isZeroAffine", a); + } else { + throw new Error("invalid point size"); + } } - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_sub", x0, y0, r0), - c.call(f1mPrefix+"_sub", x1, y1, r1), - ); + timesScalar(a, s) { + if (!(s instanceof Uint8Array)) { + s = toLEBuff(e(s)); + } + let fnName; + if (a.byteLength == this.F.n8*3) { + fnName = this.prefix + "_timesScalar"; + } else if (a.byteLength == this.F.n8*2) { + fnName = this.prefix + "_timesScalarAffine"; + } else { + throw new Error("invalid point size"); + } + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, s.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8*3); } - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_neg", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - ); + timesFr(a, s) { + let fnName; + if (a.byteLength == this.F.n8*3) { + fnName = this.prefix + "_timesFr"; + } else if (a.byteLength == this.F.n8*2) { + fnName = this.prefix + "_timesFrAffine"; + } else { + throw new Error("invalid point size"); + } + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8*3); } - function buildConjugate() { - const f = module.addFunction(prefix+"_conjugate"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - ); + eq(a,b) { + if (a.byteLength == this.F.n8*3) { + if (b.byteLength == this.F.n8*3) { + return this.op2bool("_eq", a, b); + } else if (b.byteLength == this.F.n8*2) { + return this.op2bool("_eqMixed", a, b); + } else { + throw new Error("invalid point size"); + } + } else if (a.byteLength == this.F.n8*2) { + if (b.byteLength == this.F.n8*3) { + return this.op2bool("_eqMixed", b, a); + } else if (b.byteLength == this.F.n8*2) { + return this.op2bool("_eqAffine", a, b); + } else { + throw new Error("invalid point size"); + } + } else { + throw new Error("invalid point size"); + } } - - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.if( - c.call(f1mPrefix+"_isZero", x1), - c.ret(c.call(f1mPrefix+"_isNegative", x0)) - ), - c.ret(c.call(f1mPrefix+"_isNegative", x1)) - ); + toAffine(a) { + if (a.byteLength == this.F.n8*3) { + return this.op1Affine("_toAffine", a); + } else if (a.byteLength == this.F.n8*2) { + return a; + } else { + throw new Error("invalid point size"); + } } - function buildMul() { - const f = module.addFunction(prefix+"_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - const A = c.i32_const(module.alloc(f1n8)); - const B = c.i32_const(module.alloc(f1n8)); - const C = c.i32_const(module.alloc(f1n8)); - const D = c.i32_const(module.alloc(f1n8)); - - - f.addCode( - c.call(f1mPrefix + "_mul", x0, y0, A), // A = x0*y0 - c.call(f1mPrefix + "_mul", x1, y1, B), // B = x1*y1 - - c.call(f1mPrefix + "_add", x0, x1, C), // C = x0 + x1 - c.call(f1mPrefix + "_add", y0, y1, D), // D = y0 + y1 - c.call(f1mPrefix + "_mul", C, D, C), // C = (x0 + x1)*(y0 + y1) = x0*y0+x0*y1+x1*y0+x1*y1 - - // c.call(f1mPrefix + "_mul", B, c.i32_const(pNonResidue), r0), // r0 = nr*(x1*y1) - c.call(mulNonResidueFn, B, r0), // r0 = nr*(x1*y1) - c.call(f1mPrefix + "_add", A, r0, r0), // r0 = x0*y0 + nr*(x1*y1) - c.call(f1mPrefix + "_add", A, B, r1), // r1 = x0*y0+x1*y1 - c.call(f1mPrefix + "_sub", C, r1, r1) // r1 = x0*y0+x0*y1+x1*y0+x1*y1 - x0*y0+x1*y1 = x0*y1+x1*y0 - ); + toJacobian(a) { + if (a.byteLength == this.F.n8*3) { + return a; + } else if (a.byteLength == this.F.n8*2) { + return this.op1("_toJacobian", a); + } else { + throw new Error("invalid point size"); + } + } + toRprUncompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8*3) { + this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + } else if (a.byteLength != this.F.n8*2) { + throw new Error("invalid point size"); + } + this.tm.instance.exports[this.prefix + "_LEMtoU"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8*2); + arr.set(res, offset); } - function buildMul1() { - const f = module.addFunction(prefix+"_mul1"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); + fromRprUncompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8*2); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_UtoLEM"](this.pOp1, this.pOp1); + return this.tm.getBuff(this.pOp1, this.F.n8*2); + } - const c = f.getCodeBuilder(); + toRprCompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8*3) { + this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + } else if (a.byteLength != this.F.n8*2) { + throw new Error("invalid point size"); + } + this.tm.instance.exports[this.prefix + "_LEMtoC"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8); + arr.set(res, offset); + } - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y = c.getLocal("y"); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + fromRprCompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_CtoLEM"](this.pOp1, this.pOp2); + return this.tm.getBuff(this.pOp2, this.F.n8*2); + } + toUncompressed(a) { + const buff = new Uint8Array(this.F.n8*2); + this.toRprUncompressed(buff, 0, a); + return buff; + } - f.addCode( - c.call(f1mPrefix + "_mul", x0, y, r0), // A = x0*y - c.call(f1mPrefix + "_mul", x1, y, r1), // B = x1*y - ); + toRprLEM(arr, offset, a) { + if (a.byteLength == this.F.n8*2) { + arr.set(a, offset); + return; + } else if (a.byteLength == this.F.n8*3) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8*2); + arr.set(res, offset); + } else { + throw new Error("invalid point size"); + } } - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); + fromRprLEM(arr, offset) { + offset = offset || 0; + return arr.slice(offset, offset+this.F.n8*2); + } - const c = f.getCodeBuilder(); + toString(a, radix) { + if (a.byteLength == this.F.n8*3) { + const x = this.F.toString(a.slice(0, this.F.n8), radix); + const y = this.F.toString(a.slice(this.F.n8, this.F.n8*2), radix); + const z = this.F.toString(a.slice(this.F.n8*2), radix); + return `[ ${x}, ${y}, ${z} ]`; + } else if (a.byteLength == this.F.n8*2) { + const x = this.F.toString(a.slice(0, this.F.n8), radix); + const y = this.F.toString(a.slice(this.F.n8), radix); + return `[ ${x}, ${y} ]`; + } else { + throw new Error("invalid point size"); + } + } - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); + isValid(a) { + if (this.isZero(a)) return true; + const F = this.F; + const aa = this.toAffine(a); + const x = aa.slice(0, this.F.n8); + const y = aa.slice(this.F.n8, this.F.n8*2); + const x3b = F.add(F.mul(F.square(x),x), this.b); + const y2 = F.square(y); + return F.eq(x3b, y2); + } - const AB = c.i32_const(module.alloc(f1n8)); - const APB = c.i32_const(module.alloc(f1n8)); - const APNB = c.i32_const(module.alloc(f1n8)); - const ABPNAB = c.i32_const(module.alloc(f1n8)); + fromRng(rng) { + const F = this.F; + let P = []; + let greatest; + let x3b; + do { + P[0] = F.fromRng(rng); + greatest = rng.nextBool(); + x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + } while (!F.isSquare(x3b)); + P[1] = F.sqrt(x3b); - f.addCode( - // AB = x0*y1 - c.call(f1mPrefix + "_mul", x0, x1, AB), + const s = F.isNegative(P[1]); + if (greatest ^ s) P[1] = F.neg(P[1]); - // APB = x0+y1 - c.call(f1mPrefix + "_add", x0, x1, APB), + let Pbuff = new Uint8Array(this.F.n8*2); + Pbuff.set(P[0]); + Pbuff.set(P[1], this.F.n8); - // APBN0 = x0 + nr*x1 - c.call(mulNonResidueFn, x1, APNB), - c.call(f1mPrefix + "_add", x0, APNB, APNB), + if (this.cofactor) { + Pbuff = this.timesScalar(Pbuff, this.cofactor); + } - // ABPNAB = ab + nr*ab - c.call(mulNonResidueFn, AB, ABPNAB), - c.call(f1mPrefix + "_add", ABPNAB, AB, ABPNAB), + return Pbuff; + } - // r0 = APB * APNB - ABPNAB - c.call(f1mPrefix + "_mul", APB, APNB, r0), - c.call(f1mPrefix + "_sub", r0, ABPNAB, r0), - // r1 = AB + AB - c.call(f1mPrefix + "_add", AB, AB, r1), - ); + toObject(a) { + if (this.isZero(a)) { + return [ + this.F.toObject(this.F.zero), + this.F.toObject(this.F.one), + this.F.toObject(this.F.zero), + ]; + } + const x = this.F.toObject(a.slice(0, this.F.n8)); + const y = this.F.toObject(a.slice(this.F.n8, this.F.n8*2)); + let z; + if (a.byteLength == this.F.n8*3) { + z = this.F.toObject(a.slice(this.F.n8*2, this.F.n8*3)); + } else { + z = this.F.toObject(this.F.one); + } + return [x, y, z]; } - - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_toMontgomery", x0, r0), - c.call(f1mPrefix+"_toMontgomery", x1, r1) - ); - } - - function buildFromMontgomery() { - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_fromMontgomery", x0, r0), - c.call(f1mPrefix+"_fromMontgomery", x1, r1) - ); + fromObject(a) { + const x = this.F.fromObject(a[0]); + const y = this.F.fromObject(a[1]); + let z; + if (a.length==3) { + z = this.F.fromObject(a[2]); + } else { + z = this.F.one; + } + if (this.F.isZero(z, this.F.one)) { + return this.zeroAffine; + } else if (this.F.eq(z, this.F.one)) { + const buff = new Uint8Array(this.F.n8*2); + buff.set(x); + buff.set(y, this.F.n8); + return buff; + } else { + const buff = new Uint8Array(this.F.n8*3); + buff.set(x); + buff.set(y, this.F.n8); + buff.set(z, this.F.n8*2); + return buff; + } } - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_copy", x1, r1) - ); + e(a) { + if (a instanceof Uint8Array) return a; + return this.fromObject(a); } - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_zero", x0), - c.call(f1mPrefix+"_zero", x1) - ); + x(a) { + const tmp = this.toAffine(a); + return tmp.slice(0, this.F.n8); } - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_one", x0), - c.call(f1mPrefix+"_zero", x1) - ); + y(a) { + const tmp = this.toAffine(a); + return tmp.slice(this.F.n8); } - function buildEq() { - const f = module.addFunction(prefix+"_eq"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - - f.addCode( - c.i32_and( - c.call(f1mPrefix+"_eq", x0, y0), - c.call(f1mPrefix+"_eq", x1, y1) - ) - ); - } +} - function buildIsZero() { - const f = module.addFunction(prefix+"_isZero"); - f.addParam("x", "i32"); - f.setReturnType("i32"); +function thread(self) { + const MAXMEM = 32767; + let instance; + let memory; + let batchFns = null; // batch-affine MSM entry points (per-group wrappers) + let terminationTimer; - const c = f.getCodeBuilder(); + async function init(data) { + let wasmModule; + if (data.code instanceof WebAssembly.Module) { + wasmModule = data.code; + } else { + const code = new Uint8Array(data.code); + wasmModule = await WebAssembly.compile(code); + } + memory = new WebAssembly.Memory({initial:data.init, maximum: MAXMEM}); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); + instance = await WebAssembly.instantiate(wasmModule, { + env: { + "memory": memory + } + }); - f.addCode( - c.i32_and( - c.call(f1mPrefix+"_isZero", x0), - c.call(f1mPrefix+"_isZero", x1) - ) - ); + // Optional batch-affine MSM helper module. It is curve-independent: + // it imports the base-field/group ops from the main instance and works + // on the same memory, so one binary serves G1 (f1m/g1m) and, over the + // quadratic extension, G2 (f2m/g2m). Instantiated once per group. + if (data.batchCode) { + let batchModule; + if (data.batchCode instanceof WebAssembly.Module) { + batchModule = data.batchCode; + } else { + batchModule = await WebAssembly.compile(new Uint8Array(data.batchCode)); + } + const ex = instance.exports; + const mkBatch = async (f, g, conj) => (await WebAssembly.instantiate(batchModule, { + env: { "memory": memory }, + curve: { + f_mul: ex[f + "_mul"], f_square: ex[f + "_square"], f_add: ex[f + "_add"], + f_sub: ex[f + "_sub"], f_neg: ex[f + "_neg"], f_inverse: ex[f + "_inverse"], + f_isZero: ex[f + "_isZero"], f_conj: ex[conj], + g_add: ex[g + "_add"], g_addMixed: ex[g + "_addMixed"], + g_double: ex[g + "_double"], g_zero: ex[g + "_zero"], g_isZero: ex[g + "_isZero"], + }, + })).exports; + const n8f = data.n8f; + batchFns = {}; + if (ex.f1m_mul && ex.g1m_addMixed) { + // f_conj is only used by the G2 GLS path; wire a harmless copy for G1 + const b = await mkBatch("f1m", "g1m", "f1m_copy"); + // GLV path (bn254 G1 endomorphism) when the curve advertises it; + // the wasm falls back internally for unexpected sizes. + const useGlv = data.glv && b.multiexpAffineGLV; + const fn = useGlv ? b.multiexpAffineGLV : b.multiexpAffine; + batchFns["g1m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn(pB, pS, sS, n, pr, n8f); + // NoGlv variant, selectable per call ({glv: "disabled"} option) + batchFns["g1m_multiexpAffineBatchNoGlv"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f); + } + if (ex.f2m_mul && ex.g2m_addMixed) { + const b = await mkBatch("f2m", "g2m", "f2m_conjugate"); + // GLS (bn254 G2 endomorphism) when the curve advertises it; the + // wasm gates internally on chunk size and falls back to batch. + // The NoGls variant is selectable per call ({gls:false} option). + const useGls = data.glv && b.multiexpAffineGLS; + const fn2 = useGls ? b.multiexpAffineGLS : b.multiexpAffine; + batchFns["g2m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn2(pB, pS, sS, n, pr, n8f * 2); + batchFns["g2m_multiexpAffineBatchNoGls"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f * 2); + } + } } - function buildInverse() { - const f = module.addFunction(prefix+"_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - const c = f.getCodeBuilder(); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - const t0 = c.i32_const(module.alloc(f1n8)); - const t1 = c.i32_const(module.alloc(f1n8)); - const t2 = c.i32_const(module.alloc(f1n8)); - const t3 = c.i32_const(module.alloc(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_square", x0, t0), - c.call(f1mPrefix+"_square", x1, t1), - // c.call(f1mPrefix+"_mul", t1, c.i32_const(pNonResidue), t2), - c.call(mulNonResidueFn, t1, t2), - - c.call(f1mPrefix+"_sub", t0, t2, t2), - c.call(f1mPrefix+"_inverse", t2, t3), - - c.call(f1mPrefix+"_mul", x0, t3, r0), - c.call(f1mPrefix+"_mul", x1, t3, r1), - c.call(f1mPrefix+"_neg", r1, r1), - ); + // Reverse the low `bits` of a 32-bit integer (O(1) bit-twiddle). + function rev32(x) { + x = ((x & 0x55555555) << 1) | ((x >>> 1) & 0x55555555); + x = ((x & 0x33333333) << 2) | ((x >>> 2) & 0x33333333); + x = ((x & 0x0f0f0f0f) << 4) | ((x >>> 4) & 0x0f0f0f0f); + x = ((x & 0x00ff00ff) << 8) | ((x >>> 8) & 0x00ff00ff); + x = (x << 16) | (x >>> 16); + return x >>> 0; + } + + // In-place bit-reversal permutation of fixed-size (sIn-byte) elements. + // Works for any element size, like the old pure-JS buffReverseBits. When + // the elements are 4-byte aligned it swaps Uint32Array lanes (no BigInt + // boxing, no allocation); otherwise it falls back to a byte-wise swap with + // a single reused temp buffer. Either way it touches no WASM linear memory. + function reverseInPlace(u8, sIn, bits) { + const n = u8.byteLength / sIn; + const shift = 32 - bits; + if (((sIn & 3) === 0) && ((u8.byteOffset & 3) === 0)) { + const lanes = sIn >>> 2; + const u32 = new Uint32Array(u8.buffer, u8.byteOffset, u8.byteLength >>> 2); + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + let a = i * lanes; + let b = ri * lanes; + for (let l = 0; l < lanes; l++) { + const t = u32[a + l]; + u32[a + l] = u32[b + l]; + u32[b + l] = t; + } + } + } + } else { + const tmp = new Uint8Array(sIn); // one reused temp, not one per swap + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + const ao = i * sIn; + const bo = ri * sIn; + tmp.set(u8.subarray(ao, ao + sIn)); + u8.copyWithin(ao, bo, bo + sIn); + u8.set(tmp, bo); + } + } + } } - - function buildSign() { - const f = module.addFunction(prefix+"_sign"); - f.addParam("x", "i32"); - f.addLocal("s", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.setLocal("s" , c.call( f1mPrefix + "_sign", x1)), - c.if( - c.getLocal("s"), - c.ret(c.getLocal("s")) - ), - c.ret(c.call( f1mPrefix + "_sign", x0)) - ); + function alloc(length) { + const u32 = new Uint32Array(memory.buffer, 0, 1); + while (u32[0] & 3) u32[0]++; // Return always aligned pointers + const res = u32[0]; + u32[0] += length; + if (u32[0] + length > memory.buffer.byteLength) { + const currentPages = memory.buffer.byteLength / 0x10000; + let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1; + if (requiredPages>MAXMEM) requiredPages=MAXMEM; + memory.grow(requiredPages-currentPages); + } + return res; } - function buildIsOne() { - const f = module.addFunction(prefix+"_isOne"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.ret(c.i32_and( - c.call(f1mPrefix + "_isOne", x0), - c.call(f1mPrefix + "_isZero", x1), - )) - ); + function allocBuffer(buffer) { + const p = alloc(buffer.byteLength); + setBuffer(p, buffer); + return p; } - - // Check here: https://eprint.iacr.org/2012/685.pdf - // Alg 9adj - function buildSqrt() { - - const f = module.addFunction(prefix+"_sqrt"); - f.addParam("a", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - // BigInt can't take `undefined` so we use `|| 0` - const e34 = c.i32_const(module.alloc(utils$4.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 ))); - // BigInt can't take `undefined` so we use `|| 0` - const e12 = c.i32_const(module.alloc(utils$4.bigInt2BytesLE((BigInt(q || 0) - 1n) / 2n, f1n8 ))); - - const a = c.getLocal("a"); - const a1 = c.i32_const(module.alloc(f1n8*2)); - const alpha = c.i32_const(module.alloc(f1n8*2)); - const a0 = c.i32_const(module.alloc(f1n8*2)); - const pn1 = module.alloc(f1n8*2); - const n1 = c.i32_const(pn1); - const n1a = c.i32_const(pn1); - const n1b = c.i32_const(pn1+f1n8); - const x0 = c.i32_const(module.alloc(f1n8*2)); - const b = c.i32_const(module.alloc(f1n8*2)); - - f.addCode( - - c.call(prefix + "_one", n1), - c.call(prefix + "_neg", n1, n1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_square", a1, alpha), - c.call(prefix + "_mul", a, alpha, alpha), - - // const a0 = F.mul(F.frobenius(1, alfa), alfa); - c.call(prefix + "_conjugate", alpha, a0), - c.call(prefix + "_mul", a0, alpha, a0), - - // if (F.eq(a0, F.negone)) return null; - c.if(c.call(prefix + "_eq",a0,n1), c.unreachable() ), - - // const x0 = F.mul(a1, a); - c.call(prefix + "_mul", a1, a, x0), - - // if (F.eq(alfa, F.negone)) { - c.if( - c.call(prefix + "_eq", alpha, n1), - [ - // x = F.mul(x0, [F.F.zero, F.F.one]); - ...c.call(f1mPrefix + "_zero", n1a), - ...c.call(f1mPrefix + "_one", n1b), - ...c.call(prefix + "_mul", n1, x0, c.getLocal("pr")), - ], - [ - // const b = F.pow(F.add(F.one, alfa), F.sqrt_e12); - ...c.call(prefix + "_one", b), - ...c.call(prefix + "_add", b, alpha, b), - ...c.call(prefix + "_exp", b, e12, c.i32_const(f1n8), b), - - // x = F.mul(b, x0); - ...c.call(prefix + "_mul", b, x0, c.getLocal("pr")), - ] - ) - ); - + function getBuffer(pointer, length) { + return new Uint8Array(memory.buffer, pointer, length); } - - function buildIsSquare() { - - const f = module.addFunction(prefix+"_isSquare"); - f.addParam("a", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - // BigInt can't take `undefined` so we use `|| 0` - const e34 = c.i32_const(module.alloc(utils$4.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 ))); - - const a = c.getLocal("a"); - const a1 = c.i32_const(module.alloc(f1n8*2)); - const alpha = c.i32_const(module.alloc(f1n8*2)); - const a0 = c.i32_const(module.alloc(f1n8*2)); - const pn1 = module.alloc(f1n8*2); - const n1 = c.i32_const(pn1); - - f.addCode( - - c.call(prefix + "_one", n1), - c.call(prefix + "_neg", n1, n1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_square", a1, alpha), - c.call(prefix + "_mul", a, alpha, alpha), - - // const a0 = F.mul(F.frobenius(1, alfa), alfa); - c.call(prefix + "_conjugate", alpha, a0), - c.call(prefix + "_mul", a0, alpha, a0), - - // if (F.eq(a0, F.negone)) return null; - c.if( - c.call( - prefix + "_eq", - a0, - n1 - ), - c.ret(c.i32_const(0)) - ), - c.ret(c.i32_const(1)) - ); - + function setBuffer(pointer, buffer) { + const u8 = new Uint8Array(memory.buffer); + u8.set(new Uint8Array(buffer), pointer); } + function runTask(task) { + clearTimeout(terminationTimer); + if (task[0].cmd === "INIT") { + return init(task[0]); + } + const ctx = { + vars: [], + out: [] + }; + const u32a = new Uint32Array(memory.buffer, 0, 1); + const oldAlloc = u32a[0]; + for (let i=0; i plain + // in-module variant when the batch module is unavailable + // (same 5-arg signature) + if (!fn) { + const base = fname.replace(/Batch(NoGls|NoGlv)?$/, ""); + fn = instance.exports[base]; + } + } + fn(...params); + } + break; + } + case "GET": + ctx.out[task[i].out] = getBuffer(ctx.vars[task[i].var], task[i].len).slice(); + break; + default: + throw new Error("Invalid cmd"); + } + } + const u32b = new Uint32Array(memory.buffer, 0, 1); + u32b[0] = oldAlloc; - buildIsZero(); - buildIsOne(); - buildZero(); - buildOne(); - buildCopy(); - buildMul(); - buildMul1(); - buildSquare(); - buildAdd(); - buildSub(); - buildNeg(); - buildConjugate(); - buildToMontgomery(); - buildFromMontgomery(); - buildEq(); - buildInverse(); - buildTimesScalar(); - buildSign(); - buildIsNegative(); - - module.exportFunction(prefix + "_isZero"); - module.exportFunction(prefix + "_isOne"); - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_one"); - module.exportFunction(prefix + "_copy"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_mul1"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_sign"); - module.exportFunction(prefix + "_conjugate"); - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_eq"); - module.exportFunction(prefix + "_inverse"); - buildBatchInverse$1(module, prefix); - buildExp$1( - module, - prefix + "_exp", - f1n8*2, - prefix + "_mul", - prefix + "_square", - prefix + "_copy", - prefix + "_one", - ); - buildSqrt(); - buildIsSquare(); - - module.exportFunction(prefix + "_exp"); - module.exportFunction(prefix + "_timesScalar"); - module.exportFunction(prefix + "_batchInverse"); - module.exportFunction(prefix + "_sqrt"); - module.exportFunction(prefix + "_isSquare"); - module.exportFunction(prefix + "_isNegative"); - + return ctx.out; + } - return prefix; -}; + return runTask; +} /* Copyright 2019 0KIMS association. @@ -6272,11789 +4483,1785 @@ var build_f2m = function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { along with wasmsnark. If not, see . */ -const buildExp = build_timesscalar; -const buildBatchInverse = build_batchinverse; - -var build_f3m = function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) { - - if (module.modules[prefix]) return prefix; // already builded +// const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) +const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) - const f1n8 = module.modules[f1mPrefix].n64*8; - module.modules[prefix] = { - n64: module.modules[f1mPrefix].n64*3 - }; +// Robust Node detection that never throws (unlike `true`, which is a +// webpack-ism and is undefined under Vite/esbuild/SES). +const isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_add", x0, y0, r0), - c.call(f1mPrefix+"_add", x1, y1, r1), - c.call(f1mPrefix+"_add", x2, y2, r2), - ); +class Deferred { + constructor() { + this.promise = new Promise((resolve, reject)=> { + this.reject = reject; + this.resolve = resolve; + }); } +} - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), - c.call(f1mPrefix+"_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1), - c.call(f1mPrefix+"_timesScalar", x2, c.getLocal("scalar"), c.getLocal("scalarLen"), r2), - ); +// WorkerSlot holds the native Worker and all per-worker state. +// Each call to startWorker() creates a fresh WorkerSlot instance. +// Message handlers close over the slot reference so that stale messages +// from a replaced worker are detected by a simple identity check +// (tm.pool[i] !== slot). +class WorkerSlot { + constructor(worker) { + this.worker = worker; // native Worker thread + this.initialized = false; + this.initializing= false; + this.working = false; + this.pendingDeferred = null; + this.onMsg = null; // stored so removeEventListener can be called on termination + this.onError = null; } +} - - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_sub", x0, y0, r0), - c.call(f1mPrefix+"_sub", x1, y1, r1), - c.call(f1mPrefix+"_sub", x2, y2, r2), - ); +// Computed lazily on first worker creation, NOT at module load: a SES +// hardened realm (which runs single-threaded) has no Blob/btoa/URL.createObjectURL, and +// touching them at import time would throw before a curve could even be built. +let workerSource; +function getWorkerSource() { + if (workerSource !== undefined) return workerSource; + const threadStr = `(${"function thread(self) {\n const MAXMEM = 32767;\n let instance;\n let memory;\n let batchFns = null; // batch-affine MSM entry points (per-group wrappers)\n let terminationTimeout = 1500; // milliseconds\n let terminationTimer;\n\n if (self) {\n self.onmessage = function(e) {\n let data;\n if (e.data) {\n data = e.data;\n } else {\n data = e;\n }\n\n try {\n if (data[0].cmd === \"INIT\") {\n init(data[0]).then(function() {\n self.postMessage({status: \"initialized\"});\n // Start idle timer only after init completes so it never\n // fires during async WASM compilation.\n scheduleTermination();\n });\n return; // skip the scheduleTermination() call at the bottom\n } else if (data[0].cmd === \"TERMINATE\") {\n terminate();\n } else {\n let terminateAfterTask = false;\n if (data[data.length-1].cmd === \"TERMINATE\") {\n terminateAfterTask = true;\n data.pop();\n }\n const res = runTask(data);\n let transfers = [];\n for (let i=0; i (await WebAssembly.instantiate(batchModule, {\n env: { \"memory\": memory },\n curve: {\n f_mul: ex[f + \"_mul\"], f_square: ex[f + \"_square\"], f_add: ex[f + \"_add\"],\n f_sub: ex[f + \"_sub\"], f_neg: ex[f + \"_neg\"], f_inverse: ex[f + \"_inverse\"],\n f_isZero: ex[f + \"_isZero\"], f_conj: ex[conj],\n g_add: ex[g + \"_add\"], g_addMixed: ex[g + \"_addMixed\"],\n g_double: ex[g + \"_double\"], g_zero: ex[g + \"_zero\"], g_isZero: ex[g + \"_isZero\"],\n },\n })).exports;\n const n8f = data.n8f;\n batchFns = {};\n if (ex.f1m_mul && ex.g1m_addMixed) {\n // f_conj is only used by the G2 GLS path; wire a harmless copy for G1\n const b = await mkBatch(\"f1m\", \"g1m\", \"f1m_copy\");\n // GLV path (bn254 G1 endomorphism) when the curve advertises it;\n // the wasm falls back internally for unexpected sizes.\n const useGlv = data.glv && b.multiexpAffineGLV;\n const fn = useGlv ? b.multiexpAffineGLV : b.multiexpAffine;\n batchFns[\"g1m_multiexpAffineBatch\"] = (pB, pS, sS, n, pr) => fn(pB, pS, sS, n, pr, n8f);\n // NoGlv variant, selectable per call ({glv: \"disabled\"} option)\n batchFns[\"g1m_multiexpAffineBatchNoGlv\"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f);\n }\n if (ex.f2m_mul && ex.g2m_addMixed) {\n const b = await mkBatch(\"f2m\", \"g2m\", \"f2m_conjugate\");\n // GLS (bn254 G2 endomorphism) when the curve advertises it; the\n // wasm gates internally on chunk size and falls back to batch.\n // The NoGls variant is selectable per call ({gls:false} option).\n const useGls = data.glv && b.multiexpAffineGLS;\n const fn2 = useGls ? b.multiexpAffineGLS : b.multiexpAffine;\n batchFns[\"g2m_multiexpAffineBatch\"] = (pB, pS, sS, n, pr) => fn2(pB, pS, sS, n, pr, n8f * 2);\n batchFns[\"g2m_multiexpAffineBatchNoGls\"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f * 2);\n }\n }\n\n if (data.terminationTimeout) {\n terminationTimeout = data.terminationTimeout;\n }\n }\n\n\n\n // Reverse the low `bits` of a 32-bit integer (O(1) bit-twiddle).\n function rev32(x) {\n x = ((x & 0x55555555) << 1) | ((x >>> 1) & 0x55555555);\n x = ((x & 0x33333333) << 2) | ((x >>> 2) & 0x33333333);\n x = ((x & 0x0f0f0f0f) << 4) | ((x >>> 4) & 0x0f0f0f0f);\n x = ((x & 0x00ff00ff) << 8) | ((x >>> 8) & 0x00ff00ff);\n x = (x << 16) | (x >>> 16);\n return x >>> 0;\n }\n\n // In-place bit-reversal permutation of fixed-size (sIn-byte) elements.\n // Works for any element size, like the old pure-JS buffReverseBits. When\n // the elements are 4-byte aligned it swaps Uint32Array lanes (no BigInt\n // boxing, no allocation); otherwise it falls back to a byte-wise swap with\n // a single reused temp buffer. Either way it touches no WASM linear memory.\n function reverseInPlace(u8, sIn, bits) {\n const n = u8.byteLength / sIn;\n const shift = 32 - bits;\n if (((sIn & 3) === 0) && ((u8.byteOffset & 3) === 0)) {\n const lanes = sIn >>> 2;\n const u32 = new Uint32Array(u8.buffer, u8.byteOffset, u8.byteLength >>> 2);\n for (let i = 0; i < n; i++) {\n const ri = rev32(i) >>> shift;\n if (i < ri) {\n let a = i * lanes;\n let b = ri * lanes;\n for (let l = 0; l < lanes; l++) {\n const t = u32[a + l];\n u32[a + l] = u32[b + l];\n u32[b + l] = t;\n }\n }\n }\n } else {\n const tmp = new Uint8Array(sIn); // one reused temp, not one per swap\n for (let i = 0; i < n; i++) {\n const ri = rev32(i) >>> shift;\n if (i < ri) {\n const ao = i * sIn;\n const bo = ri * sIn;\n tmp.set(u8.subarray(ao, ao + sIn));\n u8.copyWithin(ao, bo, bo + sIn);\n u8.set(tmp, bo);\n }\n }\n }\n }\n\n function alloc(length) {\n const u32 = new Uint32Array(memory.buffer, 0, 1);\n while (u32[0] & 3) u32[0]++; // Return always aligned pointers\n const res = u32[0];\n u32[0] += length;\n if (u32[0] + length > memory.buffer.byteLength) {\n const currentPages = memory.buffer.byteLength / 0x10000;\n let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1;\n if (requiredPages>MAXMEM) requiredPages=MAXMEM;\n memory.grow(requiredPages-currentPages);\n }\n return res;\n }\n\n function allocBuffer(buffer) {\n const p = alloc(buffer.byteLength);\n setBuffer(p, buffer);\n return p;\n }\n\n function getBuffer(pointer, length) {\n return new Uint8Array(memory.buffer, pointer, length);\n }\n\n function setBuffer(pointer, buffer) {\n const u8 = new Uint8Array(memory.buffer);\n u8.set(new Uint8Array(buffer), pointer);\n }\n\n function runTask(task) {\n clearTimeout(terminationTimer);\n if (task[0].cmd === \"INIT\") {\n return init(task[0]);\n }\n const ctx = {\n vars: [],\n out: []\n };\n const u32a = new Uint32Array(memory.buffer, 0, 1);\n const oldAlloc = u32a[0];\n for (let i=0; i plain\n // in-module variant when the batch module is unavailable\n // (same 5-arg signature)\n if (!fn) {\n const base = fname.replace(/Batch(NoGls|NoGlv)?$/, \"\");\n fn = instance.exports[base];\n }\n }\n fn(...params);\n }\n break;\n }\n case \"GET\":\n ctx.out[task[i].out] = getBuffer(ctx.vars[task[i].var], task[i].len).slice();\n break;\n default:\n throw new Error(\"Invalid cmd\");\n }\n }\n const u32b = new Uint32Array(memory.buffer, 0, 1);\n u32b[0] = oldAlloc;\n\n return ctx.out;\n }\n\n function scheduleTermination() {\n clearTimeout(terminationTimer);\n if (terminationTimeout > 0) {\n terminationTimer = setTimeout(() => {\n // 2-phase termination: notify main thread first; close only after\n // it acks with TERMINATE. This prevents the race where the main\n // thread dispatches a task to a worker that has already closed.\n if (self) self.postMessage({status: \"want_to_terminate\"});\n }, terminationTimeout);\n }\n }\n\n function terminate() {\n clearTimeout(terminationTimer);\n if (self) {\n self.postMessage({status: \"terminated\"});\n self.close();\n }\n }\n\n return runTask;\n}"})(self)`; + if (isNode) { + workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); + } else if (globalThis?.Blob && globalThis.URL && globalThis.URL.createObjectURL) { + const threadBytes = new TextEncoder().encode(threadStr); + const workerBlob = new Blob([threadBytes], { type: "application/javascript" }); + workerSource = URL.createObjectURL(workerBlob); + } else { + workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); } + return workerSource; +} - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - f.addCode( - c.call(f1mPrefix+"_neg", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - c.call(f1mPrefix+"_neg", x2, r2), - ); - } +async function buildThreadManager(wasm, singleThread) { + const tm = new ThreadManager(); - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); + tm.memory = new WebAssembly.Memory({initial:MEM_SIZE}); + tm.u8 = new Uint8Array(tm.memory.buffer); + tm.u32 = new Uint32Array(tm.memory.buffer); - const c = f.getCodeBuilder(); + const wasmModule = await WebAssembly.compile(wasm.code); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); + tm.instance = await WebAssembly.instantiate(wasmModule, { + env: { + "memory": tm.memory + } + }); - f.addCode( - c.if( - c.call(f1mPrefix+"_isZero", x2), - c.if( - c.call(f1mPrefix+"_isZero", x1), - c.ret(c.call(f1mPrefix+"_isNegative", x0)), - c.ret(c.call(f1mPrefix+"_isNegative", x1)) - ) - ), - c.ret(c.call(f1mPrefix+"_isNegative", x2)) - ); + // Force single-thread when no Worker is available. Covers SES hardened realms + // (no Worker, frozen globals) and old/limited browsers, regardless of what + // the caller requested -- the worker path (and getWorkerSource's + // Blob/btoa) would otherwise fail. Node uses the web-worker import, so it + // keeps multi-threading. + if(!isNode && !globalThis?.Worker) { + singleThread = true; } + tm.singleThread = singleThread; + tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. + tm.pq = wasm.pq; + tm.pr = wasm.pr; + tm.pG1gen = wasm.pG1gen; + tm.pG1zero = wasm.pG1zero; + tm.pG2gen = wasm.pG2gen; + tm.pG2zero = wasm.pG2zero; + tm.pOneT = wasm.pOneT; - function buildMul() { - const f = module.addFunction(prefix+"_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const cd = f.getCodeBuilder(); - - const a = cd.getLocal("x"); - const b = cd.i32_add(cd.getLocal("x"), cd.i32_const(f1n8)); - const c = cd.i32_add(cd.getLocal("x"), cd.i32_const(2*f1n8)); - const A = cd.getLocal("y"); - const B = cd.i32_add(cd.getLocal("y"), cd.i32_const(f1n8)); - const C = cd.i32_add(cd.getLocal("y"), cd.i32_const(2*f1n8)); - const r0 = cd.getLocal("r"); - const r1 = cd.i32_add(cd.getLocal("r"), cd.i32_const(f1n8)); - const r2 = cd.i32_add(cd.getLocal("r"), cd.i32_const(2*f1n8)); - - const aA = cd.i32_const(module.alloc(f1n8)); - const bB = cd.i32_const(module.alloc(f1n8)); - const cC = cd.i32_const(module.alloc(f1n8)); - const a_b = cd.i32_const(module.alloc(f1n8)); - const A_B = cd.i32_const(module.alloc(f1n8)); - const a_c = cd.i32_const(module.alloc(f1n8)); - const A_C = cd.i32_const(module.alloc(f1n8)); - const b_c = cd.i32_const(module.alloc(f1n8)); - const B_C = cd.i32_const(module.alloc(f1n8)); - const aA_bB = cd.i32_const(module.alloc(f1n8)); - const aA_cC = cd.i32_const(module.alloc(f1n8)); - const bB_cC = cd.i32_const(module.alloc(f1n8)); - const AUX = cd.i32_const(module.alloc(f1n8)); - - - f.addCode( - cd.call(f1mPrefix + "_mul", a, A, aA), - cd.call(f1mPrefix + "_mul", b, B, bB), - cd.call(f1mPrefix + "_mul", c, C, cC), - - cd.call(f1mPrefix + "_add", a, b, a_b), - cd.call(f1mPrefix + "_add", A, B, A_B), - cd.call(f1mPrefix + "_add", a, c, a_c), - cd.call(f1mPrefix + "_add", A, C, A_C), - cd.call(f1mPrefix + "_add", b, c, b_c), - cd.call(f1mPrefix + "_add", B, C, B_C), - - cd.call(f1mPrefix + "_add", aA, bB, aA_bB), - cd.call(f1mPrefix + "_add", aA, cC, aA_cC), - cd.call(f1mPrefix + "_add", bB, cC, bB_cC), - - cd.call(f1mPrefix + "_mul", b_c, B_C, r0), - cd.call(f1mPrefix + "_sub", r0, bB_cC, r0), - cd.call(mulNonResidueFn, r0, r0), - cd.call(f1mPrefix + "_add", aA, r0, r0), - - cd.call(f1mPrefix + "_mul", a_b, A_B, r1), - cd.call(f1mPrefix + "_sub", r1, aA_bB, r1), - cd.call(mulNonResidueFn, cC, AUX), - cd.call(f1mPrefix + "_add", r1, AUX, r1), - - cd.call(f1mPrefix + "_mul", a_c, A_C, r2), - cd.call(f1mPrefix + "_sub", r2, aA_cC, r2), - cd.call(f1mPrefix + "_add", r2, bB, r2), - ); - - } - - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const A = c.getLocal("x"); - const B = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const C = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - const s0 = c.i32_const(module.alloc(f1n8)); - const ab = c.i32_const(module.alloc(f1n8)); - const s1 = c.i32_const(module.alloc(f1n8)); - const s2 = c.i32_const(module.alloc(f1n8)); - const bc = c.i32_const(module.alloc(f1n8)); - const s3 = c.i32_const(module.alloc(f1n8)); - const s4 = c.i32_const(module.alloc(f1n8)); - + tm.code = wasm.code; + tm.wasmModule = wasmModule; + // Batch-affine MSM helper module (optional): compiled once, shipped to every + // worker alongside the main module. n8f = base-field element size in bytes. + tm.batchCode = wasm.batchCode; + tm.batchWasmModule = wasm.batchCode ? await WebAssembly.compile(wasm.batchCode) : undefined; + tm.n8f = wasm.n8q; + tm.glv = !!wasm.glv; - f.addCode( + if (singleThread) { + tm.taskManager = thread(); + await tm.taskManager([{ + cmd: "INIT", + init: MEM_SIZE, + code: tm.code.slice(), + batchCode: tm.batchCode ? tm.batchCode.slice() : undefined, + n8f: tm.n8f, + glv: tm.glv + }]); + tm.concurrency = 1; + } else { + // pool[i] is the active WorkerSlot at slot i, or null if the slot is empty. + tm.pool = []; - c.call(f1mPrefix + "_square", A, s0), - c.call(f1mPrefix + "_mul", A, B, ab), - c.call(f1mPrefix + "_add", ab, ab, s1), + let concurrency = 2; + if (typeof navigator === "object" && navigator.hardwareConcurrency) { + concurrency = navigator.hardwareConcurrency; + } else if (os && os.cpus) { + concurrency = os.cpus().length; + } - c.call(f1mPrefix + "_sub", A, B, s2), - c.call(f1mPrefix + "_add", s2, C, s2), - c.call(f1mPrefix + "_square", s2, s2), + if(concurrency === 0){ + concurrency = 2; + } - c.call(f1mPrefix + "_mul", B, C, bc), - c.call(f1mPrefix + "_add", bc, bc, s3), + // Limit to 64 threads for memory reasons. + if (concurrency>64) concurrency=64; + tm.concurrency = concurrency; + } + return tm; +} - c.call(f1mPrefix + "_square", C, s4), +class ThreadManager { + constructor() { + this.actionQueue = []; + this.oldPFree = 0; + } - c.call(mulNonResidueFn, s3, r0), - c.call(f1mPrefix + "_add", s0, r0, r0), + // Build the message handler for a specific WorkerSlot. + // All state reads/writes go through `slot`; the stale check + // `tm.pool[slotIndex] !== slot` discards messages from replaced workers. + _makeOnMsg(slotIndex, slot) { + const tm = this; + return async function(e) { + const data = (e && e.data) ? e.data : e; + + // Stale check: if pool[slotIndex] no longer points to this slot, + // the message is from a worker that was already replaced. + if (tm.pool[slotIndex] !== slot) { + if (data.status === "terminated") { + // Break the reference cycle so the slot and its WASM memory + // can be collected immediately rather than waiting for GC. + slot.worker.removeEventListener("message", slot.onMsg); + slot.worker.removeEventListener("error", slot.onError); + return; + } + if (!data.status && slot.working) { + // Stale task result: the slot was replaced (want_to_terminate raced + // with a task dispatch — pool[i] was nulled before the result came + // back). The result is still valid; resolve so the caller doesn't hang. + slot.working = false; + slot.pendingDeferred.resolve(data); + } + await tm.processWorks(); + return; + } - c.call(mulNonResidueFn, s4, r1), - c.call(f1mPrefix + "_add", s1, r1, r1), + if (data.error) { + slot.working = false; + slot.pendingDeferred.reject(new Error("Worker error: " + data.error)); + if (slot.initializing) { + slot.initializing = false; + tm.pool[slotIndex] = null; + } + throw new Error("Worker error: " + data.error); + } - c.call(f1mPrefix + "_add", s0, s4, r2), - c.call(f1mPrefix + "_sub", s3, r2, r2), - c.call(f1mPrefix + "_add", s2, r2, r2), - c.call(f1mPrefix + "_add", s1, r2, r2), - ); + if (data.status) { + if (data.status === "initialized") { + slot.initializing = false; + slot.initialized = true; + + } else if (data.status === "want_to_terminate") { + // 2-phase termination: the worker is idle and asking to close. + // Release the slot immediately so processWorks can fill it with a + // fresh worker if the queue needs one. The TERMINATE ack is sent + // to the old worker so it can close cleanly; its later "terminated" + // message will be stale (pool[slotIndex] !== slot) and ignored. + tm.pool[slotIndex] = null; + slot.worker.postMessage([{cmd: "TERMINATE"}]); + await tm.processWorks(); + return; + + } else if (data.status === "terminated") { + // Worker has fully closed. For the 2-phase path the slot was + // already nulled in want_to_terminate, so this message arrives + // stale and is handled above. For a direct TERMINATE + // (tm.terminate() at proof end) we clean up here. + slot.worker.removeEventListener("message", slot.onMsg); + slot.worker.removeEventListener("error", slot.onError); + tm.pool[slotIndex] = null; + if (slot.working) { + // Safety net: reject the pending deferred so the caller + // surfaces an error instead of hanging. + slot.pendingDeferred.reject( + new Error(`Worker at slot ${slotIndex} terminated unexpectedly while processing task`) + ); + slot.working = false; + } + return; + } + // fall through for "initialized" so the INIT deferred is resolved below + } + slot.working = false; + slot.pendingDeferred.resolve(data); + await tm.processWorks(); + }; } + _makeOnError(slotIndex, slot) { + const tm = this; + return function(e) { + if (tm.pool[slotIndex] === slot) { + slot.working = false; + slot.initialized = false; + if (slot.pendingDeferred) { + slot.pendingDeferred.reject(new Error("Worker error: " + e.message)); + } + } + throw new Error("Worker error: " + e.message); + }; + } - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); + startWorker(slotIndex) { + const nativeWorker = new Worker(getWorkerSource()); + const slot = new WorkerSlot(nativeWorker); + this.pool[slotIndex] = slot; - const c = f.getCodeBuilder(); + slot.onMsg = this._makeOnMsg(slotIndex, slot); + slot.onError = this._makeOnError(slotIndex, slot); + nativeWorker.addEventListener("message", slot.onMsg); + nativeWorker.addEventListener("error", slot.onError); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); + slot.initializing = true; - f.addCode( - c.call(f1mPrefix+"_toMontgomery", x0, r0), - c.call(f1mPrefix+"_toMontgomery", x1, r1), - c.call(f1mPrefix+"_toMontgomery", x2, r2) - ); + // postAction sets slot.working = true synchronously before any await, + // so processWorks will not attempt to start this slot again. + this.postAction(slotIndex, [{ + cmd: "INIT", + init: MEM_SIZE, + code: this.wasmModule, + batchCode: this.batchWasmModule, + n8f: this.n8f, + glv: this.glv, + }]).then(() => { + slot.initialized = true; + }); } - function buildFromMontgomery() { - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_fromMontgomery", x0, r0), - c.call(f1mPrefix+"_fromMontgomery", x1, r1), - c.call(f1mPrefix+"_fromMontgomery", x2, r2) - ); + startSyncOp() { + if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); + this.oldPFree = this.u32[0]; } - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); + endSyncOp() { + if (this.oldPFree === 0) throw new Error("No sync operation in progress"); + this.u32[0] = this.oldPFree; + this.oldPFree = 0; + } - const c = f.getCodeBuilder(); + async postAction(slotIndex, e, transfers, _deferred) { + const slot = this.pool[slotIndex]; + if (!slot || slot.working) { + throw new Error("Posting a job to a working worker"); + } + slot.working = true; + slot.pendingDeferred = _deferred ? _deferred : new Deferred(); + await slot.worker.postMessage(e, transfers); + return slot.pendingDeferred.promise; + } - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); + async processWorks() { + // Dispatch queued tasks to ready workers. + for (let i = 0; i < this.concurrency && this.actionQueue.length > 0; i++) { + const slot = this.pool[i]; + if (slot && slot.initialized && !slot.working) { + const work = this.actionQueue.shift(); + await this.postAction(i, work.data, work.transfers, work.deferred); + } + } - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_copy", x1, r1), - c.call(f1mPrefix+"_copy", x2, r2), - ); + // Start new workers for slots that need them. + if (this.actionQueue.length > 0) { + let initializingCount = 0; + for (let i = 0; i < this.concurrency; i++) { + const slot = this.pool[i]; + if (slot) { + if (slot.initializing) initializingCount++; + // slot exists: skip whether initialized, initializing, or working + continue; + } + // slot is null: this slot is available to host a new worker + if (initializingCount >= this.actionQueue.length) break; + initializingCount++; + this.startWorker(i); + } + } } - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); + async queueAction(actionData, transfers) { + const d = new Deferred(); - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); + if (this.singleThread) { + const res = this.taskManager(actionData); + d.resolve(res); + } else { + this.actionQueue.push({ + data: actionData, + transfers: transfers, + deferred: d + }); + await this.processWorks(); + } + return d.promise; + } - f.addCode( - c.call(f1mPrefix+"_zero", x0), - c.call(f1mPrefix+"_zero", x1), - c.call(f1mPrefix+"_zero", x2), - ); + resetMemory() { + this.u32[0] = this.initalPFree; } - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("x", "i32"); + allocBuff(buff) { + const pointer = this.alloc(buff.byteLength); + this.setBuff(pointer, buff); + return pointer; + } - const c = f.getCodeBuilder(); + getBuff(pointer, length) { + return this.u8.slice(pointer, pointer + length); + } - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); + setBuff(pointer, buffer) { + this.u8.set(new Uint8Array(buffer), pointer); + } - f.addCode( - c.call(f1mPrefix+"_one", x0), - c.call(f1mPrefix+"_zero", x1), - c.call(f1mPrefix+"_zero", x2), - ); + alloc(length) { + while (this.u32[0] & 3) this.u32[0]++; // Return always aligned pointers + const res = this.u32[0]; + this.u32[0] += length; + return res; } - function buildEq() { - const f = module.addFunction(prefix+"_eq"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - - f.addCode( - c.i32_and( - c.i32_and( - c.call(f1mPrefix+"_eq", x0, y0), - c.call(f1mPrefix+"_eq", x1, y1), - ), - c.call(f1mPrefix+"_eq", x2, y2) - ) - ); + async terminate() { + for (let i = 0; i < this.pool.length; i++) { + if (this.pool[i]) { + this.pool[i].worker.postMessage([{cmd: "TERMINATE"}]); + } + } } - function buildIsZero() { - const f = module.addFunction(prefix+"_isZero"); - f.addParam("x", "i32"); - f.setReturnType("i32"); +} - const c = f.getCodeBuilder(); +function buildBatchApplyKey(curve, groupName) { + const G = curve[groupName]; + const Fr = curve.Fr; + const tm = curve.tm; - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); + curve[groupName].batchApplyKey = async function(buff, first, inc, inType, outType) { + inType = inType || "affine"; + outType = outType || "affine"; + let fnName, fnAffine; + let sGin, sGmid, sGout; + if (groupName == "G1") { + if (inType == "jacobian") { + sGin = G.F.n8*3; + fnName = "g1m_batchApplyKey"; + } else { + sGin = G.F.n8*2; + fnName = "g1m_batchApplyKeyMixed"; + } + sGmid = G.F.n8*3; + if (outType == "jacobian") { + sGout = G.F.n8*3; + } else { + fnAffine = "g1m_batchToAffine"; + sGout = G.F.n8*2; + } + } else if (groupName == "G2") { + if (inType == "jacobian") { + sGin = G.F.n8*3; + fnName = "g2m_batchApplyKey"; + } else { + sGin = G.F.n8*2; + fnName = "g2m_batchApplyKeyMixed"; + } + sGmid = G.F.n8*3; + if (outType == "jacobian") { + sGout = G.F.n8*3; + } else { + fnAffine = "g2m_batchToAffine"; + sGout = G.F.n8*2; + } + } else if (groupName == "Fr") { + fnName = "frm_batchApplyKey"; + sGin = G.n8; + sGmid = G.n8; + sGout = G.n8; + } else { + throw new Error("Invalid group: " + groupName); + } + const nPoints = Math.floor(buff.byteLength / sGin); + const pointsPerChunk = Math.floor(nPoints/tm.concurrency); + const opPromises = []; + inc = Fr.e(inc); + let t = Fr.e(first); + for (let i=0; i. -*/ - -var build_timesscalarnaf = function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) { - - const f = module.addFunction(fnName); - f.addParam("base", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLength", "i32"); - f.addParam("r", "i32"); - f.addLocal("old0", "i32"); - f.addLocal("nbits", "i32"); - f.addLocal("i", "i32"); - f.addLocal("last", "i32"); - f.addLocal("cur", "i32"); - f.addLocal("carry", "i32"); - f.addLocal("p", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(elementLen)); - - function getBit(IDX) { - return c.i32_and( - c.i32_shr_u( - c.i32_load( - c.i32_add( - c.getLocal("scalar"), - c.i32_and( - c.i32_shr_u( - IDX, - c.i32_const(3) - ), - c.i32_const(0xFFFFFFFC) - ) - ) - ), - c.i32_and( - IDX, - c.i32_const(0x1F) - ) - ), - c.i32_const(1) - ); - } + const g1Buff = curve.G1.toJacobian(arguments[i*2]); + task.push({cmd: "ALLOCSET", var: 0, buff: g1Buff}); + task.push({cmd: "ALLOC", var: 1, len: curve.prePSize}); - function pushBit(b) { - return [ - ...c.i32_store8( - c.getLocal("p"), - c.i32_const(b) - ), - ...c.setLocal( - "p", - c.i32_add( - c.getLocal("p"), - c.i32_const(1) - ) - ) - ]; - } + const g2Buff = curve.G2.toJacobian(arguments[i*2 +1]); + task.push({cmd: "ALLOCSET", var: 2, buff: g2Buff}); + task.push({cmd: "ALLOC", var: 3, len: curve.preQSize}); - f.addCode( - c.if( - c.i32_eqz(c.getLocal("scalarLength")), - [ - ...c.call(opInit, c.getLocal("r")), - ...c.ret([]) - ] - ), - c.setLocal("nbits", c.i32_shl(c.getLocal("scalarLength"), c.i32_const(3))), - c.setLocal("old0", c.i32_load(c.i32_const(0))), - c.setLocal("p", c.getLocal("old0")), - c.i32_store( - c.i32_const(0), - c.i32_and( - c.i32_add( - c.i32_add( - c.getLocal("old0"), - c.i32_const(32) - ), - c.getLocal("nbits") - ), - c.i32_const(0xFFFFFFF8) - ) - ), - c.setLocal("i", c.i32_const(1)), - - c.setLocal("last",getBit(c.i32_const(0))), - c.setLocal("carry",c.i32_const(0)), - - c.block(c.loop( - c.br_if(1, c.i32_eq( c.getLocal("i"), c.getLocal("nbits"))), - - c.setLocal("cur", getBit(c.getLocal("i"))), - c.if( c.getLocal("last"), - c.if( c.getLocal("cur"), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(1) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(255) - ], - ), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(255) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(1) - ], - ), - ), - c.if( c.getLocal("cur"), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(0) - ] - , - [ - ...c.setLocal("last", c.i32_const(1)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ], - ), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(1)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ], - ), - ) - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - - c.if( c.getLocal("last"), - c.if(c.getLocal("carry"), - [ - ...pushBit(255), - ...pushBit(0), - ...pushBit(1) - ] - , - [ - ...pushBit(1) - ], - ), - c.if(c.getLocal("carry"), - [ - ...pushBit(0), - ...pushBit(1) - ] - ), - ), + task.push({cmd: "ALLOC", var: 4, len: curve.Gt.n8}); - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), + task.push({cmd: "CALL", fnName: curve.name + "_prepareG1", params: [ + {var: 0}, + {var: 1} + ]}); - // p already points to the last bit + task.push({cmd: "CALL", fnName: curve.name + "_prepareG2", params: [ + {var: 2}, + {var: 3} + ]}); - c.call(opCopy, c.getLocal("base"), aux), + task.push({cmd: "CALL", fnName: curve.name + "_millerLoop", params: [ + {var: 1}, + {var: 3}, + {var: 4} + ]}); - c.call(opInit, c.getLocal("r")), + task.push({cmd: "GET", out: 0, var: 4, len: curve.Gt.n8}); - c.block(c.loop( + // Do NOT transfer g1Buff/g2Buff: toJacobian() returns its argument + // unreplaced when the point is already in jacobian form, so these may + // alias caller-owned buffers (e.g. curve.G1.g / curve.G2.g). + // Transferring would detach them on the main thread. They are single + // points, so the structured-clone copy is negligible. + opPromises.push( + tm.queueAction(task) + ); + } - c.call(opAA, c.getLocal("r"), c.getLocal("r")), + const result = await Promise.all(opPromises); + tm.startSyncOp(); + const pRes = tm.alloc(curve.Gt.n8); + tm.instance.exports.ftm_one(pRes); - c.setLocal("cur", - c.i32_load8_u( - c.getLocal("p") - ) - ), + for (let i=0; i. -*/ +function buildMultiexp(curve, groupName) { + const G = curve[groupName]; + const tm = G.tm; -var build_multiexp = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { - - const n64g = module.modules[prefix].n64; - const n8g = n64g*8; - - function buildGetChunk() { - const f = module.addFunction(fnName + "_getChunk"); - f.addParam("pScalar", "i32"); - f.addParam("scalarSize", "i32"); // Number of bytes of the scalar - f.addParam("startBit", "i32"); // Bit to start extract - f.addParam("chunkSize", "i32"); // Chunk size in bits - f.addLocal("bitsToEnd", "i32"); - f.addLocal("mask", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("bitsToEnd", - c.i32_sub( - c.i32_mul( - c.getLocal("scalarSize"), - c.i32_const(8) - ), - c.getLocal("startBit") - ) - ), - c.if( - c.i32_gt_s( - c.getLocal("chunkSize"), - c.getLocal("bitsToEnd") - ), - c.setLocal( - "mask", - c.i32_sub( - c.i32_shl( - c.i32_const(1), - c.getLocal("bitsToEnd") - ), - c.i32_const(1) - ) - ), - c.setLocal( - "mask", - c.i32_sub( - c.i32_shl( - c.i32_const(1), - c.getLocal("chunkSize") - ), - c.i32_const(1) - ) - ) - ), - c.i32_and( - c.i32_shr_u( - c.i32_load( - c.i32_add( - c.getLocal("pScalar"), - c.i32_shr_u( - c.getLocal("startBit"), - c.i32_const(3) - ) - ), - 0, // offset - 0 // align to byte. - ), - c.i32_and( - c.getLocal("startBit"), - c.i32_const(0x7) - ) - ), - c.getLocal("mask") - ) - ); + const MAX_CHUNK_SIZE = 1 << 22; + const MIN_CHUNK_SIZE = 1 << 12; + + // Byte size of one input point: affine = 2 coordinates, jacobian = 3. + function pointSize(inType) { + return inType === "affine" ? G.F.n8*2 : G.F.n8*3; + } + + // Batch-affine "auto" threshold: use the batch module when a chunk's bases + // fit comfortably in a per-worker share of the last-level cache. Measured + // (20 cores, bn128): clear win up to ~1-2 MiB of bases per chunk (+10% on a + // full 2^16 prove), parity but extra scratch memory at ~6 MiB chunks -- + // under full worker concurrency the fill phase is bandwidth-bound, so the + // fewer-multiplications advantage only materializes while the random-access + // set stays cache-resident. + const AUTO_BATCH_MAX_BASES_BYTES = 1 << 21; + + // Resolve the batching mode: "auto" (default) | "enabled" | "disabled". + // Accepts booleans as aliases. + function batchModeOf(options) { + const m = options ? options.batch : undefined; + if (m === true || m === "enabled") return "enabled"; + if (m === false || m === "disabled") return "disabled"; + return "auto"; + } + + // Endomorphism mode for this group: "auto" (default -- use GLV/GLS when the + // curve advertises it; the wasm still gates internally on sizes) or + // "disabled" (generic batch accumulation). options.glv governs G1, + // options.gls governs G2; false is accepted as an alias for "disabled". + function endoOf(options) { + const v = options ? (groupName === "G1" ? options.glv : options.gls) : undefined; + if (v === false || v === "disabled") return "disabled"; + return "auto"; + } + + // WASM export name for this group + input representation. Affine input + // routes to the batch-affine MSM module ("...Batch") depending on the + // batching mode; the worker falls back to the plain in-module variant + // when the batch module is absent. + function fnNameFor(inType, basesBytes, batchMode, endoMode) { + const g = groupName === "G1" ? "g1m" : "g2m"; + if (inType !== "affine") return `${g}_multiexp`; + const useBatch = batchMode === "enabled" || + (batchMode === "auto" && basesBytes <= AUTO_BATCH_MAX_BASES_BYTES); + if (!useBatch) return `${g}_multiexpAffine`; + const noEndo = endoMode === "disabled" ? (groupName === "G1" ? "NoGlv" : "NoGls") : ""; + return `${g}_multiexpAffineBatch${noEndo}`; + } + + // Points per chunk. nChunks is derived from the scalar bit-width and rounded up + // to a multiple of the worker count for even load balancing (G2 points are + // larger, so we halve the chunk / double the count). Clamped to a sane range. + function chunkSizeFor(nPoints, sScalar) { + const bitChunkSize = pTSizes[log2(nPoints)]; + let nChunks = Math.floor((sScalar*8 - 1) / bitChunkSize) + 1; + if (groupName === "G2") nChunks *= 2; + nChunks = (Math.floor((nChunks-1) / tm.concurrency) + 1) * tm.concurrency; + let chunkSize = Math.floor(nPoints / nChunks) + 1; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + return chunkSize; } - function buildMutiexpChunk() { - const f = module.addFunction(fnName + "_chunk"); - f.addParam("pBases", "i32"); - f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points - f.addParam("n", "i32"); // Number of points - f.addParam("startBit", "i32"); // bit where it starts the chunk - f.addParam("chunkSize", "i32"); // bit where it starts the chunk - f.addParam("pr", "i32"); - f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); - f.addLocal("itBase", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); - f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); - f.addLocal("pIdxTable", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.i32_eqz(c.getLocal("n")), - [ - ...c.call(prefix + "_zero", c.getLocal("pr")), - ...c.ret([]) - ] - ), - - // Allocate memory - - c.setLocal( - "nTable", - c.i32_shl( - c.i32_const(1), - c.getLocal("chunkSize") - ) - ), - c.setLocal("pTable", c.i32_load( c.i32_const(0) )), - c.i32_store( - c.i32_const(0), - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("nTable"), - c.i32_const(n8g) - ) - ) - ), - - // Reset Table - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("nTable") - ) - ), - - c.call( - prefix + "_zero", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("j"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - // Distribute elements - c.setLocal("itBase", c.getLocal("pBases")), - c.setLocal("itScalar", c.getLocal("pScalars")), - c.setLocal("endScalar", - c.i32_add( - c.getLocal("pScalars"), - c.i32_mul( - c.getLocal("n"), - c.getLocal("scalarSize") - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("itScalar"), - c.getLocal("endScalar") - ) - ), - - c.setLocal( - "idx", - c.call(fnName + "_getChunk", - c.getLocal("itScalar"), - c.getLocal("scalarSize"), - c.getLocal("startBit"), - c.getLocal("chunkSize") - ) - ), - - c.if( - c.getLocal("idx"), - [ - ...c.setLocal( - "pIdxTable", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.i32_sub( - c.getLocal("idx"), - c.i32_const(1) - ), - c.i32_const(n8g) - ) - ) - ), - ...c.call( - opAdd, - c.getLocal("pIdxTable"), - c.getLocal("itBase"), - c.getLocal("pIdxTable"), - ) - ] - ), - - c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), - c.setLocal("itBase", c.i32_add(c.getLocal("itBase"), c.i32_const(n8b))), - c.br(0) - )), - - c.call(fnName + "_reduceTable", c.getLocal("pTable"), c.getLocal("chunkSize")), - c.call( - prefix + "_copy", - c.getLocal("pTable"), - c.getLocal("pr") - ), - - - c.i32_store( - c.i32_const(0), - c.getLocal("pTable") - ) + // Run the multiexp of one chunk on a worker; returns the partial point. + async function _multiExpChunk(buffBases, buffScalars, inType, batchMode, endoMode, logText) { + if (!(buffBases instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + if (!(buffScalars instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + const sGIn = pointSize(inType); + const nPoints = Math.floor(buffBases.byteLength / sGIn); + if (nPoints === 0) return G.zero; + const sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error(`${logText} Scalar size does not match`); + + const task = [ + {cmd: "ALLOCSET", var: 0, buff: buffBases}, + {cmd: "ALLOCSET", var: 1, buff: buffScalars}, + {cmd: "ALLOC", var: 2, len: G.F.n8*3}, + {cmd: "CALL", fnName: fnNameFor(inType, buffBases.byteLength, batchMode, endoMode), params: [ + {var: 0}, {var: 1}, {val: sScalar}, {val: nPoints}, {var: 2} + ]}, + {cmd: "GET", out: 0, var: 2, len: G.F.n8*3}, + ]; + // transfer the chunk buffers to the worker (zero-copy); one GET -> one point + const out = await tm.queueAction(task, [buffBases.buffer, buffScalars.buffer]); + return out[0]; + } + + // Shared driver. `getChunk(byteOffset, byteLength)` supplies each bases chunk -- + // a synchronous slice of an in-memory buffer, or an async sub-range read. At most + // `maxInFlight` chunks are sourced at once (Infinity = dispatch them all). The + // point set is partitioned across chunks, so the full multiexp is the sum of the + // per-chunk multiexps. + async function _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, maxInFlight, batchMode, endoMode, logger, logText) { + if (nPoints === 0) return G.zero; + const chunkSize = chunkSizeFor(nPoints, sScalar); + const inFlight = new Set(); + const partials = []; + + for (let off = 0; off < nPoints; off += chunkSize) { + const n = Math.min(nPoints - off, chunkSize); + const at = off; + // Backpressure: block until a slot frees (Promise.race also surfaces a + // failed chunk promptly). With maxInFlight = Infinity this never blocks. + while (inFlight.size >= maxInFlight) await Promise.race(inFlight); + if (logger) logger.debug(`Multiexp start: ${logText}: ${at}/${nPoints}`); + const op = (async () => { + const basesChunk = await getChunk(at*sGIn, n*sGIn); + const scalarsChunk = buffScalars.slice(at*sScalar, (at+n)*sScalar); + const r = await _multiExpChunk(basesChunk, scalarsChunk, inType, batchMode, endoMode, logText); + if (logger) logger.debug(`Multiexp end: ${logText}: ${at}/${nPoints}`); + return r; + })(); + // settle-either-way cleanup so a rejected chunk can't wedge the set + const slot = op.finally(() => inFlight.delete(slot)); + inFlight.add(slot); + partials.push(slot); + } - ); + const result = await Promise.all(partials); + let res = G.zero; + for (let i = result.length-1; i >= 0; i--) res = G.add(res, result[i]); + return res; } - function buildMultiexp() { - const f = module.addFunction(fnName); - f.addParam("pBases", "i32"); - f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points - f.addParam("n", "i32"); // Number of points - f.addParam("pr", "i32"); - f.addLocal("chunkSize", "i32"); - f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); - f.addLocal("itBase", "i32"); - f.addLocal("itBit", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); - f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); - f.addLocal("pIdxTable", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8g)); - - const pTSizes = module.alloc([ - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 16, 16, 15, 14, 13, 13, - 12, 11, 10, 9, 8, 7, 7, 6, - 5 , 4, 3, 2, 1, 1, 1, 1 - ]); - - f.addCode( - c.call(prefix + "_zero", c.getLocal("pr")), - c.if( - c.i32_eqz(c.getLocal("n")), - c.ret([]) - ), - c.setLocal("chunkSize", c.i32_load8_u( c.i32_clz(c.getLocal("n")), pTSizes )), - c.setLocal( - "nChunks", - c.i32_add( - c.i32_div_u( - c.i32_sub( - c.i32_shl( - c.getLocal("scalarSize"), - c.i32_const(3) - ), - c.i32_const(1) - ), - c.getLocal("chunkSize") - ), - c.i32_const(1) - ) - ), - - - // Allocate memory - - c.setLocal( - "itBit", - c.i32_mul( - c.i32_sub( - c.getLocal("nChunks"), - c.i32_const(1) - ), - c.getLocal("chunkSize") - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_lt_s( - c.getLocal("itBit"), - c.i32_const(0) - ) - ), - - // Double nChunk times - c.if( - c.i32_eqz(c.call(prefix + "_isZero", c.getLocal("pr"))), - [ - ...c.setLocal("j", c.i32_const(0)), - ...c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("chunkSize") - ) - ), - - c.call(prefix + "_double", c.getLocal("pr"), c.getLocal("pr")), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )) - ] - ), - - c.call( - fnName + "_chunk", - c.getLocal("pBases"), - c.getLocal("pScalars"), - c.getLocal("scalarSize"), - c.getLocal("n"), - c.getLocal("itBit"), - c.getLocal("chunkSize"), - aux - ), - - c.call( - prefix + "_add", - c.getLocal("pr"), - aux, - c.getLocal("pr") - ), - c.setLocal("itBit", c.i32_sub(c.getLocal("itBit"), c.getLocal("chunkSize"))), - c.br(0) - )) - ); + // Derive nPoints/sScalar and validate before dispatching. + function geometry(totalBasesBytes, buffScalars, inType) { + const sGIn = pointSize(inType); + const nPoints = Math.floor(totalBasesBytes / sGIn); + let sScalar = 0; + if (nPoints > 0) { + sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); + } + return { sGIn, nPoints, sScalar }; } - function buildReduceTable() { - const f = module.addFunction(fnName + "_reduceTable"); - f.addParam("pTable", "i32"); - f.addParam("p", "i32"); // Number of bits of the table - f.addLocal("half", "i32"); - f.addLocal("it1", "i32"); - f.addLocal("it2", "i32"); - f.addLocal("pAcc", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.i32_eq(c.getLocal("p"), c.i32_const(1)), - c.ret([]) - ), - c.setLocal( - "half", - c.i32_shl( - c.i32_const(1), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ) - ), - - c.setLocal("it1", c.getLocal("pTable")), - c.setLocal( - "it2", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("half"), - c.i32_const(n8g) - ) - ) - ), - c.setLocal("pAcc", - c.i32_sub( - c.getLocal("it2"), - c.i32_const(n8g) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("it1"), - c.getLocal("pAcc") - ) - ), - c.call( - prefix + "_add", - c.getLocal("it1"), - c.getLocal("it2"), - c.getLocal("it1") - ), - c.call( - prefix + "_add", - c.getLocal("pAcc"), - c.getLocal("it2"), - c.getLocal("pAcc") - ), - c.setLocal("it1", c.i32_add(c.getLocal("it1"), c.i32_const(n8g))), - c.setLocal("it2", c.i32_add(c.getLocal("it2"), c.i32_const(n8g))), - c.br(0) - )), - - c.call( - fnName + "_reduceTable", - c.getLocal("pTable"), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ), - - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.block(c.loop( - c.br_if(1, c.i32_eqz(c.getLocal("p"))), - c.call(prefix + "_double", c.getLocal("pAcc"), c.getLocal("pAcc")), - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.br(0) - )), - - c.call(prefix + "_add", c.getLocal("pTable"), c.getLocal("pAcc"), c.getLocal("pTable")) - ); + // multiexp over an in-memory bases buffer (sliced per chunk, all dispatched at once). + async function _multiExp(buffBases, buffScalars, inType, batchMode, endoMode, logger, logText) { + const { sGIn, nPoints, sScalar } = geometry(buffBases.byteLength, buffScalars, inType); + const getChunk = (off, len) => buffBases.slice(off, off + len); + return _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, Infinity, batchMode, endoMode, logger, logText); } - buildGetChunk(); - buildReduceTable(); - buildMutiexpChunk(); - buildMultiexp(); - - module.exportFunction(fnName); - module.exportFunction(fnName +"_chunk"); + G.multiExp = async function multiExp(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "jacobian", "disabled", "auto", logger, logText); + }; + // options.batch: "auto" (default) | "enabled" | "disabled" -- see batchModeOf. + // options.glv / options.gls: "auto" (default) | "disabled" -- see endoOf. + G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText, options) { + return _multiExp(buffBases, buffScalars, "affine", batchModeOf(options), endoOf(options), logger, logText); + }; + // Streaming affine multiexp: bases are produced chunk-by-chunk by `basesReader` + // (e.g. a direct sub-range file read) instead of being read whole and sliced -- + // no main-thread slice copy, and the full section never sits in RAM (reads are + // bounded to a few in-flight chunks). Result is identical to multiExpAffine. + G.multiExpAffineChunked = async function multiExpAffineChunked(basesReader, totalBasesBytes, buffScalars, logger, logText, options) { + if (typeof basesReader !== "function") { + throw new Error(`${logText || "multiExpAffineChunked"}: basesReader must be a function (byteOffset, byteLength) => Promise`); + } + const { sGIn, nPoints, sScalar } = geometry(totalBasesBytes, buffScalars, "affine"); + return _multiExpDispatch(basesReader, buffScalars, nPoints, sGIn, sScalar, "affine", tm.concurrency + 2, batchModeOf(options), endoOf(options), logger, logText); + }; +} -}; +function buildFFT(curve, groupName) { + const G = curve[groupName]; + const Fr = curve.Fr; + const tm = G.tm; -/* - Copyright 2019 0KIMS association. + // In-place bit-reversal permutation in a worker. The buffer is transferred + // in, reversed where it lies via plain typed-array lane swaps (no WASM + // linear memory grown, nothing allocated), and transferred back. Both + // transfers are pointer moves, so this is zero-copy. The swap is + // memory-bandwidth bound, so a single worker is as fast as splitting across + // many — which is why no SharedArrayBuffer is needed (only concurrent + // multi-worker access to one buffer would require that). + async function _reversePermutation(buff, sIn, bits) { + const res = await tm.queueAction( + [{cmd: "REVERSE", src: buff, sIn, bits}], + [buff.buffer] // transfer in; reversed in place and transferred back + ); + return res[0]; + } - This file is part of wasmsnark (Web Assembly zkSnark Prover). + // `consume`: when true the caller cedes ownership of `buff` -- we skip the + // defensive full-copy below and reverse/transfer the caller's buffer in place + // (its backing ArrayBuffer is detached as a result). Only pass it when the + // input is discarded right after the call (e.g. the groth16 IFFT->applyKey->FFT + // pipeline). Default false preserves the input. + async function _fft(buff, inverse, inType, outType, logger, loggerTxt, consume) { - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + inType = inType || "affine"; + outType = outType || "affine"; + const MAX_BITS_THREAD = 14; - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. + let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal; + if (groupName == "G1") { + if (inType == "affine") { + sIn = G.F.n8*2; + fnIn2Mid = "g1m_batchToJacobian"; + } else { + sIn = G.F.n8*3; + } + sMid = G.F.n8*3; + if (inverse) { + fnFFTFinal = "g1m_fftFinal"; + } + fnFFTJoin = "g1m_fftJoin"; + fnFFTMix = "g1m_fftMix"; - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ + if (outType == "affine") { + sOut = G.F.n8*2; + fnMid2Out = "g1m_batchToAffine"; + } else { + sOut = G.F.n8*3; + } -const buildTimesScalarNAF = build_timesscalarnaf; -//const buildTimesScalar = require("./build_timesscalar"); -const buildBatchConvertion = build_batchconvertion; -const buildMultiexp$1 = build_multiexp; + } else if (groupName == "G2") { + if (inType == "affine") { + sIn = G.F.n8*2; + fnIn2Mid = "g2m_batchToJacobian"; + } else { + sIn = G.F.n8*3; + } + sMid = G.F.n8*3; + if (inverse) { + fnFFTFinal = "g2m_fftFinal"; + } + fnFFTJoin = "g2m_fftJoin"; + fnFFTMix = "g2m_fftMix"; + if (outType == "affine") { + sOut = G.F.n8*2; + fnMid2Out = "g2m_batchToAffine"; + } else { + sOut = G.F.n8*3; + } + } else if (groupName == "Fr") { + sIn = G.n8; + sMid = G.n8; + sOut = G.n8; + if (inverse) { + fnFFTFinal = "frm_fftFinal"; + } + fnFFTMix = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; + } -var build_curve_jacobian_a0 = function buildCurve(module, prefix, prefixField, pB) { + let returnArray = false; + if (Array.isArray(buff)) { + buff = array2buffer(buff, sIn); + returnArray = true; + } else if (!consume || !ArrayBuffer.isView(buff)) { + // Defensive copy: the bit-reversal runs in place and chunks are + // transferred, so without consume we must not touch the caller's buffer. + // It also flattens a BigBuffer (no single .buffer to transfer) to a + // Uint8Array, so consume can only be honoured for an ArrayBuffer view. + buff = buff.slice(0, buff.byteLength); + } - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; + const nPoints = buff.byteLength / sIn; + const bits = log2(nPoints); - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = { - n64: n64*3 - }; + if ((1 << bits) != nPoints) { + throw new Error("fft must be multiple of 2" ); + } - function buildIsZero() { - const f = module.addFunction(prefix + "_isZero"); - f.addParam("p1", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call( - prefixField + "_isZero", - c.i32_add( - c.getLocal("p1"), - c.i32_const(n8*2) - ) - )); - } - function buildIsZeroAffine() { - const f = module.addFunction(prefix + "_isZeroAffine"); - f.addParam("p1", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.i32_and( - c.call( - prefixField + "_isZero", - c.getLocal("p1") - ), - c.call( - prefixField + "_isZero", - c.i32_add( - c.getLocal("p1"), - c.i32_const(n8) - ) - ) - ) - ); - } + if (bits == Fr.s +1) { + let buffOut; - function buildCopy() { - const f = module.addFunction(prefix + "_copy"); - f.addParam("ps", "i32"); - f.addParam("pd", "i32"); + if (inverse) { + buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); + } else { + buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); + } - const c = f.getCodeBuilder(); + if (returnArray) { + return buffer2array(buffOut, sOut); + } else { + return buffOut; + } + } - for (let i=0; i=16)) { + nChunks *= 2; + pointsInChunk /= 2; } - } - - - function buildZero() { - const f = module.addFunction(prefix + "_zero"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call( - prefixField + "_zero", - c.getLocal("pr") - )); - - f.addCode(c.call( - prefixField + "_one", - c.i32_add( - c.getLocal("pr"), - c.i32_const(n8) - ) - )); - - f.addCode(c.call( - prefixField + "_zero", - c.i32_add( - c.getLocal("pr"), - c.i32_const(n8*2) - ) - )); - } - - - function buildZeroAffine() { - const f = module.addFunction(prefix + "_zeroAffine"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call( - prefixField + "_zero", - c.getLocal("pr") - )); - - f.addCode(c.call( - prefixField + "_zero", - c.i32_add( - c.getLocal("pr"), - c.i32_const(n8) - ) - )); - } - - function buildEq() { - const f = module.addFunction(prefix + "_eq"); - f.addParam("p1", "i32"); - f.addParam("p2", "i32"); - f.setReturnType("i32"); - f.addLocal("z1", "i32"); - f.addLocal("z2", "i32"); - - const c = f.getCodeBuilder(); - - const x1 = c.getLocal("p1"); - const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8*2)))); - const z1 = c.getLocal("z1"); - const x2 = c.getLocal("p2"); - const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); - f.addCode(c.setLocal("z2", c.i32_add(c.getLocal("p2"), c.i32_const(n8*2)))); - const z2 = c.getLocal("z2"); - - const Z1Z1 = c.i32_const(module.alloc(n8)); - const Z2Z2 = c.i32_const(module.alloc(n8)); - const U1 = c.i32_const(module.alloc(n8)); - const U2 = c.i32_const(module.alloc(n8)); - const Z1_cubed = c.i32_const(module.alloc(n8)); - const Z2_cubed = c.i32_const(module.alloc(n8)); - const S1 = c.i32_const(module.alloc(n8)); - const S2 = c.i32_const(module.alloc(n8)); - - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("p1")), - c.ret( c.call(prefix + "_isZero", c.getLocal("p2"))), - ), - c.if( - c.call(prefix + "_isZero", c.getLocal("p2")), - c.ret(c.i32_const(0)) - ), - c.if( - c.call(prefixField + "_isOne", z1), - c.ret(c.call(prefix + "_eqMixed", c.getLocal("p2"), c.getLocal("p1"))) - ), - c.if( - c.call(prefixField + "_isOne", z2), - c.ret(c.call(prefix + "_eqMixed", c.getLocal("p1"), c.getLocal("p2"))) - ), - - c.call(prefixField + "_square", z1, Z1Z1), - c.call(prefixField + "_square", z2, Z2Z2), - c.call(prefixField + "_mul", x1, Z2Z2, U1), - c.call(prefixField + "_mul", x2, Z1Z1, U2), - c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), - c.call(prefixField + "_mul", z2, Z2Z2, Z2_cubed), - c.call(prefixField + "_mul", y1, Z2_cubed, S1), - c.call(prefixField + "_mul", y2, Z1_cubed, S2), - - c.if( - c.call(prefixField + "_eq", U1, U2), - c.if( - c.call(prefixField + "_eq", S1, S2), - c.ret(c.i32_const(1)) - ) - ), - c.ret(c.i32_const(0)) - ); - } - - - function buildEqMixed() { - const f = module.addFunction(prefix + "_eqMixed"); - f.addParam("p1", "i32"); - f.addParam("p2", "i32"); - f.setReturnType("i32"); - f.addLocal("z1", "i32"); - - const c = f.getCodeBuilder(); - - const x1 = c.getLocal("p1"); - const y1 = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - f.addCode(c.setLocal("z1", c.i32_add(c.getLocal("p1"), c.i32_const(n8*2)))); - const z1 = c.getLocal("z1"); - const x2 = c.getLocal("p2"); - const y2 = c.i32_add(c.getLocal("p2"), c.i32_const(n8)); - - const Z1Z1 = c.i32_const(module.alloc(n8)); - const U2 = c.i32_const(module.alloc(n8)); - const Z1_cubed = c.i32_const(module.alloc(n8)); - const S2 = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("p1")), - c.ret( c.call(prefix + "_isZeroAffine", c.getLocal("p2"))), - ), - c.if( - c.call(prefix + "_isZeroAffine", c.getLocal("p2")), - c.ret(c.i32_const(0)) - ), - c.if( - c.call(prefixField + "_isOne", z1), - c.ret(c.call(prefix + "_eqAffine", c.getLocal("p1"), c.getLocal("p2"))) - ), - c.call(prefixField + "_square", z1, Z1Z1), - c.call(prefixField + "_mul", x2, Z1Z1, U2), - c.call(prefixField + "_mul", z1, Z1Z1, Z1_cubed), - c.call(prefixField + "_mul", y2, Z1_cubed, S2), - - c.if( - c.call(prefixField + "_eq", x1, U2), - c.if( - c.call(prefixField + "_eq", y1, S2), - c.ret(c.i32_const(1)) - ) - ), - c.ret(c.i32_const(0)) - ); - } - - function buildDouble() { - const f = module.addFunction(prefix + "_double"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8*2)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)); - - const A = c.i32_const(module.alloc(n8)); - const B = c.i32_const(module.alloc(n8)); - const C = c.i32_const(module.alloc(n8)); - const D = c.i32_const(module.alloc(n8)); - const E = c.i32_const(module.alloc(n8)); - const F = c.i32_const(module.alloc(n8)); - const G = c.i32_const(module.alloc(n8)); - const eightC = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("p1")), - [ - ...c.call(prefix + "_copy", c.getLocal("p1"), c.getLocal("pr")), - ...c.ret([]) - ] - ), - c.if( - c.call(prefixField + "_isOne", z), - [ - ...c.ret(c.call(prefix + "_doubleAffine", c.getLocal("p1"), c.getLocal("pr"))), - ...c.ret([]) - ] - ), - - c.call(prefixField + "_square", x, A), - c.call(prefixField + "_square", y, B), - c.call(prefixField + "_square", B, C), - - c.call(prefixField + "_add", x, B, D), - c.call(prefixField + "_square", D, D), - c.call(prefixField + "_sub", D, A, D), - c.call(prefixField + "_sub", D, C, D), - c.call(prefixField + "_add", D, D, D), - - c.call(prefixField + "_add", A, A, E), - c.call(prefixField + "_add", E, A, E), - c.call(prefixField + "_square", E, F), - - c.call(prefixField + "_mul", y, z, G), - - c.call(prefixField + "_add", D, D, x3), - c.call(prefixField + "_sub", F, x3, x3), - - c.call(prefixField + "_add", C, C, eightC), - c.call(prefixField + "_add", eightC, eightC, eightC), - c.call(prefixField + "_add", eightC, eightC, eightC), - - c.call(prefixField + "_sub", D, x3, y3), - c.call(prefixField + "_mul", y3, E, y3), - c.call(prefixField + "_sub", y3, eightC, y3), - - c.call(prefixField + "_add", G, G, z3), - ); - } - - - function buildDoubleAffine() { - const f = module.addFunction(prefix + "_doubleAffine"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); + const l2Chunk = log2(pointsInChunk); - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)); + const promises = []; + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`); + for (let i = 0; i< nChunks; i++) { + const task = []; + task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); + const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); + task.push({cmd: "SET", var: 0, buff: buffChunk}); + if (fnIn2Mid) { + task.push({cmd: "CALL", fnName:fnIn2Mid, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); + } + for (let j=1; j<=l2Chunk;j++) { + task.push({cmd: "CALL", fnName:fnFFTMix, params: [{var:0}, {val: pointsInChunk}, {val: j}]}); + } - const XX = c.i32_const(module.alloc(n8)); - const YY = c.i32_const(module.alloc(n8)); - const YYYY = c.i32_const(module.alloc(n8)); - const S = c.i32_const(module.alloc(n8)); - const M = c.i32_const(module.alloc(n8)); - const eightYYYY = c.i32_const(module.alloc(n8)); + if (l2Chunk==bits) { + if (fnFFTFinal) { + task.push({cmd: "ALLOCSET", var: 1, buff: inv}); + task.push({cmd: "CALL", fnName: fnFFTFinal, params:[ + {var: 0}, + {val: pointsInChunk}, + {var: 1}, + ]}); + } + if (fnMid2Out) { + task.push({cmd: "CALL", fnName:fnMid2Out, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); + } + task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sOut}); + } else { + task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); + } + promises.push(tm.queueAction(task, [buffChunk.buffer])); + } - f.addCode( - c.if( - c.call(prefix + "_isZeroAffine", c.getLocal("p1")), - [ - ...c.call(prefix + "_toJacobian", c.getLocal("p1"), c.getLocal("pr")), - ...c.ret([]) - ] - ), - - // XX = X1^2 - c.call(prefixField + "_square", x, XX), - - // YY = Y1^2 - c.call(prefixField + "_square", y, YY), - - // YYYY = YY^2 - c.call(prefixField + "_square", YY, YYYY), - - // S = 2*((X1+YY)^2-XX-YYYY) - c.call(prefixField + "_add", x, YY, S), - c.call(prefixField + "_square", S, S), - c.call(prefixField + "_sub", S, XX, S), - c.call(prefixField + "_sub", S, YYYY, S), - c.call(prefixField + "_add", S, S, S), - - // M = 3*XX+a (Hera a=0) - c.call(prefixField + "_add", XX, XX, M), - c.call(prefixField + "_add", M, XX, M), - - // Z3 = 2*Y1 - c.call(prefixField + "_add", y, y, z3), - - // T = M^2-2*S - // X3 = T - c.call(prefixField + "_square", M, x3), - c.call(prefixField + "_sub", x3, S, x3), - c.call(prefixField + "_sub", x3, S, x3), - - // Y3 = M*(S-T)-8*YYYY - c.call(prefixField + "_add", YYYY, YYYY, eightYYYY), - c.call(prefixField + "_add", eightYYYY, eightYYYY, eightYYYY), - c.call(prefixField + "_add", eightYYYY, eightYYYY, eightYYYY), - c.call(prefixField + "_sub", S, x3, y3), - c.call(prefixField + "_mul", y3, M, y3), - c.call(prefixField + "_sub", y3, eightYYYY, y3), - ); - } + chunks = await Promise.all(promises); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`); + for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; + for (let i = l2Chunk+1; i<=bits; i++) { + if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); + const nGroups = 1 << (bits - i); + const nChunksPerGroup = nChunks / nGroups; + const opPromises = []; + for (let j=0; j0; i--) { + buffOut.set(chunks[i], p); + p += pointsInChunk*sOut; + delete chunks[i]; // Liberate mem + } + buffOut.set(chunks[0].slice(0, (pointsInChunk-1)*sOut), p); + delete chunks[0]; + } else { + for (let i=0; i (1<<28)) { + buffOut = new BigBuffer(res1[0].byteLength*2); + } else { + buffOut = new Uint8Array(res1[0].byteLength*2); + } - const AUX = c.i32_const(module.alloc(n8*3)); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); - f.addCode( - c.call(prefix + "_negAffine", c.getLocal("p2"), AUX), - c.call(prefix + "_addAffine", c.getLocal("p1"), AUX, c.getLocal("pr")), - ); + return buffOut; } - // This sets Z to One - function buildNormalize() { - const f = module.addFunction(prefix + "_normalize"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8*2)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)); - - - const Z_inv = c.i32_const(module.alloc(n8)); - const Z2_inv = c.i32_const(module.alloc(n8)); - const Z3_inv = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("p1")), - c.call(prefix + "_zero", c.getLocal("pr")), - [ - ...c.call(prefixField + "_inverse", z, Z_inv), - ...c.call(prefixField + "_square", Z_inv, Z2_inv), - ...c.call(prefixField + "_mul", Z_inv, Z2_inv, Z3_inv), - ...c.call(prefixField + "_mul", x, Z2_inv, x3), - ...c.call(prefixField + "_mul", y, Z3_inv, y3), - ...c.call(prefixField + "_one", z3), - ] - ) - ); - } + async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { + let b1, b2; + b1 = buff.slice( 0 , buff.byteLength/2); + b2 = buff.slice( buff.byteLength/2, buff.byteLength); + const promises = []; - // Does not set Z. - function buildToAffine() { - const f = module.addFunction(prefix + "_toAffine"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); + promises.push( _fft(b1, true, inType, "jacobian", logger, loggerTxt)); + promises.push( _fft(b2, true, inType, "jacobian", logger, loggerTxt)); - const c = f.getCodeBuilder(); + [b1, b2] = await Promise.all(promises); - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - const z = c.i32_add(c.getLocal("p1"), c.i32_const(n8*2)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); + const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); + let buffOut; + if (res1[0].byteLength > (1<<28)) { + buffOut = new BigBuffer(res1[0].byteLength*2); + } else { + buffOut = new Uint8Array(res1[0].byteLength*2); + } - const Z_inv = c.i32_const(module.alloc(n8)); - const Z2_inv = c.i32_const(module.alloc(n8)); - const Z3_inv = c.i32_const(module.alloc(n8)); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("p1")), - [ - ...c.call(prefixField + "_zero", x3), - ...c.call(prefixField + "_zero", y3), - ], - [ - ...c.call(prefixField + "_inverse", z, Z_inv), - ...c.call(prefixField + "_square", Z_inv, Z2_inv), - ...c.call(prefixField + "_mul", Z_inv, Z2_inv, Z3_inv), - ...c.call(prefixField + "_mul", x, Z2_inv, x3), - ...c.call(prefixField + "_mul", y, Z3_inv, y3), - ] - ) - ); + return buffOut; } - function buildToJacobian() { - const f = module.addFunction(prefix + "_toJacobian"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); + async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { + const MAX_CHUNK_SIZE = 1<<16; + const MIN_CHUNK_SIZE = 1<<4; - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(n8)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)); + let fnName; + let fnIn2Mid, fnMid2Out; + let sOut, sIn, sMid; - f.addCode( - c.if( - c.call(prefix + "_isZeroAffine", c.getLocal("p1")), - c.call(prefix + "_zero", c.getLocal("pr")), - [ - ...c.call(prefixField + "_one", z3), - ...c.call(prefixField + "_copy", y, y3), - ...c.call(prefixField + "_copy", x, x3) - ] - ) - ); - } - - function buildBatchToAffine() { - const f = module.addFunction(prefix + "_batchToAffine"); - f.addParam("pIn", "i32"); - f.addParam("n", "i32"); - f.addParam("pOut", "i32"); - f.addLocal("pAux", "i32"); - f.addLocal("itIn", "i32"); - f.addLocal("itAux", "i32"); - f.addLocal("itOut", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const tmp = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("pAux", c.i32_load( c.i32_const(0) )), - c.i32_store( - c.i32_const(0), - c.i32_add( - c.getLocal("pAux"), - c.i32_mul(c.getLocal("n"), c.i32_const(n8)) - ) - ), - - c.call( - prefixField + "_batchInverse", - c.i32_add(c.getLocal("pIn"), c.i32_const(n8*2)), - c.i32_const(n8*3), - c.getLocal("n"), - c.getLocal("pAux"), - c.i32_const(n8) - ), - - c.setLocal("itIn", c.getLocal("pIn")), - c.setLocal("itAux", c.getLocal("pAux")), - c.setLocal("itOut", c.getLocal("pOut")), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if(1, c.i32_eq ( c.getLocal("i"), c.getLocal("n") )), - - c.if( - c.call(prefixField + "_isZero", c.getLocal("itAux")), - [ - ...c.call(prefixField + "_zero", c.getLocal("itOut")), - ...c.call(prefixField + "_zero", c.i32_add(c.getLocal("itOut"), c.i32_const(n8))) - ], - [ - ...c.call( - prefixField+"_mul", - c.getLocal("itAux"), - c.i32_add(c.getLocal("itIn"), c.i32_const(n8)), - tmp, - ), - ...c.call( - prefixField+"_square", - c.getLocal("itAux"), - c.getLocal("itAux") - ), - ...c.call( - prefixField+"_mul", - c.getLocal("itAux"), - c.getLocal("itIn"), - c.getLocal("itOut"), - ), - ...c.call( - prefixField+"_mul", - c.getLocal("itAux"), - tmp, - c.i32_add(c.getLocal("itOut"), c.i32_const(n8)), - ), - ] - ), - - c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(n8*3))), - c.setLocal("itOut", c.i32_add(c.getLocal("itOut"), c.i32_const(n8*2))), - c.setLocal("itAux", c.i32_add(c.getLocal("itAux"), c.i32_const(n8))), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - c.i32_store( - c.i32_const(0), - c.getLocal("pAux") - ) - ); - } - - - // This function is private and does not allow to OVERLAP buffers. - function buildReverseBytes() { - const f = module.addFunction(prefix + "__reverseBytes"); - f.addParam("pIn", "i32"); - f.addParam("n", "i32"); - f.addParam("pOut", "i32"); - f.addLocal("itOut", "i32"); - f.addLocal("itIn", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "itOut", - c.i32_sub( - c.i32_add( - c.getLocal("pOut"), - c.getLocal("n") - ), - c.i32_const(1) - ) - ), - c.setLocal( - "itIn", - c.getLocal("pIn") - ), - c.block(c.loop( - c.br_if(1, c.i32_lt_s( c.getLocal("itOut"), c.getLocal("pOut") )), - c.i32_store8( - c.getLocal("itOut"), - c.i32_load8_u(c.getLocal("itIn")), - ), - c.setLocal("itOut", c.i32_sub(c.getLocal("itOut"), c.i32_const(1))), - c.setLocal("itIn", c.i32_add(c.getLocal("itIn"), c.i32_const(1))), - c.br(0) - )), - ); - - } - - function buildLEMtoC() { - const f = module.addFunction(prefix + "_LEMtoC"); - f.addParam("pIn", "i32"); - f.addParam("pOut", "i32"); - - const c = f.getCodeBuilder(); - - const tmp = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZeroAffine", c.getLocal("pIn")), - [ - ...c.call(prefixField + "_zero", c.getLocal("pOut")), - ...c.i32_store8( - c.getLocal("pOut"), - c.i32_const(0x40) - ), - ...c.ret([]) - ] - ), - c.call(prefixField + "_fromMontgomery", c.getLocal("pIn"), tmp), - c.call(prefix + "__reverseBytes", tmp, c.i32_const(n8), c.getLocal("pOut")), - c.if( - c.i32_eq( - c.call(prefixField + "_sign", c.i32_add(c.getLocal("pIn"), c.i32_const(n8))), - c.i32_const(-1) - ), - c.i32_store8( - c.getLocal("pOut"), - c.i32_or( - c.i32_load8_u(c.getLocal("pOut")), - c.i32_const(0x80) - ) - ) - ), - ); - } - - function buildLEMtoU() { - const f = module.addFunction(prefix + "_LEMtoU"); - f.addParam("pIn", "i32"); - f.addParam("pOut", "i32"); - - const c = f.getCodeBuilder(); - - const pTmp = module.alloc(n8*2); - const tmp = c.i32_const(pTmp); - const tmpX = c.i32_const(pTmp); - const tmpY = c.i32_const(pTmp + n8); - - f.addCode( - c.if( - c.call(prefix + "_isZeroAffine", c.getLocal("pIn")), - [ - ...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), - ...c.ret([]) - ] - ), - - c.call(prefix + "_fromMontgomeryAffine", c.getLocal("pIn"), tmp), - - c.call(prefix + "__reverseBytes", tmpX, c.i32_const(n8), c.getLocal("pOut")), - c.call(prefix + "__reverseBytes", tmpY, c.i32_const(n8), c.i32_add(c.getLocal("pOut"), c.i32_const(n8))), - ); - } - - function buildUtoLEM() { - const f = module.addFunction(prefix + "_UtoLEM"); - f.addParam("pIn", "i32"); - f.addParam("pOut", "i32"); - - const c = f.getCodeBuilder(); - - const pTmp = module.alloc(n8*2); - const tmp = c.i32_const(pTmp); - const tmpX = c.i32_const(pTmp); - const tmpY = c.i32_const(pTmp + n8); - - f.addCode( - c.if( - c.i32_and(c.i32_load8_u(c.getLocal("pIn")), c.i32_const(0x40)), - [ - ...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), - ...c.ret([]) - ] - ), - c.call(prefix + "__reverseBytes", c.getLocal("pIn"), c.i32_const(n8), tmpX), - c.call(prefix + "__reverseBytes", c.i32_add(c.getLocal("pIn"), c.i32_const(n8)), c.i32_const(n8), tmpY), - c.call(prefix + "_toMontgomeryAffine", tmp, c.getLocal("pOut")) - ); - } - - function buildCtoLEM() { - const f = module.addFunction(prefix + "_CtoLEM"); - f.addParam("pIn", "i32"); - f.addParam("pOut", "i32"); - f.addLocal("firstByte", "i32"); - f.addLocal("greatest", "i32"); - - const c = f.getCodeBuilder(); - - const pTmp = module.alloc(n8*2); - const tmpX = c.i32_const(pTmp); - const tmpY = c.i32_const(pTmp + n8); - - f.addCode( - c.setLocal("firstByte", c.i32_load8_u(c.getLocal("pIn"))), - c.if( - c.i32_and( - c.getLocal("firstByte"), - c.i32_const(0x40) - ), - [ - ...c.call(prefix + "_zeroAffine", c.getLocal("pOut")), - ...c.ret([]) - ] - ), - c.setLocal( - "greatest", - c.i32_and( - c.getLocal("firstByte"), - c.i32_const(0x80) - ) - ), - - c.call(prefixField + "_copy", c.getLocal("pIn"), tmpY), - c.i32_store8(tmpY, c.i32_and(c.getLocal("firstByte"), c.i32_const(0x3F))), - c.call(prefix + "__reverseBytes", tmpY, c.i32_const(n8), tmpX), - c.call(prefixField + "_toMontgomery", tmpX, c.getLocal("pOut")), - - c.call(prefixField + "_square", c.getLocal("pOut"), tmpY), - c.call(prefixField + "_mul", c.getLocal("pOut"), tmpY, tmpY), - c.call(prefixField + "_add", tmpY, c.i32_const(pB), tmpY), - - c.call(prefixField + "_sqrt", tmpY, tmpY), - c.call(prefixField + "_neg", tmpY, tmpX), - - c.if( - c.i32_eq( - c.call(prefixField + "_sign", tmpY), - c.i32_const(-1) - ), - c.if( - c.getLocal("greatest"), - c.call(prefixField + "_copy", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))), - c.call(prefixField + "_neg", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))) - ), - c.if( - c.getLocal("greatest"), - c.call(prefixField + "_neg", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))), - c.call(prefixField + "_copy", tmpY, c.i32_add(c.getLocal("pOut"), c.i32_const(n8))) - ), - ) - - ); - } - - function buildInCurveAffine() { - const f = module.addFunction(prefix + "_inCurveAffine"); - f.addParam("pIn", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("pIn"); - const y = c.i32_add(c.getLocal("pIn"), c.i32_const(n8)); - - const y2 = c.i32_const(module.alloc(n8)); - const x3b = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call(prefixField + "_square", y, y2), - c.call(prefixField + "_square", x, x3b), - c.call(prefixField + "_mul", x, x3b, x3b), - c.call(prefixField + "_add", x3b, c.i32_const(pB), x3b), - - c.ret( - c.call(prefixField + "_eq", y2, x3b) - ) - ); - } - - function buildInCurve() { - const f = module.addFunction(prefix + "_inCurve"); - f.addParam("pIn", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8*2)); - - f.addCode( - c.call(prefix + "_toAffine", c.getLocal("pIn"), aux), - - c.ret( - c.call(prefix + "_inCurveAffine", aux), - ) - ); - } - - buildIsZeroAffine(); - buildIsZero(); - buildZeroAffine(); - buildZero(); - buildCopyAffine(); - buildCopy(); - buildToJacobian(); - buildEqAffine(); - buildEqMixed(); - buildEq(); - buildDoubleAffine(); - buildDouble(); - buildAddAffine(); - buildAddMixed(); - buildAdd(); - buildNegAffine(); - buildNeg(); - buildSubAffine(); - buildSubMixed(); - buildSub(); - buildFromMontgomeryAffine(); - buildFromMontgomery(); - buildToMontgomeryAffine(); - buildToMontgomery(); - buildToAffine(); - buildInCurveAffine(); - buildInCurve(); - - buildBatchToAffine(); - - buildNormalize(); - - - buildReverseBytes(); - - buildLEMtoU(); - buildLEMtoC(); - buildUtoLEM(); - buildCtoLEM(); - - buildBatchConvertion(module, prefix + "_batchLEMtoU", prefix + "_LEMtoU", n8*2, n8*2); - buildBatchConvertion(module, prefix + "_batchLEMtoC", prefix + "_LEMtoC", n8*2, n8); - buildBatchConvertion(module, prefix + "_batchUtoLEM", prefix + "_UtoLEM", n8*2, n8*2); - buildBatchConvertion(module, prefix + "_batchCtoLEM", prefix + "_CtoLEM", n8, n8*2, true); - - buildBatchConvertion(module, prefix + "_batchToJacobian", prefix + "_toJacobian", n8*2, n8*3, true); - - buildMultiexp$1(module, prefix, prefix + "_multiexp", prefix + "_add", n8*3); - buildMultiexp$1(module, prefix, prefix + "_multiexpAffine", prefix + "_addMixed", n8*2); - - /* - buildTimesScalar( - module, - prefix + "_timesScalarOld", - n8*3, - prefix + "_add", - prefix + "_double", - prefix + "_copy", - prefix + "_zero", - ); - */ - buildTimesScalarNAF( - module, - prefix + "_timesScalar", - n8*3, - prefix + "_add", - prefix + "_double", - prefix + "_sub", - prefix + "_copy", - prefix + "_zero" - ); - - buildTimesScalarNAF( - module, - prefix + "_timesScalarAffine", - n8*2, - prefix + "_addMixed", - prefix + "_double", - prefix + "_subMixed", - prefix + "_copyAffine", - prefix + "_zero" - ); - - module.exportFunction(prefix + "_isZero"); - module.exportFunction(prefix + "_isZeroAffine"); - - module.exportFunction(prefix + "_eq"); - module.exportFunction(prefix + "_eqMixed"); - module.exportFunction(prefix + "_eqAffine"); - - module.exportFunction(prefix + "_copy"); - module.exportFunction(prefix + "_copyAffine"); - - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_zeroAffine"); - - module.exportFunction(prefix + "_double"); - module.exportFunction(prefix + "_doubleAffine"); - - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_addMixed"); - module.exportFunction(prefix + "_addAffine"); - - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_negAffine"); - - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_subMixed"); - module.exportFunction(prefix + "_subAffine"); - - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_fromMontgomeryAffine"); - - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_toMontgomeryAffine"); - - module.exportFunction(prefix + "_timesScalar"); - module.exportFunction(prefix + "_timesScalarAffine"); - - module.exportFunction(prefix + "_normalize"); - - // Convertion functions - module.exportFunction(prefix + "_LEMtoU"); - module.exportFunction(prefix + "_LEMtoC"); - module.exportFunction(prefix + "_UtoLEM"); - module.exportFunction(prefix + "_CtoLEM"); - - module.exportFunction(prefix + "_batchLEMtoU"); - module.exportFunction(prefix + "_batchLEMtoC"); - module.exportFunction(prefix + "_batchUtoLEM"); - module.exportFunction(prefix + "_batchCtoLEM"); - - module.exportFunction(prefix + "_toAffine"); - module.exportFunction(prefix + "_toJacobian"); - - module.exportFunction(prefix + "_batchToAffine"); - module.exportFunction(prefix + "_batchToJacobian"); - - module.exportFunction(prefix + "_inCurve"); - module.exportFunction(prefix + "_inCurveAffine"); - - /* - buildG1MulScalar(module, zq); - module.exportFunction("g1MulScalar"); - */ - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const { isOdd: isOdd$2, modInv: modInv$1, modPow } = bigint; -const utils$3 = utils$6; - -var build_fft = function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) { - - const n64f = module.modules[fPrefix].n64; - const n8f = n64f*8; - - const n64g = module.modules[gPrefix].n64; - const n8g = n64g*8; - - const q = module.modules[fPrefix].q; - - let rem = q - 1n; - let maxBits = 0; - while (!isOdd$2(rem)) { - maxBits ++; - rem = rem >> 1n; - } - - let nr = 2n; - - while ( modPow(nr, q >> 1n, q) === 1n ) nr = nr + 1n; - - // console.log(nr); - - const w = new Array(maxBits+1); - w[maxBits] = modPow(nr, rem, q); - - let n=maxBits-1; - while (n>=0) { - w[n] = modPow(w[n+1], 2n, q); - n--; - } - - const bytes = []; - const R = (1n << BigInt(n8f*8)) % q; - - for (let i=0; i> i); - } - } - return r; - } - - const rtable = Array(256); - for (let i=0; i<256; i++) { - rtable[i] = rev(i); - } - - const REVTABLE = module.alloc(rtable); - - - function buildLog2() { - const f = module.addFunction(prefix+"__log2"); - f.addParam("n", "i32"); - f.setReturnType("i32"); - f.addLocal("bits", "i32"); - f.addLocal("aux", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "aux", - c.i32_shr_u( - c.getLocal("n"), - c.i32_const(1) - ) - ) - ); - f.addCode(c.setLocal("bits", c.i32_const(0))); - - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.i32_eqz(c.getLocal("aux")) - ), - - c.setLocal( - "aux", - c.i32_shr_u( - c.getLocal("aux"), - c.i32_const(1) - ) - ), - - c.setLocal( - "bits", - c.i32_add( - c.getLocal("bits"), - c.i32_const(1) - ) - ), - - c.br(0) - ))); - - f.addCode(c.if( - c.i32_ne( - c.getLocal("n"), - c.i32_shl( - c.i32_const(1), - c.getLocal("bits") - ) - ), - c.unreachable() - )); - - f.addCode(c.if( - c.i32_gt_u( - c.getLocal("bits"), - c.i32_const(maxBits) - ), - c.unreachable() - )); - - f.addCode(c.getLocal("bits")); - } - - function buildFFT() { - const f = module.addFunction(prefix+"_fft"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - - f.addLocal("bits", "i32"); - - const c = f.getCodeBuilder(); - - const One = c.i32_const(module.alloc(n8f)); - - f.addCode( - c.setLocal( - "bits", - c.call( - prefix + "__log2", - c.getLocal("n") - ) - ), - c.call(fPrefix + "_one", One), - c.call( - prefix+"_rawfft", - c.getLocal("px"), - c.getLocal("bits"), - c.i32_const(0), - One - ) - ); - - } - - function buildIFFT() { - const f = module.addFunction(prefix+"_ifft"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - f.addLocal("bits", "i32"); - f.addLocal("pInv2", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "bits", - c.call( - prefix + "__log2", - c.getLocal("n") - ) - ), - c.setLocal( - "pInv2", - c.i32_add( - c.i32_const(INV2), - c.i32_mul( - c.getLocal("bits"), - c.i32_const(n8f) - ) - ) - ), - - c.call( - prefix+"_rawfft", - c.getLocal("px"), - c.getLocal("bits"), - c.i32_const(1), - c.getLocal("pInv2") - ), - ); - } - - function buildRawFFT() { - const f = module.addFunction(prefix+"_rawfft"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); // 2 power - f.addParam("reverse", "i32"); - f.addParam("mulFactor", "i32"); - - f.addLocal("s", "i32"); - f.addLocal("k", "i32"); - f.addLocal("j", "i32"); - f.addLocal("m", "i32"); - f.addLocal("mdiv2", "i32"); - f.addLocal("n", "i32"); - f.addLocal("pwm", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.call(prefix + "__reversePermutation", c.getLocal("px"), c.getLocal("bits")), - c.setLocal("n", c.i32_shl(c.i32_const(1), c.getLocal("bits"))), - c.setLocal("s", c.i32_const(1)), - c.block(c.loop( - c.br_if( - 1, - c.i32_gt_u( - c.getLocal("s"), - c.getLocal("bits") - ) - ), - c.setLocal("m", c.i32_shl(c.i32_const(1), c.getLocal("s"))), - c.setLocal("pwm", - c.i32_add( - c.i32_const(ROOTs), - c.i32_mul( - c.getLocal("s"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("k", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("k"), - c.getLocal("n") - ) - ), - - c.call(fPrefix + "_one", W), - - c.setLocal("mdiv2", c.i32_shr_u(c.getLocal("m"), c.i32_const(1)) ), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("j"), - c.getLocal("mdiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.i32_add( - c.getLocal("k"), - c.getLocal("j") - ), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("idx1"), - c.i32_mul( - c.getLocal("mdiv2"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("pwm"), - W, - ), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal("k", c.i32_add(c.getLocal("k"), c.getLocal("m"))), - c.br(0) - )), - - c.setLocal("s", c.i32_add(c.getLocal("s"), c.i32_const(1))), - c.br(0) - )), - c.call( - prefix + "__fftFinal", - c.getLocal("px"), - c.getLocal("bits"), - c.getLocal("reverse"), - c.getLocal("mulFactor") - ) - ); - } - - - function buildFinalInverse() { - const f = module.addFunction(prefix+"__fftFinal"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); - f.addParam("reverse", "i32"); - f.addParam("mulFactor", "i32"); - f.addLocal("n", "i32"); - f.addLocal("ndiv2", "i32"); - f.addLocal("pInv2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("mask", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.if( - c.i32_and( - c.i32_eqz(c.getLocal("reverse")), - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")) - ), - c.ret([]) - ), - c.setLocal("n", c.i32_shl( c.i32_const(1), c.getLocal("bits"))), - - c.setLocal("mask", c.i32_sub( c.getLocal("n") , c.i32_const(1))), - c.setLocal("i", c.i32_const(1)), - c.setLocal( - "ndiv2", - c.i32_shr_u( - c.getLocal("n"), - c.i32_const(1) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("i"), - c.getLocal("ndiv2") - ) - ), - - c.setLocal("idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.i32_sub( - c.getLocal("n"), - c.getLocal("i") - ), - c.i32_const(n8g) - ) - ) - ), - - c.if( - c.getLocal("reverse"), - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(gPrefix + "_copy", c.getLocal("idx2") , c.getLocal("idx1") ), - ...c.call(gPrefix + "_copy", T , c.getLocal("idx2")), - ], - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(opGtimesF , c.getLocal("idx2") , c.getLocal("mulFactor"), c.getLocal("idx1") ), - ...c.call(opGtimesF , T , c.getLocal("mulFactor"), c.getLocal("idx2")), - ] - ), - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - // Do nothing (It should not be here) - ], - [ - ...c.call(opGtimesF , c.getLocal("idx1") , c.getLocal("mulFactor"), c.getLocal("idx1") ), - ...c.call(opGtimesF , c.getLocal("idx2") , c.getLocal("mulFactor"), c.getLocal("idx2")), - ] - ) - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - - c.br(0) - )), - - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - // Do nothing (It should not be here) - ], - [ - ...c.call(opGtimesF, c.getLocal("px") , c.getLocal("mulFactor"), c.getLocal("px")), - ...c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ) - ), - ...c.call(opGtimesF, c.getLocal("idx2"),c.getLocal("mulFactor"), c.getLocal("idx2")) - ] - ) - ); - } - - function buildReversePermutation() { - const f = module.addFunction(prefix+"__reversePermutation"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); - f.addLocal("n", "i32"); - f.addLocal("i", "i32"); - f.addLocal("ri", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("n", c.i32_shl( c.i32_const(1), c.getLocal("bits"))), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal("idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("ri", c.call(prefix + "__rev", c.getLocal("i"), c.getLocal("bits"))), - - c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("ri"), - c.i32_const(n8g) - ) - ) - ), - - c.if( - c.i32_lt_u( - c.getLocal("i"), - c.getLocal("ri") - ), - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(gPrefix + "_copy", c.getLocal("idx2") , c.getLocal("idx1")), - ...c.call(gPrefix + "_copy", T , c.getLocal("idx2")) - ] - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - - c.br(0) - )) - ); - } - - function buildRev() { - const f = module.addFunction(prefix+"__rev"); - f.addParam("x", "i32"); - f.addParam("bits", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.i32_rotl( - c.i32_add( - c.i32_add( - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.getLocal("x"), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(24) - ), - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(8) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(16) - ), - ), - c.i32_add( - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(16) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(8) - ), - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(24) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - ) - ), - c.getLocal("bits") - ) - ); - } - - - function buildFFTJoin() { - const f = module.addFunction(prefix+"_fftJoin"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W, - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - function buildFFTJoinExt() { - const f = module.addFunction(prefix+"_fftJoinExt"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - gPrefix + "_add", - c.getLocal("idx1"), - c.getLocal("idx2"), - U - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("pShiftToM"), - c.getLocal("idx2") - ), - - c.call( - gPrefix + "_add", - c.getLocal("idx1"), - c.getLocal("idx2"), - c.getLocal("idx2") - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - c.getLocal("idx2"), - ), - - c.call( - gPrefix + "_copy", - U, - c.getLocal("idx1") - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - function buildFFTJoinExtInv() { - const f = module.addFunction(prefix+"_fftJoinExtInv"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - f.addLocal("pSConst", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("pSConst", - c.i32_add( - c.i32_const(SCONST), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx1"), - U, - c.getLocal("idx2"), - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("pSConst"), - c.getLocal("idx2") - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pShiftToM"), - c.getLocal("idx1") - ), - - c.call( - gPrefix + "_sub", - U, - c.getLocal("idx1"), - c.getLocal("idx1") - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pSConst"), - c.getLocal("idx1") - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - - function buildPrepareLagrangeEvaluation() { - const f = module.addFunction(prefix+"_prepareLagrangeEvaluation"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - f.addLocal("pSConst", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("pSConst", - c.i32_add( - c.i32_const(SCONST), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pShiftToM"), - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx2"), - U, - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx1"), - c.getLocal("idx2"), - c.getLocal("idx2"), - ), - - c.call( - opGtimesF, - U, - c.getLocal("pSConst"), - c.getLocal("idx1"), - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - function buildFFTMix() { - const f = module.addFunction(prefix+"_fftMix"); - f.addParam("pBuff", "i32"); - f.addParam("n", "i32"); - f.addParam("exp", "i32"); - f.addLocal("nGroups", "i32"); - f.addLocal("nPerGroup", "i32"); - f.addLocal("nPerGroupDiv2", "i32"); - f.addLocal("pairOffset", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("pwm", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("nPerGroup", c.i32_shl(c.i32_const(1), c.getLocal("exp"))), - c.setLocal("nPerGroupDiv2", c.i32_shr_u(c.getLocal("nPerGroup"), c.i32_const(1))), - c.setLocal("nGroups", c.i32_shr_u(c.getLocal("n"), c.getLocal("exp"))), - c.setLocal("pairOffset", c.i32_mul(c.getLocal("nPerGroupDiv2"), c.i32_const(n8g))), - c.setLocal("pwm", - c.i32_add( - c.i32_const(ROOTs), - c.i32_mul( - c.getLocal("exp"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("nGroups") - ) - ), - c.call( fPrefix + "_one", W), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("nPerGroupDiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.i32_add( - c.i32_mul( - c.getLocal("i"), - c.getLocal("nPerGroup") - ), - c.getLocal("j") - ), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("idx1"), - c.getLocal("pairOffset") - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("pwm"), - W, - ), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - // Reverse all and multiply by factor - function buildFFTFinal() { - const f = module.addFunction(prefix+"_fftFinal"); - f.addParam("pBuff", "i32"); - f.addParam("n", "i32"); - f.addParam("factor", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("ndiv2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("ndiv2", c.i32_shr_u(c.getLocal("n"), c.i32_const(1))), - c.if( - c.i32_and( - c.getLocal("n"), - c.i32_const(1) - ), - c.call( - opGtimesF, - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ), - c.getLocal("factor"), - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ), - ), - ), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("i"), - c.getLocal("ndiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.i32_sub( - c.i32_sub( - c.getLocal("n"), - c.i32_const(1) - ), - c.getLocal("i") - ), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("factor"), - T - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("factor"), - c.getLocal("idx2"), - ), - - c.call( - gPrefix + "_copy", - T, - c.getLocal("idx1"), - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - buildRev(); - buildReversePermutation(); - buildFinalInverse(); - buildRawFFT(); - buildLog2(); - buildFFT(); - buildIFFT(); - buildFFTJoin(); - buildFFTJoinExt(); - buildFFTJoinExtInv(); - buildFFTMix(); - buildFFTFinal(); - buildPrepareLagrangeEvaluation(); - - module.exportFunction(prefix+"_fft"); - module.exportFunction(prefix+"_ifft"); - module.exportFunction(prefix+"_rawfft"); - module.exportFunction(prefix+"_fftJoin"); - module.exportFunction(prefix+"_fftJoinExt"); - module.exportFunction(prefix+"_fftJoinExtInv"); - module.exportFunction(prefix+"_fftMix"); - module.exportFunction(prefix+"_fftFinal"); - module.exportFunction(prefix+"_prepareLagrangeEvaluation"); - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_pol = function buildPol(module, prefix, prefixField) { - - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; - - - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - f.addLocal("lastp", "i32"); - f.addLocal("p", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("p", c.getLocal("px")), - c.setLocal( - "lastp", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("p"), - c.getLocal("lastp") - ) - ), - c.call(prefixField + "_zero", c.getLocal("p")), - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - function buildConstructLC() { - const f = module.addFunction(prefix+"_constructLC"); - f.addParam("ppolynomials", "i32"); - f.addParam("psignals", "i32"); - f.addParam("nSignals", "i32"); - f.addParam("pres", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("pp", "i32"); - f.addLocal("ps", "i32"); - f.addLocal("pd", "i32"); - f.addLocal("ncoefs", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("i", c.i32_const(0)), - c.setLocal("pp", c.getLocal("ppolynomials")), - c.setLocal("ps", c.getLocal("psignals")), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("nSignals") - ) - ), - - c.setLocal("ncoefs", c.i32_load(c.getLocal("pp"))), - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), - - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("ncoefs") - ) - ), - - c.setLocal( - "pd", - c.i32_add( - c.getLocal("pres"), - c.i32_mul( - c.i32_load(c.getLocal("pp")), - c.i32_const(n8) - ) - ) - ), - - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), - - - c.call( - prefixField + "_mul", - c.getLocal("ps"), - c.getLocal("pp"), - aux - ), - - c.call( - prefixField + "_add", - aux, - c.getLocal("pd"), - c.getLocal("pd") - ), - - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(n8))), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal("ps", c.i32_add(c.getLocal("ps"), c.i32_const(n8))), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - } - - buildZero(); - buildConstructLC(); - - - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_constructLC"); - - return prefix; - - - - -}; - -var build_qap = function buildQAP(module, prefix, prefixField) { - - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; - - - function buildBuildABC() { - const f = module.addFunction(prefix+"_buildABC"); - f.addParam("pCoefs", "i32"); - f.addParam("nCoefs", "i32"); - f.addParam("pWitness", "i32"); - f.addParam("pA", "i32"); - f.addParam("pB", "i32"); - f.addParam("pC", "i32"); - f.addParam("offsetOut", "i32"); - f.addParam("nOut", "i32"); - f.addParam("offsetWitness", "i32"); - f.addParam("nWitness", "i32"); - f.addLocal("it", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("last", "i32"); - f.addLocal("m", "i32"); - f.addLocal("c", "i32"); - f.addLocal("s", "i32"); - f.addLocal("pOut", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - - // Set output a and b to 0 - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("nOut"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call(prefixField + "_zero", c.getLocal("ita")), - c.call(prefixField + "_zero", c.getLocal("itb")), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.br(0) - )), - - - c.setLocal("it", c.getLocal("pCoefs")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pCoefs"), - c.i32_mul( - c.getLocal("nCoefs"), - c.i32_const(n8+12) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("it"), - c.getLocal("last") - ) - ), - c.setLocal( - "s", - c.i32_load(c.getLocal("it"), 8) - ), - c.if( - c.i32_or( - c.i32_lt_u( - c.getLocal("s"), - c.getLocal("offsetWitness"), - ), - c.i32_ge_u( - c.getLocal("s"), - c.i32_add( - c.getLocal("offsetWitness"), - c.getLocal("nWitness"), - ) - ) - ), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ), - - c.setLocal( - "m", - c.i32_load(c.getLocal("it")) - ), - c.if( - c.i32_eq(c.getLocal("m"), c.i32_const(0)), - c.setLocal("pOut", c.getLocal("pA")), - c.if( - c.i32_eq(c.getLocal("m"), c.i32_const(1)), - c.setLocal("pOut", c.getLocal("pB")), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ) - ), - c.setLocal( - "c", - c.i32_load(c.getLocal("it"), 4) - ), - c.if( - c.i32_or( - c.i32_lt_u( - c.getLocal("c"), - c.getLocal("offsetOut"), - ), - c.i32_ge_u( - c.getLocal("c"), - c.i32_add( - c.getLocal("offsetOut"), - c.getLocal("nOut"), - ) - ) - ), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ), - c.setLocal( - "pOut", - c.i32_add( - c.getLocal("pOut"), - c.i32_mul( - c.i32_sub( - c.getLocal("c"), - c.getLocal("offsetOut") - ), - c.i32_const(n8) - ) - ) - ), - c.call( - prefixField + "_mul", - c.i32_add( - c.getLocal("pWitness"), - c.i32_mul( - c.i32_sub(c.getLocal("s"), c.getLocal("offsetWitness")), - c.i32_const(n8) - ) - ), - c.i32_add( c.getLocal("it"), c.i32_const(12)), - aux - ), - c.call( - prefixField + "_add", - c.getLocal("pOut"), - aux, - c.getLocal("pOut"), - ), - c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - c.br(0) - )), - - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal("it", c.getLocal("pC")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("nOut"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_mul", - c.getLocal("ita"), - c.getLocal("itb"), - c.getLocal("it") - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8))), - c.br(0) - )), - - ); - } - - function buildJoinABC() { - const f = module.addFunction(prefix+"_joinABC"); - f.addParam("pA", "i32"); - f.addParam("pB", "i32"); - f.addParam("pC", "i32"); - f.addParam("n", "i32"); - f.addParam("pP", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("itc", "i32"); - f.addLocal("itp", "i32"); - f.addLocal("last", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal("itc", c.getLocal("pC")), - c.setLocal("itp", c.getLocal("pP")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_mul", - c.getLocal("ita"), - c.getLocal("itb"), - aux - ), - c.call( - prefixField + "_sub", - aux, - c.getLocal("itc"), - c.getLocal("itp"), - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("itc", c.i32_add(c.getLocal("itc"), c.i32_const(n8))), - c.setLocal("itp", c.i32_add(c.getLocal("itp"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - function buildBatchAdd() { - const f = module.addFunction(prefix+"_batchAdd"); - f.addParam("pa", "i32"); - f.addParam("pb", "i32"); - f.addParam("n", "i32"); - f.addParam("pr", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("itr", "i32"); - f.addLocal("last", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("ita", c.getLocal("pa")), - c.setLocal("itb", c.getLocal("pb")), - c.setLocal("itr", c.getLocal("pr")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pa"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_add", - c.getLocal("ita"), - c.getLocal("itb"), - c.getLocal("itr"), - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("itr", c.i32_add(c.getLocal("itr"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - buildBuildABC(); - buildJoinABC(); - buildBatchAdd(); - - module.exportFunction(prefix + "_buildABC"); - module.exportFunction(prefix + "_joinABC"); - module.exportFunction(prefix + "_batchAdd"); - - return prefix; - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_applykey = function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) { - - const f = module.addFunction(fnName); - f.addParam("pIn", "i32"); - f.addParam("n", "i32"); - f.addParam("pFirst", "i32"); - f.addParam("pInc", "i32"); - f.addParam("pOut", "i32"); - f.addLocal("pOldFree", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pFrom", "i32"); - f.addLocal("pTo", "i32"); - - const c = f.getCodeBuilder(); - - const t = c.i32_const(module.alloc(sizeF)); - - f.addCode( - c.setLocal("pFrom", c.getLocal("pIn")), - c.setLocal("pTo", c.getLocal("pOut")), - ); - - // t = first - f.addCode( - c.call( - frPrefix + "_copy", - c.getLocal("pFirst"), - t - ) - ); - f.addCode( - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if(1, c.i32_eq ( c.getLocal("i"), c.getLocal("n") )), - - c.call( - opGtimesF, - c.getLocal("pFrom"), - t, - c.getLocal("pTo") - ), - c.setLocal("pFrom", c.i32_add(c.getLocal("pFrom"), c.i32_const(sizeGIn))), - c.setLocal("pTo", c.i32_add(c.getLocal("pTo"), c.i32_const(sizeGOut))), - - // t = t* inc - c.call( - frPrefix + "_mul", - t, - c.getLocal("pInc"), - t - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - module.exportFunction(fnName); - -}; - -const utils$2 = utils$6; - -const buildF1m$1 =build_f1m; -const buildF1$1 =build_f1; -const buildF2m$1 =build_f2m; -const buildF3m$1 =build_f3m; -const buildCurve$1 =build_curve_jacobian_a0; -const buildFFT$2 = build_fft; -const buildPol$1 = build_pol; -const buildQAP$1 = build_qap; -const buildApplyKey$1 = build_applykey; -const { bitLength: bitLength$2, modInv, isOdd: isOdd$1, isNegative: isNegative$2 } = bigint; - -var build_bn128 = function buildBN128(module, _prefix) { - - const prefix = _prefix || "bn128"; - - if (module.modules[prefix]) return prefix; // already builded - - const q = 21888242871839275222246405745257275088696311157297823662689037894645226208583n; - const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; - - - const n64 = Math.floor((bitLength$2(q - 1n) - 1)/64) +1; - const n8 = n64*8; - const frsize = n8; - const f1size = n8; - const f2size = f1size * 2; - const ftsize = f1size * 12; - - const pr = module.alloc(utils$2.bigInt2BytesLE( r, frsize )); - - const f1mPrefix = buildF1m$1(module, q, "f1m"); - buildF1$1(module, r, "fr", "frm"); - - const pG1b = module.alloc(utils$2.bigInt2BytesLE( toMontgomery(3n), f1size )); - const g1mPrefix = buildCurve$1(module, "g1m", "f1m", pG1b); - - buildFFT$2(module, "frm", "frm", "frm", "frm_mul"); - - buildPol$1(module, "pol", "frm"); - buildQAP$1(module, "qap", "frm"); - - const f2mPrefix = buildF2m$1(module, "f1m_neg", "f2m", "f1m"); - const pG2b = module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size ) - ]); - const g2mPrefix = buildCurve$1(module, "g2m", "f2m", pG2b); - - - function buildGTimesFr(fnName, opMul) { - const f = module.addFunction(fnName); - f.addParam("pG", "i32"); - f.addParam("pFr", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call("frm_fromMontgomery", c.getLocal("pFr"), AUX), - c.call( - opMul, - c.getLocal("pG"), - AUX, - c.i32_const(n8), - c.getLocal("pr") - ) - ); - - module.exportFunction(fnName); - } - buildGTimesFr("g1m_timesFr", "g1m_timesScalar"); - buildFFT$2(module, "g1m", "g1m", "frm", "g1m_timesFr"); - - buildGTimesFr("g2m_timesFr", "g2m_timesScalar"); - buildFFT$2(module, "g2m", "g2m", "frm", "g2m_timesFr"); - - buildGTimesFr("g1m_timesFrAffine", "g1m_timesScalarAffine"); - buildGTimesFr("g2m_timesFrAffine", "g2m_timesScalarAffine"); - - buildApplyKey$1(module, "frm_batchApplyKey", "fmr", "frm", n8, n8, n8, "frm_mul"); - buildApplyKey$1(module, "g1m_batchApplyKey", "g1m", "frm", n8*3, n8*3, n8, "g1m_timesFr"); - buildApplyKey$1(module, "g1m_batchApplyKeyMixed", "g1m", "frm", n8*2, n8*3, n8, "g1m_timesFrAffine"); - buildApplyKey$1(module, "g2m_batchApplyKey", "g2m", "frm", n8*2*3, n8*3*2, n8, "g2m_timesFr"); - buildApplyKey$1(module, "g2m_batchApplyKeyMixed", "g2m", "frm", n8*2*2, n8*3*2, n8, "g2m_timesFrAffine"); - - function toMontgomery(a) { - return BigInt(a) * ( 1n << BigInt(f1size*8)) % q; - } - - const G1gen = [ - 1n, - 2n, - 1n - ]; - - const pG1gen = module.alloc( - [ - ...utils$2.bigInt2BytesLE( toMontgomery(G1gen[0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G1gen[1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G1gen[2]), f1size ), - ] - ); - - const G1zero = [ - 0n, - 1n, - 0n - ]; - - const pG1zero = module.alloc( - [ - ...utils$2.bigInt2BytesLE( toMontgomery(G1zero[0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G1zero[1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G1zero[2]), f1size ) - ] - ); - - const G2gen = [ - [ - 10857046999023057135944570762232829481370756359578518086990519993285655852781n, - 11559732032986387107991004021392285783925812861821192530917403151452391805634n, - ],[ - 8495653923123431417604973247489272438418190587263600148770280649306958101930n, - 4082367875863433681332203403145435568316851327593401208105741076214120093531n, - ],[ - 1n, - 0n, - ] - ]; - - const pG2gen = module.alloc( - [ - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[0][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[0][1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[1][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[1][1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[2][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2gen[2][1]), f1size ), - ] - ); - - const G2zero = [ - [ - 0n, - 0n, - ],[ - 1n, - 0n, - ],[ - 0n, - 0n, - ] - ]; - - const pG2zero = module.alloc( - [ - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[0][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[0][1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[1][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[1][1]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[2][0]), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(G2zero[2][1]), f1size ), - ] - ); - - const pOneT = module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery(1), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(0), f1size ), - ]); - - const pNonResidueF6 = module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery(9), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(1), f1size ), - ]); - - const pTwoInv = module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery( modInv(2n, q)), f1size ), - ...utils$2.bigInt2BytesLE( 0n, f1size ) - ]); - - const pAltBn128Twist = pNonResidueF6; - - const pTwistCoefB = module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size ), - ]); - - function build_mulNR6() { - const f = module.addFunction(prefix + "_mulNR6"); - f.addParam("x", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call( - f2mPrefix + "_mul", - c.i32_const(pNonResidueF6), - c.getLocal("x"), - c.getLocal("pr") - ) - ); - } - build_mulNR6(); - - const f6mPrefix = buildF3m$1(module, prefix+"_mulNR6", "f6m", "f2m"); - - function build_mulNR12() { - const f = module.addFunction(prefix + "_mulNR12"); - f.addParam("x", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call( - f2mPrefix + "_mul", - c.i32_const(pNonResidueF6), - c.i32_add(c.getLocal("x"), c.i32_const(n8*4)), - c.getLocal("pr") - ), - c.call( - f2mPrefix + "_copy", - c.getLocal("x"), - c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)), - ), - c.call( - f2mPrefix + "_copy", - c.i32_add(c.getLocal("x"), c.i32_const(n8*2)), - c.i32_add(c.getLocal("pr"), c.i32_const(n8*4)), - ) - ); - } - build_mulNR12(); - - const ftmPrefix = buildF2m$1(module, prefix+"_mulNR12", "ftm", f6mPrefix); - - - const ateLoopCount = 29793968203157093288n; - const ateLoopBitBytes = bits(ateLoopCount); - const pAteLoopBitBytes = module.alloc(ateLoopBitBytes); - - const ateCoefSize = 3 * f2size; - const ateNDblCoefs = ateLoopBitBytes.length-1; - const ateNAddCoefs = ateLoopBitBytes.reduce((acc, b) => acc + ( b!=0 ? 1 : 0) ,0); - const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1; - const prePSize = 3*2*n8; - const preQSize = 3*n8*2 + ateNCoefs*ateCoefSize; - - - module.modules[prefix] = { - n64: n64, - pG1gen: pG1gen, - pG1zero: pG1zero, - pG1b: pG1b, - pG2gen: pG2gen, - pG2zero: pG2zero, - pG2b: pG2b, - pq: module.modules["f1m"].pq, - pr: pr, - pOneT: pOneT, - prePSize: prePSize, - preQSize: preQSize, - r: r.toString(), - q: q.toString() - }; - - // console.log("PrePSize: " +prePSize); - // console.log("PreQSize: " +preQSize); - - const finalExpZ = 4965661367192848881n; - - function naf(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd$1(E)) { - const z = 2 - Number(E % 4n); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function bits(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd$1(E)) { - res.push( 1 ); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function buildPrepareG1() { - const f = module.addFunction(prefix+ "_prepareG1"); - f.addParam("pP", "i32"); - f.addParam("ppreP", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP")), // TODO Remove if already in affine - ); - } - - function buildPrepAddStep() { - const f = module.addFunction(prefix+ "_prepAddStep"); - f.addParam("pQ", "i32"); - f.addParam("pR", "i32"); - f.addParam("pCoef", "i32"); - - const c = f.getCodeBuilder(); - - const X2 = c.getLocal("pQ"); - const Y2 = c.i32_add(c.getLocal("pQ"), c.i32_const(f2size)); - - const X1 = c.getLocal("pR"); - const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); - const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*f2size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - const D = ELL_VW; - const E = c.i32_const(module.alloc(f2size)); - const F = c.i32_const(module.alloc(f2size)); - const G = c.i32_const(module.alloc(f2size)); - const H = c.i32_const(module.alloc(f2size)); - const I = c.i32_const(module.alloc(f2size)); - const J = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - // D = X1 - X2*Z1 - c.call(f2mPrefix + "_mul", X2, Z1, D), - c.call(f2mPrefix + "_sub", X1, D, D), - - // E = Y1 - Y2*Z1 - c.call(f2mPrefix + "_mul", Y2, Z1, E), - c.call(f2mPrefix + "_sub", Y1, E, E), - - // F = D^2 - c.call(f2mPrefix + "_square", D, F), - - // G = E^2 - c.call(f2mPrefix + "_square", E, G), - - // H = D*F - c.call(f2mPrefix + "_mul", D, F, H), - - // I = X1 * F - c.call(f2mPrefix + "_mul", X1, F, I), - - // J = H + Z1*G - (I+I) - c.call(f2mPrefix + "_add", I, I, AUX), - c.call(f2mPrefix + "_mul", Z1, G, J), - c.call(f2mPrefix + "_add", H, J, J), - c.call(f2mPrefix + "_sub", J, AUX, J), - - - // X3 (X1) = D*J - c.call(f2mPrefix + "_mul", D, J, X1), - - // Y3 (Y1) = E*(I-J)-(H*Y1) - c.call(f2mPrefix + "_mul", H, Y1, Y1), - c.call(f2mPrefix + "_sub", I, J, AUX), - c.call(f2mPrefix + "_mul", E, AUX, AUX), - c.call(f2mPrefix + "_sub", AUX, Y1, Y1), - - // Z3 (Z1) = Z1*H - c.call(f2mPrefix + "_mul", Z1, H, Z1), - - // ell_0 = xi * (E * X2 - D * Y2) - c.call(f2mPrefix + "_mul", D, Y2, AUX), - c.call(f2mPrefix + "_mul", E, X2, ELL_0), - c.call(f2mPrefix + "_sub", ELL_0, AUX, ELL_0), - c.call(f2mPrefix + "_mul", ELL_0, c.i32_const(pAltBn128Twist), ELL_0), - - - // ell_VV = - E (later: * xP) - c.call(f2mPrefix + "_neg", E, ELL_VV), - - // ell_VW = D (later: * yP ) - // Already assigned - - ); - } - - - - function buildPrepDoubleStep() { - const f = module.addFunction(prefix+ "_prepDblStep"); - f.addParam("pR", "i32"); - f.addParam("pCoef", "i32"); - - const c = f.getCodeBuilder(); - - const X1 = c.getLocal("pR"); - const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); - const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*f2size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - const A = c.i32_const(module.alloc(f2size)); - const B = c.i32_const(module.alloc(f2size)); - const C = c.i32_const(module.alloc(f2size)); - const D = c.i32_const(module.alloc(f2size)); - const E = c.i32_const(module.alloc(f2size)); - const F = c.i32_const(module.alloc(f2size)); - const G = c.i32_const(module.alloc(f2size)); - const H = c.i32_const(module.alloc(f2size)); - const I = c.i32_const(module.alloc(f2size)); - const J = c.i32_const(module.alloc(f2size)); - const E2 = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // A = X1 * Y1 / 2 - c.call(f2mPrefix + "_mul", Y1, c.i32_const(pTwoInv), A), - c.call(f2mPrefix + "_mul", X1, A, A), - - // B = Y1^2 - c.call(f2mPrefix + "_square", Y1, B), - - // C = Z1^2 - c.call(f2mPrefix + "_square", Z1, C), - - // D = 3 * C - c.call(f2mPrefix + "_add", C, C, D), - c.call(f2mPrefix + "_add", D, C, D), - - // E = twist_b * D - c.call(f2mPrefix + "_mul", c.i32_const(pTwistCoefB), D, E), - - // F = 3 * E - c.call(f2mPrefix + "_add", E, E, F), - c.call(f2mPrefix + "_add", E, F, F), - - // G = (B+F)/2 - c.call(f2mPrefix + "_add", B, F, G), - c.call(f2mPrefix + "_mul", G, c.i32_const(pTwoInv), G), - - // H = (Y1+Z1)^2-(B+C) - c.call(f2mPrefix + "_add", B, C, AUX), - c.call(f2mPrefix + "_add", Y1, Z1, H), - c.call(f2mPrefix + "_square", H, H), - c.call(f2mPrefix + "_sub", H, AUX, H), - - // I = E-B - c.call(f2mPrefix + "_sub", E, B, I), - - // J = X1^2 - c.call(f2mPrefix + "_square", X1, J), - - // E_squared = E^2 - c.call(f2mPrefix + "_square", E, E2), - - // X3 (X1) = A * (B-F) - c.call(f2mPrefix + "_sub", B, F, AUX), - c.call(f2mPrefix + "_mul", A, AUX, X1), - - // Y3 (Y1) = G^2 - 3*E^2 - c.call(f2mPrefix + "_add", E2, E2, AUX), - c.call(f2mPrefix + "_add", E2, AUX, AUX), - c.call(f2mPrefix + "_square", G, Y1), - c.call(f2mPrefix + "_sub", Y1, AUX, Y1), - - // Z3 (Z1) = B * H - c.call(f2mPrefix + "_mul", B, H, Z1), - - // ell_0 = xi * I - c.call(f2mPrefix + "_mul", c.i32_const(pAltBn128Twist), I, ELL_0), - - // ell_VW = - H (later: * yP) - c.call(f2mPrefix + "_neg", H, ELL_VW), - - // ell_VV = 3*J (later: * xP) - c.call(f2mPrefix + "_add", J, J, ELL_VV), - c.call(f2mPrefix + "_add", J, ELL_VV, ELL_VV), - - ); - } - - function buildMulByQ() { - const f = module.addFunction(prefix + "_mulByQ"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(f2size)); - const z = c.i32_add(c.getLocal("p1"), c.i32_const(f2size*2)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size*2)); - - const MulByQX = c.i32_const(module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery("21575463638280843010398324269430826099269044274347216827212613867836435027261"), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery("10307601595873709700152284273816112264069230130616436755625194854815875713954"), f1size ), - ])); - - const MulByQY = c.i32_const(module.alloc([ - ...utils$2.bigInt2BytesLE( toMontgomery("2821565182194536844548159561693502659359617185244120367078079554186484126554"), f1size ), - ...utils$2.bigInt2BytesLE( toMontgomery("3505843767911556378687030309984248845540243509899259641013678093033130930403"), f1size ), - ])); - - f.addCode( - // The frobeniusMap(1) in this field, is the conjugate - c.call(f2mPrefix + "_conjugate", x, x3), - c.call(f2mPrefix + "_mul", MulByQX, x3, x3), - c.call(f2mPrefix + "_conjugate", y, y3), - c.call(f2mPrefix + "_mul", MulByQY, y3, y3), - c.call(f2mPrefix + "_conjugate", z, z3), - ); - } - - - function buildPrepareG2() { - buildMulByQ(); - const f = module.addFunction(prefix+ "_prepareG2"); - f.addParam("pQ", "i32"); - f.addParam("ppreQ", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const QX = c.getLocal("pQ"); - - const pR = module.alloc(f2size*3); - const R = c.i32_const(pR); - const RX = c.i32_const(pR); - const RY = c.i32_const(pR+f2size); - const RZ = c.i32_const(pR+2*f2size); - - const cQX = c.i32_add( c.getLocal("ppreQ"), c.i32_const(0)); - const cQY = c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size)); - - const pQ1 = module.alloc(f2size*3); - const Q1 = c.i32_const(pQ1); - - const pQ2 = module.alloc(f2size*3); - const Q2 = c.i32_const(pQ2); - const Q2Y = c.i32_const(pQ2 + f2size); - - f.addCode( - c.call(g2mPrefix + "_normalize", QX, cQX), // TODO Remove if already in affine - c.call(f2mPrefix + "_copy", cQX, RX), - c.call(f2mPrefix + "_copy", cQY, RY), - c.call(f2mPrefix + "_one", RZ), - ); - - f.addCode( - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_prepAddStep", cQX, R, c.getLocal("pCoef")), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - f.addCode( - c.call(prefix + "_mulByQ", cQX, Q1), - c.call(prefix + "_mulByQ", Q1, Q2) - ); - - f.addCode( - c.call(f2mPrefix + "_neg", Q2Y, Q2Y), - - c.call(prefix + "_prepAddStep", Q1, R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.call(prefix + "_prepAddStep", Q2, R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ); - } - - function buildMulBy024Old() { - const f = module.addFunction(prefix+ "__mulBy024Old"); - f.addParam("pEll0", "i32"); - f.addParam("pEllVW", "i32"); - f.addParam("pEllVV", "i32"); - f.addParam("pR", "i32"); // Result in F12 - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("pEll0"); - const x2 = c.getLocal("pEllVV"); - const x4 = c.getLocal("pEllVW"); - - const z0 = c.getLocal("pR"); - - const pAUX12 = module.alloc(ftsize); - const AUX12 = c.i32_const(pAUX12); - const AUX12_0 = c.i32_const(pAUX12); - const AUX12_2 = c.i32_const(pAUX12+f2size); - const AUX12_4 = c.i32_const(pAUX12+f2size*2); - const AUX12_6 = c.i32_const(pAUX12+f2size*3); - const AUX12_8 = c.i32_const(pAUX12+f2size*4); - const AUX12_10 = c.i32_const(pAUX12+f2size*5); - - f.addCode( - - c.call(f2mPrefix + "_copy", x0, AUX12_0), - c.call(f2mPrefix + "_zero", AUX12_2), - c.call(f2mPrefix + "_copy", x2, AUX12_4), - c.call(f2mPrefix + "_zero", AUX12_6), - c.call(f2mPrefix + "_copy", x4, AUX12_8), - c.call(f2mPrefix + "_zero", AUX12_10), - c.call(ftmPrefix + "_mul", AUX12, z0, z0), - ); - } - - function buildMulBy024() { - const f = module.addFunction(prefix+ "__mulBy024"); - f.addParam("pEll0", "i32"); - f.addParam("pEllVW", "i32"); - f.addParam("pEllVV", "i32"); - f.addParam("pR", "i32"); // Result in F12 - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("pEll0"); - const x2 = c.getLocal("pEllVV"); - const x4 = c.getLocal("pEllVW"); - - const z0 = c.getLocal("pR"); - const z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*n8)); - const z2 = c.i32_add(c.getLocal("pR"), c.i32_const(4*n8)); - const z3 = c.i32_add(c.getLocal("pR"), c.i32_const(6*n8)); - const z4 = c.i32_add(c.getLocal("pR"), c.i32_const(8*n8)); - const z5 = c.i32_add(c.getLocal("pR"), c.i32_const(10*n8)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const s0 = c.i32_const(module.alloc(f2size)); - const T3 = c.i32_const(module.alloc(f2size)); - const T4 = c.i32_const(module.alloc(f2size)); - const D0 = c.i32_const(module.alloc(f2size)); - const D2 = c.i32_const(module.alloc(f2size)); - const D4 = c.i32_const(module.alloc(f2size)); - const S1 = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // D0 = z0 * x0; - c.call(f2mPrefix + "_mul", z0, x0, D0), - // D2 = z2 * x2; - c.call(f2mPrefix + "_mul", z2, x2, D2), - // D4 = z4 * x4; - c.call(f2mPrefix + "_mul", z4, x4, D4), - // t2 = z0 + z4; - c.call(f2mPrefix + "_add", z0, z4, t2), - // t1 = z0 + z2; - c.call(f2mPrefix + "_add", z0, z2, t1), - // s0 = z1 + z3 + z5; - c.call(f2mPrefix + "_add", z1, z3, s0), - c.call(f2mPrefix + "_add", s0, z5, s0), - - - // For z.a_.a_ = z0. - // S1 = z1 * x2; - c.call(f2mPrefix + "_mul", z1, x2, S1), - // T3 = S1 + D4; - c.call(f2mPrefix + "_add", S1, D4, T3), - // T4 = my_Fp6::non_residue * T3 + D0; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - c.call(f2mPrefix + "_add", T4, D0, z0), - // z0 = T4; - - // For z.a_.b_ = z1 - // T3 = z5 * x4; - c.call(f2mPrefix + "_mul", z5, x4, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T3 = T3 + D2; - c.call(f2mPrefix + "_add", T3, D2, T3), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // T3 = z1 * x0; - c.call(f2mPrefix + "_mul", z1, x0, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z1), - // z1 = T4; - - - - // For z.a_.c_ = z2 - // t0 = x0 + x2; - c.call(f2mPrefix + "_add", x0, x2, t0), - // T3 = t1 * t0 - D0 - D2; - c.call(f2mPrefix + "_mul", t1, t0, T3), - c.call(f2mPrefix + "_add", D0, D2, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = z3 * x4; - c.call(f2mPrefix + "_mul", z3, x4, T4), - // S1 = S1 + T4; - c.call(f2mPrefix + "_add", S1, T4, S1), - - - // For z.b_.a_ = z3 (z3 needs z2) - // t0 = z2 + z4; - c.call(f2mPrefix + "_add", z2, z4, t0), - // T3 = T3 + T4; - // z2 = T3; - c.call(f2mPrefix + "_add", T3, T4, z2), - // t1 = x2 + x4; - c.call(f2mPrefix + "_add", x2, x4, t1), - // T3 = t0 * t1 - D2 - D4; - c.call(f2mPrefix + "_mul", t1, t0, T3), - c.call(f2mPrefix + "_add", D2, D4, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // T3 = z3 * x0; - c.call(f2mPrefix + "_mul", z3, x0, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z3), - // z3 = T4; - - // For z.b_.b_ = z4 - // T3 = z5 * x2; - c.call(f2mPrefix + "_mul", z5, x2, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // t0 = x0 + x4; - c.call(f2mPrefix + "_add", x0, x4, t0), - // T3 = t2 * t0 - D0 - D4; - c.call(f2mPrefix + "_mul", t2, t0, T3), - c.call(f2mPrefix + "_add", D0, D4, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z4), - // z4 = T4; - - // For z.b_.c_ = z5. - // t0 = x0 + x2 + x4; - c.call(f2mPrefix + "_add", x0, x2, t0), - c.call(f2mPrefix + "_add", t0, x4, t0), - // T3 = s0 * t0 - S1; - c.call(f2mPrefix + "_mul", s0, t0, T3), - c.call(f2mPrefix + "_sub", T3, S1, z5), - // z5 = T3; - - ); - } - - - function buildMillerLoop() { - const f = module.addFunction(prefix+ "_millerLoop"); - f.addParam("ppreP", "i32"); - f.addParam("ppreQ", "i32"); - f.addParam("r", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const preP_PX = c.getLocal("ppreP"); - const preP_PY = c.i32_add(c.getLocal("ppreP"), c.i32_const(f1size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - - const pVW = module.alloc(f2size); - const VW = c.i32_const(pVW); - const pVV = module.alloc(f2size); - const VV = c.i32_const(pVV); - - const F = c.getLocal("r"); - - - f.addCode( - c.call(ftmPrefix + "_one", F), - - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - - c.call(ftmPrefix + "_square", F, F), - - c.call(f2mPrefix + "_mul1", ELL_VW,preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - ...c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - - ...c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - - ); - - f.addCode( - c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - ); - - } - - - function buildFrobeniusMap(n) { - const F12 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [8376118865763821496583973867626364092589906065868298776909617916018768340080n, 16469823323077808223889137241176536799009286646108169935659301613961712198316n], - [21888242871839275220042445260109153167277707414472061641714758635765020556617n, 0n], - [11697423496358154304825782922584725312912383441159505038794027105778954184319n, 303847389135065887422783454877609941456349188919719272345083954437860409601n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [3321304630594332808241809054958361220322477375291206261884409189760185844239n, 5722266937896532885780051958958348231143373700109372999374820235121374419868n], - [21888242871839275222246405745257275088696311157297823662689037894645226208582n, 0n], - [13512124006075453725662431877630910996106405091429524885779419978626457868503n, 5418419548761466998357268504080738289687024511189653727029736280683514010267n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [10190819375481120917420622822672549775783927716138318623895010788866272024264n, 21584395482704209334823622290379665147239961968378104390343953940207365798982n], - [2203960485148121921418603742825762020974279258880205651967n, 0n], - [18566938241244942414004596690298913868373833782006617400804628704885040364344n, 16165975933942742336466353786298926857552937457188450663314217659523851788715n], - ] - ]; - - const F6 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [21575463638280843010398324269430826099269044274347216827212613867836435027261n, 10307601595873709700152284273816112264069230130616436755625194854815875713954n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [3772000881919853776433695186713858239009073593817195771773381919316419345261n, 2236595495967245188281701248203181795121068902605861227855261137820944008926n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [18429021223477853657660792034369865839114504446431234726392080002137598044644n, 9344045779998320333812420223237981029506012124075525679208581902008406485703n], - ], - [ - [1n, 0n], - [2581911344467009335267311115468803099551665605076196740867805258568234346338n, 19937756971775647987995932169929341994314640652964949448313374472400716661030n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [5324479202449903542726783395506214481928257762400643279780343368557297135718n, 16208900380737693084919495127334387981393726419856888799917914180988844123039n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [13981852324922362344252311234282257507216387789820983642040889267519694726527n, 7629828391165209371577384193250820201684255241773809077146787135900891633097n], - ] - ]; - - const f = module.addFunction(prefix+ "__frobeniusMap"+n); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i<6; i++) { - const X = (i==0) ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i*f2size)); - const Xc0 = X; - const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i*f2size + f1size)); - const R = (i==0) ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i*f2size)); - const Rc0 = R; - const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i*f2size + f1size)); - const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]); - const pCoef = module.alloc([ - ...utils$2.bigInt2BytesLE(toMontgomery(coef[0]), 32), - ...utils$2.bigInt2BytesLE(toMontgomery(coef[1]), 32), - ]); - if (n%2 == 1) { - f.addCode( - c.call(f1mPrefix + "_copy", Xc0, Rc0), - c.call(f1mPrefix + "_neg", Xc1, Rc1), - c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R), - ); - } else { - f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); - } - } - - function mul2(a, b) { - const ac0 = BigInt(a[0]); - const ac1 = BigInt(a[1]); - const bc0 = BigInt(b[0]); - const bc1 = BigInt(b[1]); - const res = [ - (ac0 * bc0 - ( ac1 * bc1) ) % q, - (ac0 * bc1 + ( ac1 * bc0) ) % q, - ]; - if (isNegative$2(res[0])) res[0] = res[0] + q; - return res; - } - - } - - - - function buildFinalExponentiationFirstChunk() { - - const f = module.addFunction(prefix+ "__finalExponentiationFirstChunk"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const eltC0 = elt; - const eltC1 = c.i32_add(elt, c.i32_const(n8*6)); - const r = c.getLocal("r"); - const pA = module.alloc(ftsize); - const A = c.i32_const(pA); - const Ac0 = A; - const Ac1 = c.i32_const(pA + n8*6); - const B = c.i32_const(module.alloc(ftsize)); - const C = c.i32_const(module.alloc(ftsize)); - const D = c.i32_const(module.alloc(ftsize)); - - f.addCode( - // const alt_bn128_Fq12 A = alt_bn128_Fq12(elt.c0,-elt.c1); - c.call(f6mPrefix + "_copy", eltC0, Ac0), - c.call(f6mPrefix + "_neg", eltC1, Ac1), - - // const alt_bn128_Fq12 B = elt.inverse(); - c.call(ftmPrefix + "_inverse", elt, B), - - // const alt_bn128_Fq12 C = A * B; - c.call(ftmPrefix + "_mul", A, B, C), - // const alt_bn128_Fq12 D = C.Frobenius_map(2); - c.call(prefix + "__frobeniusMap2", C, D), - // const alt_bn128_Fq12 result = D * C; - c.call(ftmPrefix + "_mul", C, D, r), - ); - } - - function buildCyclotomicSquare() { - const f = module.addFunction(prefix+ "__cyclotomicSquare"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); - const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2*f2size)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3*f2size)); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4*f2size)); - const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5*f2size)); - - const r0 = c.getLocal("r"); - const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); - const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2*f2size)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3*f2size)); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4*f2size)); - const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5*f2size)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const tmp = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - - f.addCode( - // // t0 + t1*y = (z0 + z1*y)^2 = a^2 - // tmp = z0 * z1; - // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp; - // t1 = tmp + tmp; - c.call(f2mPrefix + "_mul", x0, x1, tmp), - c.call(f2mPrefix + "_mul", x1, c.i32_const(pNonResidueF6), t0), - c.call(f2mPrefix + "_add", x0, t0, t0), - c.call(f2mPrefix + "_add", x0, x1, AUX), - c.call(f2mPrefix + "_mul", AUX, t0, t0), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t0, AUX, t0), - c.call(f2mPrefix + "_add", tmp, tmp, t1), - - // // t2 + t3*y = (z2 + z3*y)^2 = b^2 - // tmp = z2 * z3; - // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp; - // t3 = tmp + tmp; - c.call(f2mPrefix + "_mul", x2, x3, tmp), - c.call(f2mPrefix + "_mul", x3, c.i32_const(pNonResidueF6), t2), - c.call(f2mPrefix + "_add", x2, t2, t2), - c.call(f2mPrefix + "_add", x2, x3, AUX), - c.call(f2mPrefix + "_mul", AUX, t2, t2), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t2, AUX, t2), - c.call(f2mPrefix + "_add", tmp, tmp, t3), - - // // t4 + t5*y = (z4 + z5*y)^2 = c^2 - // tmp = z4 * z5; - // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp; - // t5 = tmp + tmp; - c.call(f2mPrefix + "_mul", x4, x5, tmp), - c.call(f2mPrefix + "_mul", x5, c.i32_const(pNonResidueF6), t4), - c.call(f2mPrefix + "_add", x4, t4, t4), - c.call(f2mPrefix + "_add", x4, x5, AUX), - c.call(f2mPrefix + "_mul", AUX, t4, t4), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t4, AUX, t4), - c.call(f2mPrefix + "_add", tmp, tmp, t5), - - // For A - // z0 = 3 * t0 - 2 * z0 - c.call(f2mPrefix + "_sub", t0, x0, r0), - c.call(f2mPrefix + "_add", r0, r0, r0), - c.call(f2mPrefix + "_add", t0, r0, r0), - // z1 = 3 * t1 + 2 * z1 - c.call(f2mPrefix + "_add", t1, x1, r1), - c.call(f2mPrefix + "_add", r1, r1, r1), - c.call(f2mPrefix + "_add", t1, r1, r1), - - // For B - // z2 = 3 * (xi * t5) + 2 * z2 - c.call(f2mPrefix + "_mul", t5, c.i32_const(pAltBn128Twist), AUX), - c.call(f2mPrefix + "_add", AUX, x2, r2), - c.call(f2mPrefix + "_add", r2, r2, r2), - c.call(f2mPrefix + "_add", AUX, r2, r2), - // z3 = 3 * t4 - 2 * z3 - c.call(f2mPrefix + "_sub", t4, x3, r3), - c.call(f2mPrefix + "_add", r3, r3, r3), - c.call(f2mPrefix + "_add", t4, r3, r3), - - // For C - // z4 = 3 * t2 - 2 * z4 - c.call(f2mPrefix + "_sub", t2, x4, r4), - c.call(f2mPrefix + "_add", r4, r4, r4), - c.call(f2mPrefix + "_add", t2, r4, r4), - // z5 = 3 * t3 + 2 * z5 - c.call(f2mPrefix + "_add", t3, x5, r5), - c.call(f2mPrefix + "_add", r5, r5, r5), - c.call(f2mPrefix + "_add", t3, r5, r5), - - ); - } - - - function buildCyclotomicExp(exponent, fnName) { - const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) ); - const pExponentNafBytes = module.alloc(exponentNafBytes); - - const f = module.addFunction(prefix+ "__cyclotomicExp_"+fnName); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("bit", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("x"); - - const res = c.getLocal("r"); - - const inverse = c.i32_const(module.alloc(ftsize)); - - - f.addCode( - c.call(ftmPrefix + "_conjugate", x, inverse), - c.call(ftmPrefix + "_one", res), - - c.if( - c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - - c.setLocal("i", c.i32_const(exponentNafBytes.length-2)), - c.block(c.loop( - c.call(prefix + "__cyclotomicSquare", res, res), - c.if( - c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - - function buildFinalExponentiationLastChunk() { - buildCyclotomicSquare(); - buildCyclotomicExp(finalExpZ, "w0"); - - const f = module.addFunction(prefix+ "__finalExponentiationLastChunk"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const result = c.getLocal("r"); - const A = c.i32_const(module.alloc(ftsize)); - const B = c.i32_const(module.alloc(ftsize)); - const C = c.i32_const(module.alloc(ftsize)); - const D = c.i32_const(module.alloc(ftsize)); - const E = c.i32_const(module.alloc(ftsize)); - const F = c.i32_const(module.alloc(ftsize)); - const G = c.i32_const(module.alloc(ftsize)); - const H = c.i32_const(module.alloc(ftsize)); - const I = c.i32_const(module.alloc(ftsize)); - const J = c.i32_const(module.alloc(ftsize)); - const K = c.i32_const(module.alloc(ftsize)); - const L = c.i32_const(module.alloc(ftsize)); - const M = c.i32_const(module.alloc(ftsize)); - const N = c.i32_const(module.alloc(ftsize)); - const O = c.i32_const(module.alloc(ftsize)); - const P = c.i32_const(module.alloc(ftsize)); - const Q = c.i32_const(module.alloc(ftsize)); - const R = c.i32_const(module.alloc(ftsize)); - const S = c.i32_const(module.alloc(ftsize)); - const T = c.i32_const(module.alloc(ftsize)); - const U = c.i32_const(module.alloc(ftsize)); - - f.addCode( - - - // A = exp_by_neg_z(elt) // = elt^(-z) - c.call(prefix + "__cyclotomicExp_w0", elt, A), - c.call(ftmPrefix + "_conjugate", A, A), - // B = A^2 // = elt^(-2*z) - c.call(prefix + "__cyclotomicSquare", A, B), - // C = B^2 // = elt^(-4*z) - c.call(prefix + "__cyclotomicSquare", B, C), - // D = C * B // = elt^(-6*z) - c.call(ftmPrefix + "_mul", C, B, D), - // E = exp_by_neg_z(D) // = elt^(6*z^2) - c.call(prefix + "__cyclotomicExp_w0", D, E), - c.call(ftmPrefix + "_conjugate", E, E), - // F = E^2 // = elt^(12*z^2) - c.call(prefix + "__cyclotomicSquare", E, F), - // G = epx_by_neg_z(F) // = elt^(-12*z^3) - c.call(prefix + "__cyclotomicExp_w0", F, G), - c.call(ftmPrefix + "_conjugate", G, G), - // H = conj(D) // = elt^(6*z) - c.call(ftmPrefix + "_conjugate", D, H), - // I = conj(G) // = elt^(12*z^3) - c.call(ftmPrefix + "_conjugate", G, I), - // J = I * E // = elt^(12*z^3 + 6*z^2) - c.call(ftmPrefix + "_mul", I, E, J), - // K = J * H // = elt^(12*z^3 + 6*z^2 + 6*z) - c.call(ftmPrefix + "_mul", J, H, K), - // L = K * B // = elt^(12*z^3 + 6*z^2 + 4*z) - c.call(ftmPrefix + "_mul", K, B, L), - // M = K * E // = elt^(12*z^3 + 12*z^2 + 6*z) - c.call(ftmPrefix + "_mul", K, E, M), - - // N = M * elt // = elt^(12*z^3 + 12*z^2 + 6*z + 1) - c.call(ftmPrefix + "_mul", M, elt, N), - - // O = L.Frobenius_map(1) // = elt^(q*(12*z^3 + 6*z^2 + 4*z)) - c.call(prefix + "__frobeniusMap1", L, O), - // P = O * N // = elt^(q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", O, N, P), - // Q = K.Frobenius_map(2) // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z)) - c.call(prefix + "__frobeniusMap2", K, Q), - // R = Q * P // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", Q, P, R), - // S = conj(elt) // = elt^(-1) - c.call(ftmPrefix + "_conjugate", elt, S), - // T = S * L // = elt^(12*z^3 + 6*z^2 + 4*z - 1) - c.call(ftmPrefix + "_mul", S, L, T), - // U = T.Frobenius_map(3) // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1)) - c.call(prefix + "__frobeniusMap3", T, U), - // V = U * R // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1) + q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", U, R, result), - // result = V - ); - } - - - function buildFinalExponentiation() { - buildFinalExponentiationFirstChunk(); - buildFinalExponentiationLastChunk(); - const f = module.addFunction(prefix+ "_finalExponentiation"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const result = c.getLocal("r"); - const eltToFirstChunk = c.i32_const(module.alloc(ftsize)); - - f.addCode( - c.call(prefix + "__finalExponentiationFirstChunk", elt, eltToFirstChunk ), - c.call(prefix + "__finalExponentiationLastChunk", eltToFirstChunk, result ) - ); - } - - - function buildFinalExponentiationOld() { - const f = module.addFunction(prefix+ "_finalExponentiationOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const exponent = 552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480n; - - const pExponent = module.alloc(utils$2.bigInt2BytesLE( exponent, 352 )); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(352), c.getLocal("r")), - ); - } - - - - - const pPreP = module.alloc(prePSize); - const pPreQ = module.alloc(preQSize); - - function buildPairingEquation(nPairings) { - - const f = module.addFunction(prefix+ "_pairingEq"+nPairings); - for (let i=0; i acc + ( b!=0 ? 1 : 0) ,0); - const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1; - const prePSize = 3*2*n8q; - const preQSize = 3*n8q*2 + ateNCoefs*ateCoefSize; - const finalExpIsNegative = true; - - const finalExpZ = 15132376222941642752n; - - - module.modules[prefix] = { - n64q: n64q, - n64r: n64r, - n8q: n8q, - n8r: n8r, - pG1gen: pG1gen, - pG1zero: pG1zero, - pG1b: pG1b, - pG2gen: pG2gen, - pG2zero: pG2zero, - pG2b: pG2b, - pq: module.modules["f1m"].pq, - pr: pr, - pOneT: pOneT, - r: r, - q: q, - prePSize: prePSize, - preQSize: preQSize - }; - - - function naf(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd(E)) { - const z = 2 - Number(E % 4n); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function bits(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd(E)) { - res.push( 1 ); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function buildPrepareG1() { - const f = module.addFunction(prefix+ "_prepareG1"); - f.addParam("pP", "i32"); - f.addParam("ppreP", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP")), // TODO Remove if already in affine - ); - } - - - - function buildPrepDoubleStep() { - const f = module.addFunction(prefix+ "_prepDblStep"); - f.addParam("R", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const Rx = c.getLocal("R"); - const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2*n8q)); - const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4*n8q)); - - const t0 = c.getLocal("r"); - const t3 = c.i32_add(c.getLocal("r"), c.i32_const(2*n8q)); - const t6 = c.i32_add(c.getLocal("r"), c.i32_const(4*n8q)); - - - const zsquared = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // tmp0 = r.x.square(); - c.call(f2mPrefix + "_square", Rx, t0), - - // tmp1 = r.y.square(); - c.call(f2mPrefix + "_square", Ry, t1), - - // tmp2 = tmp1.square(); - c.call(f2mPrefix + "_square", t1, t2), - - // tmp3 = (tmp1 + r.x).square() - tmp0 - tmp2; - c.call(f2mPrefix + "_add", t1, Rx, t3), - c.call(f2mPrefix + "_square", t3, t3), - c.call(f2mPrefix + "_sub", t3, t0, t3), - c.call(f2mPrefix + "_sub", t3, t2, t3), - - // tmp3 = tmp3 + tmp3; - c.call(f2mPrefix + "_add", t3, t3, t3), - - // tmp4 = tmp0 + tmp0 + tmp0; - c.call(f2mPrefix + "_add", t0, t0, t4), - c.call(f2mPrefix + "_add", t4, t0, t4), - - // tmp6 = r.x + tmp4; - c.call(f2mPrefix + "_add", Rx, t4, t6), - - // tmp5 = tmp4.square(); - c.call(f2mPrefix + "_square", t4, t5), - - // zsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, zsquared), - - // r.x = tmp5 - tmp3 - tmp3; - c.call(f2mPrefix + "_sub", t5, t3, Rx), - c.call(f2mPrefix + "_sub", Rx, t3, Rx), - - // r.z = (r.z + r.y).square() - tmp1 - zsquared; - c.call(f2mPrefix + "_add", Rz, Ry, Rz), - c.call(f2mPrefix + "_square", Rz, Rz), - c.call(f2mPrefix + "_sub", Rz, t1, Rz), - c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), - - // r.y = (tmp3 - r.x) * tmp4; - c.call(f2mPrefix + "_sub", t3, Rx, Ry), - c.call(f2mPrefix + "_mul", Ry, t4, Ry), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // r.y -= tmp2; - c.call(f2mPrefix + "_sub", Ry, t2, Ry), - - // tmp3 = tmp4 * zsquared; - c.call(f2mPrefix + "_mul", t4, zsquared, t3), - - // tmp3 = tmp3 + tmp3; - c.call(f2mPrefix + "_add", t3, t3, t3), - - // tmp3 = -tmp3; - c.call(f2mPrefix + "_neg", t3, t3), - - // tmp6 = tmp6.square() - tmp0 - tmp5; - c.call(f2mPrefix + "_square", t6, t6), - c.call(f2mPrefix + "_sub", t6, t0, t6), - c.call(f2mPrefix + "_sub", t6, t5, t6), - - // tmp1 = tmp1 + tmp1; - c.call(f2mPrefix + "_add", t1, t1, t1), - - // tmp1 = tmp1 + tmp1; - c.call(f2mPrefix + "_add", t1, t1, t1), - - // tmp6 = tmp6 - tmp1; - c.call(f2mPrefix + "_sub", t6, t1, t6), - - // tmp0 = r.z * zsquared; - c.call(f2mPrefix + "_mul", Rz, zsquared, t0), - - // tmp0 = tmp0 + tmp0; - c.call(f2mPrefix + "_add", t0, t0, t0), - - ); - } - - function buildPrepAddStep() { - const f = module.addFunction(prefix+ "_prepAddStep"); - f.addParam("R", "i32"); - f.addParam("Q", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const Rx = c.getLocal("R"); - const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2*n8q)); - const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4*n8q)); - - const Qx = c.getLocal("Q"); - const Qy = c.i32_add(c.getLocal("Q"), c.i32_const(2*n8q)); - - const t10 = c.getLocal("r"); - const t1 = c.i32_add(c.getLocal("r"), c.i32_const(2*n8q)); - const t9 = c.i32_add(c.getLocal("r"), c.i32_const(4*n8q)); - - const zsquared = c.i32_const(module.alloc(f2size)); - const ysquared = c.i32_const(module.alloc(f2size)); - const ztsquared = c.i32_const(module.alloc(f2size)); - const t0 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const t6 = c.i32_const(module.alloc(f2size)); - const t7 = c.i32_const(module.alloc(f2size)); - const t8 = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // zsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, zsquared), - - // ysquared = q.y.square(); - c.call(f2mPrefix + "_square", Qy, ysquared), - - // t0 = zsquared * q.x; - c.call(f2mPrefix + "_mul", zsquared, Qx, t0), - - // t1 = ((q.y + r.z).square() - ysquared - zsquared) * zsquared; - c.call(f2mPrefix + "_add", Qy, Rz, t1), - c.call(f2mPrefix + "_square", t1, t1), - c.call(f2mPrefix + "_sub", t1, ysquared, t1), - c.call(f2mPrefix + "_sub", t1, zsquared, t1), - c.call(f2mPrefix + "_mul", t1, zsquared, t1), - - // t2 = t0 - r.x; - c.call(f2mPrefix + "_sub", t0, Rx, t2), - - // t3 = t2.square(); - c.call(f2mPrefix + "_square", t2, t3), - - // t4 = t3 + t3; - c.call(f2mPrefix + "_add", t3, t3, t4), - - // t4 = t4 + t4; - c.call(f2mPrefix + "_add", t4, t4, t4), - - // t5 = t4 * t2; - c.call(f2mPrefix + "_mul", t4, t2, t5), - - // t6 = t1 - r.y - r.y; - c.call(f2mPrefix + "_sub", t1, Ry, t6), - c.call(f2mPrefix + "_sub", t6, Ry, t6), - - // t9 = t6 * q.x; - c.call(f2mPrefix + "_mul", t6, Qx, t9), - - // t7 = t4 * r.x; - c.call(f2mPrefix + "_mul", t4, Rx, t7), - - // r.x = t6.square() - t5 - t7 - t7; - c.call(f2mPrefix + "_square", t6, Rx), - c.call(f2mPrefix + "_sub", Rx, t5, Rx), - c.call(f2mPrefix + "_sub", Rx, t7, Rx), - c.call(f2mPrefix + "_sub", Rx, t7, Rx), - - // r.z = (r.z + t2).square() - zsquared - t3; - c.call(f2mPrefix + "_add", Rz, t2, Rz), - c.call(f2mPrefix + "_square", Rz, Rz), - c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), - c.call(f2mPrefix + "_sub", Rz, t3, Rz), - - // t10 = q.y + r.z; - c.call(f2mPrefix + "_add", Qy, Rz, t10), - - // t8 = (t7 - r.x) * t6; - c.call(f2mPrefix + "_sub", t7, Rx, t8), - c.call(f2mPrefix + "_mul", t8, t6, t8), - - // t0 = r.y * t5; - c.call(f2mPrefix + "_mul", Ry, t5, t0), - - // t0 = t0 + t0; - c.call(f2mPrefix + "_add", t0, t0, t0), - - // r.y = t8 - t0; - c.call(f2mPrefix + "_sub", t8, t0, Ry), - - // t10 = t10.square() - ysquared; - c.call(f2mPrefix + "_square", t10, t10), - c.call(f2mPrefix + "_sub", t10, ysquared, t10), - - // ztsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, ztsquared), - - // t10 = t10 - ztsquared; - c.call(f2mPrefix + "_sub", t10, ztsquared, t10), - - // t9 = t9 + t9 - t10; - c.call(f2mPrefix + "_add", t9, t9, t9), - c.call(f2mPrefix + "_sub", t9, t10, t9), - - // t10 = r.z + r.z; - c.call(f2mPrefix + "_add", Rz, Rz, t10), - - // t6 = -t6; - c.call(f2mPrefix + "_neg", t6, t6), - - // t1 = t6 + t6; - c.call(f2mPrefix + "_add", t6, t6, t1), - ); - } - - - function buildPrepareG2() { - const f = module.addFunction(prefix+ "_prepareG2"); - f.addParam("pQ", "i32"); - f.addParam("ppreQ", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - - const Q = c.getLocal("pQ"); - - const pR = module.alloc(f2size*3); - const R = c.i32_const(pR); - - const base = c.getLocal("ppreQ"); - - f.addCode( - c.call(g2mPrefix + "_normalize", Q, base), - c.if( - c.call(g2mPrefix + "_isZero", base), - c.ret([]) - ), - c.call(g2mPrefix + "_copy", base, R), - c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size*3))), - ); - - f.addCode( - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_prepAddStep", R, base, c.getLocal("pCoef")), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - function buildF6Mul1() { - const f = module.addFunction(f6mPrefix+ "_mul1"); - f.addParam("pA", "i32"); // F6 - f.addParam("pC1", "i32"); // F2 - f.addParam("pR", "i32"); // F6 - - const c = f.getCodeBuilder(); - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*2)); - const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*4)); - - const c1 = c.getLocal("pC1"); - - const t1 = c.getLocal("pR"); - const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*2)); - const b_b = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*4)); - - const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2)); - const Ac1_Ac2 = c.i32_const(module.alloc(f1size*2)); - - f.addCode( - - c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), - c.call(f2mPrefix + "_add", A_c1, A_c2, Ac1_Ac2), - - // let b_b = self.c1 * c1; - c.call(f2mPrefix + "_mul", A_c1, c1, b_b), - - // let t1 = (self.c1 + self.c2) * c1 - b_b; - c.call(f2mPrefix + "_mul", Ac1_Ac2, c1, t1), - c.call(f2mPrefix + "_sub", t1, b_b, t1), - - // let t1 = t1.mul_by_nonresidue(); - c.call(f2mPrefix + "_mulNR", t1, t1), - - // let t2 = (self.c0 + self.c1) * c1 - b_b; - c.call(f2mPrefix + "_mul", Ac0_Ac1, c1, t2), - c.call(f2mPrefix + "_sub", t2, b_b, t2), - ); - } - buildF6Mul1(); - - function buildF6Mul01() { - const f = module.addFunction(f6mPrefix+ "_mul01"); - f.addParam("pA", "i32"); // F6 - f.addParam("pC0", "i32"); // F2 - f.addParam("pC1", "i32"); // F2 - f.addParam("pR", "i32"); // F6 - - const c = f.getCodeBuilder(); - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*2)); - const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*4)); - - const c0 = c.getLocal("pC0"); - const c1 = c.getLocal("pC1"); - - const t1 = c.getLocal("pR"); - const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*2)); - const t3 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*4)); - - const a_a = c.i32_const(module.alloc(f1size*2)); - const b_b = c.i32_const(module.alloc(f1size*2)); - const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2)); - const Ac0_Ac2 = c.i32_const(module.alloc(f1size*2)); - - f.addCode( - // let a_a = self.c0 * c0; - c.call(f2mPrefix + "_mul", A_c0, c0, a_a), - - // let b_b = self.c1 * c1; - c.call(f2mPrefix + "_mul", A_c1, c1, b_b), - - - c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), - c.call(f2mPrefix + "_add", A_c0, A_c2, Ac0_Ac2), - - // let t1 = (self.c1 + self.c2) * c1 - b_b; - c.call(f2mPrefix + "_add", A_c1, A_c2, t1), - c.call(f2mPrefix + "_mul", t1, c1, t1), - c.call(f2mPrefix + "_sub", t1, b_b, t1), - - // let t1 = t1.mul_by_nonresidue() + a_a; - c.call(f2mPrefix + "_mulNR", t1, t1), - c.call(f2mPrefix + "_add", t1, a_a, t1), - - // let t2 = (c0 + c1) * (self.c0 + self.c1) - a_a - b_b; - c.call(f2mPrefix + "_add", c0, c1, t2), - c.call(f2mPrefix + "_mul", t2, Ac0_Ac1, t2), - c.call(f2mPrefix + "_sub", t2, a_a, t2), - c.call(f2mPrefix + "_sub", t2, b_b, t2), - - // let t3 = (self.c0 + self.c2) * c0 - a_a + b_b; - c.call(f2mPrefix + "_mul", Ac0_Ac2, c0, t3), - c.call(f2mPrefix + "_sub", t3, a_a, t3), - c.call(f2mPrefix + "_add", t3, b_b, t3), - - - ); - } - buildF6Mul01(); - - - function buildF12Mul014() { - - const f = module.addFunction(ftmPrefix+ "_mul014"); - f.addParam("pA", "i32"); // F12 - f.addParam("pC0", "i32"); // F2 - f.addParam("pC1", "i32"); // F2 - f.addParam("pC4", "i32"); // F2 - f.addParam("pR", "i32"); // F12 - - const c = f.getCodeBuilder(); - - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*6)); - - const c0 = c.getLocal("pC0"); - const c1 = c.getLocal("pC1"); - const c4 = c.getLocal("pC4"); - - const aa = c.i32_const(module.alloc(f1size*6)); - const bb = c.i32_const(module.alloc(f1size*6)); - const o = c.i32_const(module.alloc(f1size*2)); - - const R_c0 = c.getLocal("pR"); - const R_c1 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*6)); - - f.addCode( - // let aa = self.c0.mul_by_01(c0, c1); - c.call(f6mPrefix + "_mul01", A_c0, c0, c1, aa), - - // let bb = self.c1.mul_by_1(c4); - c.call(f6mPrefix + "_mul1", A_c1, c4, bb), - - // let o = c1 + c4; - c.call(f2mPrefix + "_add", c1, c4, o), - - // let c1 = self.c1 + self.c0; - c.call(f6mPrefix + "_add", A_c1, A_c0, R_c1), - - // let c1 = c1.mul_by_01(c0, &o); - c.call(f6mPrefix + "_mul01", R_c1, c0, o, R_c1), - - // let c1 = c1 - aa - bb; - c.call(f6mPrefix + "_sub", R_c1, aa, R_c1), - c.call(f6mPrefix + "_sub", R_c1, bb, R_c1), - - // let c0 = bb; - c.call(f6mPrefix + "_copy", bb, R_c0), - - // let c0 = c0.mul_by_nonresidue(); - c.call(f6mPrefix + "_mulNR", R_c0, R_c0), - - // let c0 = c0 + aa; - c.call(f6mPrefix + "_add", R_c0, aa, R_c0), - ); - } - buildF12Mul014(); - - - function buildELL() { - const f = module.addFunction(prefix+ "_ell"); - f.addParam("pP", "i32"); - f.addParam("pCoefs", "i32"); - f.addParam("pF", "i32"); - - const c = f.getCodeBuilder(); - - const Px = c.getLocal("pP"); - const Py = c.i32_add(c.getLocal("pP"), c.i32_const(n8q)); - - const F = c.getLocal("pF"); - - const coef0_0 = c.getLocal("pCoefs"); - const coef0_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size)); - const coef1_0 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*2)); - const coef1_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*3)); - const coef2 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*4)); - - const pc0 = module.alloc(f1size*2); - const c0 = c.i32_const(pc0); - const c0_c0 = c.i32_const(pc0); - const c0_c1 = c.i32_const(pc0+f1size); - - const pc1 = module.alloc(f1size*2); - const c1 = c.i32_const(pc1); - const c1_c0 = c.i32_const(pc1); - const c1_c1 = c.i32_const(pc1+f1size); - f.addCode( - // let mut c0 = coeffs.0; - // let mut c1 = coeffs.1; - // - // c0.c0 *= p.y; - // c0.c1 *= p.y; - // - // c1.c0 *= p.x; - // c1.c1 *= p.x; - // - // f.mul_by_014(&coeffs.2, &c1, &c0) - - c.call(f1mPrefix + "_mul", coef0_0, Py, c0_c0), - c.call(f1mPrefix + "_mul", coef0_1, Py, c0_c1), - c.call(f1mPrefix + "_mul", coef1_0, Px, c1_c0), - c.call(f1mPrefix + "_mul", coef1_1, Px, c1_c1), - - c.call(ftmPrefix + "_mul014", F, coef2, c1, c0, F), - - ); - - } - buildELL(); - - function buildMillerLoop() { - const f = module.addFunction(prefix+ "_millerLoop"); - f.addParam("ppreP", "i32"); - f.addParam("ppreQ", "i32"); - f.addParam("r", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const preP = c.getLocal("ppreP"); - - const coefs = c.getLocal("pCoef"); - - const F = c.getLocal("r"); - - - f.addCode( - c.call(ftmPrefix + "_one", F), - - c.if( - c.call(g1mPrefix + "_isZero", preP), - c.ret([]) - ), - c.if( - c.call(g1mPrefix + "_isZero", c.getLocal("ppreQ")), - c.ret([]) - ), - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - - c.call(prefix + "_ell", preP, coefs, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_ell", preP, coefs, F), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.call(ftmPrefix + "_square", F, F), - - c.br_if(1, c.i32_eq ( c.getLocal("i"), c.i32_const(1) )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - c.call(prefix + "_ell", preP, coefs, F), - - ); - - - { - f.addCode( - c.call(ftmPrefix + "_conjugate", F, F), - ); - } - } - - - function buildFrobeniusMap(n) { - const F12 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n, 151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n], - [2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n, 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n, 877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n], - [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], - [151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n, 3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n, 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], - [877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n, 3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n], - ] - ]; - - const F6 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [0n, 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [0n, 1n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [0n, 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n], - ], - [ - [1n, 0n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n], - ] - ]; - - const f = module.addFunction(ftmPrefix + "_frobeniusMap"+n); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i<6; i++) { - const X = (i==0) ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i*f2size)); - const Xc0 = X; - const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i*f2size + f1size)); - const R = (i==0) ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i*f2size)); - const Rc0 = R; - const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i*f2size + f1size)); - const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]); - const pCoef = module.alloc([ - ...utils$1.bigInt2BytesLE(toMontgomery(coef[0]), n8q), - ...utils$1.bigInt2BytesLE(toMontgomery(coef[1]), n8q), - ]); - if (n%2 == 1) { - f.addCode( - c.call(f1mPrefix + "_copy", Xc0, Rc0), - c.call(f1mPrefix + "_neg", Xc1, Rc1), - c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R), - ); - } else { - f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); - } - } - - function mul2(a, b) { - const ac0 = a[0]; - const ac1 = a[1]; - const bc0 = b[0]; - const bc1 = b[1]; - const res = [ - (ac0 * bc0 - (ac1 * bc1)) % q, - (ac0 * bc1 + (ac1 * bc0)) % q, - ]; - if (isNegative$1(res[0])) res[0] = res[0] + q; - return res; - } - - } - - - function buildCyclotomicSquare() { - const f = module.addFunction(prefix+ "__cyclotomicSquare"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); - const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2*f2size)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3*f2size)); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4*f2size)); - const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5*f2size)); - - const r0 = c.getLocal("r"); - const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); - const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2*f2size)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3*f2size)); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4*f2size)); - const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5*f2size)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const tmp = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - - f.addCode( - // // t0 + t1*y = (z0 + z1*y)^2 = a^2 - // tmp = z0 * z1; - // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp; - // t1 = tmp + tmp; - c.call(f2mPrefix + "_mul", x0, x1, tmp), - c.call(f2mPrefix + "_mulNR", x1, t0), - c.call(f2mPrefix + "_add", x0, t0, t0), - c.call(f2mPrefix + "_add", x0, x1, AUX), - c.call(f2mPrefix + "_mul", AUX, t0, t0), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t0, AUX, t0), - c.call(f2mPrefix + "_add", tmp, tmp, t1), - - // // t2 + t3*y = (z2 + z3*y)^2 = b^2 - // tmp = z2 * z3; - // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp; - // t3 = tmp + tmp; - c.call(f2mPrefix + "_mul", x2, x3, tmp), - c.call(f2mPrefix + "_mulNR", x3, t2), - c.call(f2mPrefix + "_add", x2, t2, t2), - c.call(f2mPrefix + "_add", x2, x3, AUX), - c.call(f2mPrefix + "_mul", AUX, t2, t2), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t2, AUX, t2), - c.call(f2mPrefix + "_add", tmp, tmp, t3), - - // // t4 + t5*y = (z4 + z5*y)^2 = c^2 - // tmp = z4 * z5; - // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp; - // t5 = tmp + tmp; - c.call(f2mPrefix + "_mul", x4, x5, tmp), - c.call(f2mPrefix + "_mulNR", x5, t4), - c.call(f2mPrefix + "_add", x4, t4, t4), - c.call(f2mPrefix + "_add", x4, x5, AUX), - c.call(f2mPrefix + "_mul", AUX, t4, t4), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t4, AUX, t4), - c.call(f2mPrefix + "_add", tmp, tmp, t5), - - // For A - // z0 = 3 * t0 - 2 * z0 - c.call(f2mPrefix + "_sub", t0, x0, r0), - c.call(f2mPrefix + "_add", r0, r0, r0), - c.call(f2mPrefix + "_add", t0, r0, r0), - // z1 = 3 * t1 + 2 * z1 - c.call(f2mPrefix + "_add", t1, x1, r1), - c.call(f2mPrefix + "_add", r1, r1, r1), - c.call(f2mPrefix + "_add", t1, r1, r1), - - // For B - // z2 = 3 * (xi * t5) + 2 * z2 - c.call(f2mPrefix + "_mul", t5, c.i32_const(pBls12381Twist), AUX), - c.call(f2mPrefix + "_add", AUX, x2, r2), - c.call(f2mPrefix + "_add", r2, r2, r2), - c.call(f2mPrefix + "_add", AUX, r2, r2), - // z3 = 3 * t4 - 2 * z3 - c.call(f2mPrefix + "_sub", t4, x3, r3), - c.call(f2mPrefix + "_add", r3, r3, r3), - c.call(f2mPrefix + "_add", t4, r3, r3), - - // For C - // z4 = 3 * t2 - 2 * z4 - c.call(f2mPrefix + "_sub", t2, x4, r4), - c.call(f2mPrefix + "_add", r4, r4, r4), - c.call(f2mPrefix + "_add", t2, r4, r4), - // z5 = 3 * t3 + 2 * z5 - c.call(f2mPrefix + "_add", t3, x5, r5), - c.call(f2mPrefix + "_add", r5, r5, r5), - c.call(f2mPrefix + "_add", t3, r5, r5), - - ); - } - - - function buildCyclotomicExp(exponent, isExpNegative, fnName) { - const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) ); - const pExponentNafBytes = module.alloc(exponentNafBytes); - // const pExponent = module.alloc(utils.bigInt2BytesLE(exponent, n8)); - - const f = module.addFunction(prefix+ "__cyclotomicExp_"+fnName); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("bit", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("x"); - - const res = c.getLocal("r"); - - const inverse = c.i32_const(module.alloc(ftsize)); - - - f.addCode( - c.call(ftmPrefix + "_conjugate", x, inverse), - c.call(ftmPrefix + "_one", res), - - c.if( - c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - - c.setLocal("i", c.i32_const(exponentNafBytes.length-2)), - c.block(c.loop( - c.call(prefix + "__cyclotomicSquare", res, res), - c.if( - c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - if (isExpNegative) { - f.addCode( - c.call(ftmPrefix + "_conjugate", res, res), - ); - } - - } - - function buildFinalExponentiation() { - buildCyclotomicSquare(); - buildCyclotomicExp(finalExpZ, finalExpIsNegative, "w0"); - - const f = module.addFunction(prefix+ "_finalExponentiation"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const res = c.getLocal("r"); - const t0 = c.i32_const(module.alloc(ftsize)); - const t1 = c.i32_const(module.alloc(ftsize)); - const t2 = c.i32_const(module.alloc(ftsize)); - const t3 = c.i32_const(module.alloc(ftsize)); - const t4 = c.i32_const(module.alloc(ftsize)); - const t5 = c.i32_const(module.alloc(ftsize)); - const t6 = c.i32_const(module.alloc(ftsize)); - - f.addCode( - - // let mut t0 = f.frobenius_map(6) - c.call(ftmPrefix + "_frobeniusMap6", elt, t0), - - // let t1 = f.invert() - c.call(ftmPrefix + "_inverse", elt, t1), - - // let mut t2 = t0 * t1; - c.call(ftmPrefix + "_mul", t0, t1, t2), - - // t1 = t2.clone(); - c.call(ftmPrefix + "_copy", t2, t1), - - // t2 = t2.frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap2", t2, t2), - - // t2 *= t1; - c.call(ftmPrefix + "_mul", t2, t1, t2), - - - // t1 = cyclotomic_square(t2).conjugate(); - c.call(prefix + "__cyclotomicSquare", t2, t1), - c.call(ftmPrefix + "_conjugate", t1, t1), - - // let mut t3 = cycolotomic_exp(t2); - c.call(prefix + "__cyclotomicExp_w0", t2, t3), - - // let mut t4 = cyclotomic_square(t3); - c.call(prefix + "__cyclotomicSquare", t3, t4), - - // let mut t5 = t1 * t3; - c.call(ftmPrefix + "_mul", t1, t3, t5), - - // t1 = cycolotomic_exp(t5); - c.call(prefix + "__cyclotomicExp_w0", t5, t1), - - // t0 = cycolotomic_exp(t1); - c.call(prefix + "__cyclotomicExp_w0", t1, t0), - - // let mut t6 = cycolotomic_exp(t0); - c.call(prefix + "__cyclotomicExp_w0", t0, t6), - - // t6 *= t4; - c.call(ftmPrefix + "_mul", t6, t4, t6), - - // t4 = cycolotomic_exp(t6); - c.call(prefix + "__cyclotomicExp_w0", t6, t4), - - // t5 = t5.conjugate(); - c.call(ftmPrefix + "_conjugate", t5, t5), - - // t4 *= t5 * t2; - c.call(ftmPrefix + "_mul", t4, t5, t4), - c.call(ftmPrefix + "_mul", t4, t2, t4), - - // t5 = t2.conjugate(); - c.call(ftmPrefix + "_conjugate", t2, t5), - - // t1 *= t2; - c.call(ftmPrefix + "_mul", t1, t2, t1), - - // t1 = t1.frobenius_map().frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap3", t1, t1), - - // t6 *= t5; - c.call(ftmPrefix + "_mul", t6, t5, t6), - - // t6 = t6.frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap1", t6, t6), - - // t3 *= t0; - c.call(ftmPrefix + "_mul", t3, t0, t3), - - // t3 = t3.frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap2", t3, t3), - - // t3 *= t1; - c.call(ftmPrefix + "_mul", t3, t1, t3), - - // t3 *= t6; - c.call(ftmPrefix + "_mul", t3, t6, t3), - - // f = t3 * t4; - c.call(ftmPrefix + "_mul", t3, t4, res), - - ); - } - - - function buildFinalExponentiationOld() { - const f = module.addFunction(prefix+ "_finalExponentiationOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const exponent = 322277361516934140462891564586510139908379969514828494218366688025288661041104682794998680497580008899973249814104447692778988208376779573819485263026159588510513834876303014016798809919343532899164848730280942609956670917565618115867287399623286813270357901731510188149934363360381614501334086825442271920079363289954510565375378443704372994881406797882676971082200626541916413184642520269678897559532260949334760604962086348898118982248842634379637598665468817769075878555493752214492790122785850202957575200176084204422751485957336465472324810982833638490904279282696134323072515220044451592646885410572234451732790590013479358343841220074174848221722017083597872017638514103174122784843925578370430843522959600095676285723737049438346544753168912974976791528535276317256904336520179281145394686565050419250614107803233314658825463117900250701199181529205942363159325765991819433914303908860460720581408201373164047773794825411011922305820065611121544561808414055302212057471395719432072209245600258134364584636810093520285711072578721435517884103526483832733289802426157301542744476740008494780363354305116978805620671467071400711358839553375340724899735460480144599782014906586543813292157922220645089192130209334926661588737007768565838519456601560804957985667880395221049249803753582637708560n; - - const pExponent = module.alloc(utils$1.bigInt2BytesLE( exponent, 544 )); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(544), c.getLocal("r")), - ); - } - - - const pPreP = module.alloc(prePSize); - const pPreQ = module.alloc(preQSize); - - function buildPairingEquation(nPairings) { - - const f = module.addFunction(prefix+ "_pairingEq"+nPairings); - for (let i=0; i. -*/ - -// module.exports.bn128_wasm = require("./build/bn128_wasm.js"); -// module.exports.bls12381_wasm = require("./build/bls12381_wasm.js"); -// module.exports.mnt6753_wasm = require("./build/mnt6753_wasm.js"); - -var buildBn128$1 = build_bn128; -var buildBls12381$1 = build_bls12381; - -/* global BigInt */ - -function stringifyBigInts(o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return fromRprLE(o, 0); - } else if (Array.isArray(o)) { - return o.map(stringifyBigInts); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } -} - -function unstringifyBigInts(o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return BigInt(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return BigInt(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyBigInts); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } -} - -function beBuff2int(buff) { - let res = BigInt(0); - let i = buff.length; - let offset = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i > 0) { - if (i >= 4) { - i -= 4; - res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); - offset += 4; - } else if (i >= 2) { - i -= 2; - res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); - offset += 2; - } else { - i -= 1; - res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); - offset += 1; - } - } - return res; -} - -function beInt2Buff(n, len) { - let r = n; - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = len; - while (o > 0) { - if (o - 4 >= 0) { - o -= 4; - buffV.setUint32(o, Number(r & BigInt(0xffffffff))); - r = r >> BigInt(32); - } else if (o - 2 >= 0) { - o -= 2; - buffV.setUint16(o, Number(r & BigInt(0xffff))); - r = r >> BigInt(16); - } else { - o -= 1; - buffV.setUint8(o, Number(r & BigInt(0xff))); - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; -} - -function leBuff2int(buff) { - let res = BigInt(0); - let i = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i < buff.length) { - if (i + 4 <= buff.length) { - res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8); - i += 4; - } else if (i + 2 <= buff.length) { - res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8); - i += 2; - } else { - res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8); - i += 1; - } - } - return res; -} - -function leInt2Buff(n, len) { - let r = n; - if (typeof len === "undefined") { - len = Math.floor((bitLength$6(n) - 1) / 8) + 1; - if (len == 0) len = 1; - } - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = 0; - while (o < len) { - if (o + 4 <= len) { - buffV.setUint32(o, Number(r & BigInt(0xffffffff)), true); - o += 4; - r = r >> BigInt(32); - } else if (o + 2 <= len) { - buffV.setUint16(o, Number(r & BigInt(0xffff)), true); - o += 2; - r = r >> BigInt(16); - } else { - buffV.setUint8(o, Number(r & BigInt(0xff)), true); - o += 1; - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; -} - -function stringifyFElements(F, o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return F.toString(F.e(o)); - } else if (Array.isArray(o)) { - return o.map(stringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } -} - -function unstringifyFElements(F, o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return F.e(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return F.e(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } -} - -const _revTable = []; -for (let i = 0; i < 256; i++) { - _revTable[i] = _revSlow(i, 8); -} - -function _revSlow(idx, bits) { - let res = 0; - let a = idx; - for (let i = 0; i < bits; i++) { - res <<= 1; - res = res | (a & 1); - a >>= 1; - } - return res; -} - -function bitReverse(idx, bits) { - return ( - (_revTable[idx >>> 24] | - (_revTable[(idx >>> 16) & 0xff] << 8) | - (_revTable[(idx >>> 8) & 0xff] << 16) | - (_revTable[idx & 0xff] << 24)) >>> - (32 - bits) - ); -} - -function log2(V) { - return ( - ((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) | - ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) | - ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) | - ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) | - ((V & 0xaaaaaaaa) !== 0) - ); -} - -function buffReverseBits(buff, eSize) { - const n = buff.byteLength / eSize; - const bits = log2(n); - if (n != 1 << bits) { - throw new Error("Invalid number of pointers"); - } - for (let i = 0; i < n; i++) { - const r = bitReverse(i, bits); - if (i > r) { - const tmp = buff.slice(i * eSize, (i + 1) * eSize); - buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); - buff.set(tmp, r * eSize); - } - } -} - -function array2buffer(arr, sG) { - const buff = new Uint8Array(sG * arr.length); - - for (let i = 0; i < arr.length; i++) { - buff.set(arr[i], i * sG); - } - - return buff; -} - -function buffer2array(buff, sG) { - const n = buff.byteLength / sG; - const arr = new Array(n); - for (let i = 0; i < n; i++) { - arr[i] = buff.slice(i * sG, i * sG + sG); - } - return arr; -} - -var _utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - array2buffer: array2buffer, - beBuff2int: beBuff2int, - beInt2Buff: beInt2Buff, - bitReverse: bitReverse, - buffReverseBits: buffReverseBits, - buffer2array: buffer2array, - leBuff2int: leBuff2int, - leInt2Buff: leInt2Buff, - log2: log2, - stringifyBigInts: stringifyBigInts, - stringifyFElements: stringifyFElements, - unstringifyBigInts: unstringifyBigInts, - unstringifyFElements: unstringifyFElements -}); - -const PAGE_SIZE = 1<<30; - -class BigBuffer { - - constructor(size) { - this.buffers = []; - this.byteLength = size; - for (let i=0; i0) { - // bytes to copy from this page - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset+o, l); - if (l == len) return srcView.slice(); - if (!buff) { - if (len <= PAGE_SIZE) { - buff = new Uint8Array(len); - } else { - buff = new BigBuffer(len); - } - } - buff.set(srcView, len-r); - r = r-l; - p ++; - o = 0; - } - - return buff; - } - - set(buff, offset) { - if (offset === undefined) offset = 0; - - const len = buff.byteLength; - - if (len==0) return; - - const firstPage = Math.floor(offset / PAGE_SIZE); - const lastPage = Math.floor((offset+len-1) / PAGE_SIZE); - - if (firstPage == lastPage) { - if ((buff instanceof BigBuffer)&&(buff.buffers.length==1)) { - return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE); - } else { - return this.buffers[firstPage].set(buff, offset % PAGE_SIZE); - } - - } - - - let p = firstPage; - let o = offset % PAGE_SIZE; - let r = len; - while (r>0) { - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = buff.slice( len -r, len -r+l); - const dstView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); - dstView.set(srcView); - r = r-l; - p ++; - o = 0; - } - - } -} - -function buildBatchConvert(tm, fnName, sIn, sOut) { - return async function batchConvert(buffIn) { - const nPoints = Math.floor(buffIn.byteLength / sIn); - if ( nPoints * sIn !== buffIn.byteLength) { - throw new Error("Invalid buffer size"); - } - const pointsPerChunk = Math.floor(nPoints/tm.concurrency); - const opPromises = []; - for (let i=0; i=0; i--) { - this.w[i] = this.square(this.w[i+1]); - } - - if (!this.eq(this.w[0], this.one)) { - throw new Error("Error calculating roots of unity"); - } - - this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); - this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); - } - - - op2(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op2Bool(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); - } - - op1(opName, a) { - this.tm.setBuff(this.pOp1, a); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op1Bool(opName, a) { - this.tm.setBuff(this.pOp1, a); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - } - - add(a,b) { - return this.op2("_add", a, b); - } - - - eq(a,b) { - return this.op2Bool("_eq", a, b); - } - - isZero(a) { - return this.op1Bool("_isZero", a); - } - - sub(a,b) { - return this.op2("_sub", a, b); - } - - neg(a) { - return this.op1("_neg", a); - } - - inv(a) { - return this.op1("_inverse", a); - } - - toMontgomery(a) { - return this.op1("_toMontgomery", a); - } - - fromMontgomery(a) { - return this.op1("_fromMontgomery", a); - } - - mul(a,b) { - return this.op2("_mul", a, b); - } - - div(a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); - this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - square(a) { - return this.op1("_square", a); - } - - isSquare(a) { - return this.op1Bool("_isSquare", a); - } - - sqrt(a) { - return this.op1("_sqrt", a); - } - - exp(a, b) { - if (!(b instanceof Uint8Array)) { - b = toLEBuff(e(b)); - } - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - isNegative(a) { - return this.op1Bool("_isNegative", a); - } - - e(a, b) { - if (a instanceof Uint8Array) return a; - let ra = e(a, b); - if (isNegative$4(ra)) { - ra = neg(ra); - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - ra = sub(this.p, ra); - } else { - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - } - const buff = leInt2Buff(ra, this.n8); - return this.toMontgomery(buff); - } - - toString(a, radix) { - const an = this.fromMontgomery(a); - const s = fromRprLE(an, 0); - return toString(s, radix); - } - - fromRng(rng) { - let v; - const buff = new Uint8Array(this.n8); - do { - v = zero; - for (let i=0; i memory.buffer.byteLength) { - const currentPages = memory.buffer.byteLength / 0x10000; - let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1; - if (requiredPages>MAXMEM) requiredPages=MAXMEM; - memory.grow(requiredPages-currentPages); - } - return res; - } - - function allocBuffer(buffer) { - const p = alloc(buffer.byteLength); - setBuffer(p, buffer); - return p; - } - - function getBuffer(pointer, length) { - const u8 = new Uint8Array(memory.buffer); - return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); - } - - function setBuffer(pointer, buffer) { - const u8 = new Uint8Array(memory.buffer); - u8.set(new Uint8Array(buffer), pointer); - } - - function runTask(task) { - if (task[0].cmd == "INIT") { - return init(task[0]); - } - const ctx = { - vars: [], - out: [] - }; - const u32a = new Uint32Array(memory.buffer, 0, 1); - const oldAlloc = u32a[0]; - for (let i=0; i. -*/ - -// const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) -const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) - -class Deferred { - constructor() { - this.promise = new Promise((resolve, reject)=> { - this.reject = reject; - this.resolve = resolve; - }); - } -} - -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -let workerSource; - -const threadStr = `(${"function thread(self) {\n const MAXMEM = 32767;\n let instance;\n let memory;\n\n if (self) {\n self.onmessage = function(e) {\n let data;\n if (e.data) {\n data = e.data;\n } else {\n data = e;\n }\n\n if (data[0].cmd == \"INIT\") {\n init(data[0]).then(function() {\n self.postMessage(data.result);\n });\n } else if (data[0].cmd == \"TERMINATE\") {\n self.close();\n } else {\n const res = runTask(data);\n self.postMessage(res);\n }\n };\n }\n\n async function init(data) {\n const code = new Uint8Array(data.code);\n const wasmModule = await WebAssembly.compile(code);\n memory = new WebAssembly.Memory({initial:data.init, maximum: MAXMEM});\n\n instance = await WebAssembly.instantiate(wasmModule, {\n env: {\n \"memory\": memory\n }\n });\n }\n\n\n\n function alloc(length) {\n const u32 = new Uint32Array(memory.buffer, 0, 1);\n while (u32[0] & 3) u32[0]++; // Return always aligned pointers\n const res = u32[0];\n u32[0] += length;\n if (u32[0] + length > memory.buffer.byteLength) {\n const currentPages = memory.buffer.byteLength / 0x10000;\n let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1;\n if (requiredPages>MAXMEM) requiredPages=MAXMEM;\n memory.grow(requiredPages-currentPages);\n }\n return res;\n }\n\n function allocBuffer(buffer) {\n const p = alloc(buffer.byteLength);\n setBuffer(p, buffer);\n return p;\n }\n\n function getBuffer(pointer, length) {\n const u8 = new Uint8Array(memory.buffer);\n return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length);\n }\n\n function setBuffer(pointer, buffer) {\n const u8 = new Uint8Array(memory.buffer);\n u8.set(new Uint8Array(buffer), pointer);\n }\n\n function runTask(task) {\n if (task[0].cmd == \"INIT\") {\n return init(task[0]);\n }\n const ctx = {\n vars: [],\n out: []\n };\n const u32a = new Uint32Array(memory.buffer, 0, 1);\n const oldAlloc = u32a[0];\n for (let i=0; i64) concurrency=64; - tm.concurrency = concurrency; - - for (let i = 0; i 0); i++) { - if (this.working[i] == false) { - const work = this.actionQueue.shift(); - this.postAction(i, work.data, work.transfers, work.deferred); - } - } - } - - queueAction(actionData, transfers) { - const d = new Deferred(); - - if (this.singleThread) { - const res = this.taskManager(actionData); - d.resolve(res); - } else { - this.actionQueue.push({ - data: actionData, - transfers: transfers, - deferred: d - }); - this.processWorks(); - } - return d.promise; - } - - resetMemory() { - this.u32[0] = this.initalPFree; - } - - allocBuff(buff) { - const pointer = this.alloc(buff.byteLength); - this.setBuff(pointer, buff); - return pointer; - } - - getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); - } - - setBuff(pointer, buffer) { - this.u8.set(new Uint8Array(buffer), pointer); - } - - alloc(length) { - while (this.u32[0] & 3) this.u32[0]++; // Return always aligned pointers - const res = this.u32[0]; - this.u32[0] += length; - return res; - } - - async terminate() { - for (let i=0; i=0; i--) { - if (!G.isZero(res)) { - for (let j=0; jMAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize { - if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); - return r; - })); - } - - const result = await Promise.all(opPromises); - - let res = G.zero; - for (let i=result.length-1; i>=0; i--) { - res = G.add(res, result[i]); - } - - return res; - } - - G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "jacobian", logger, logText); - }; - G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "affine", logger, logText); - }; -} - -function buildFFT(curve, groupName) { - const G = curve[groupName]; - const Fr = curve.Fr; - const tm = G.tm; - async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { - - inType = inType || "affine"; - outType = outType || "affine"; - const MAX_BITS_THREAD = 14; - - let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal; - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g1m_fftFinal"; - } - fnFFTJoin = "g1m_fftJoin"; - fnFFTMix = "g1m_fftMix"; - - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g1m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g2m_fftFinal"; - } - fnFFTJoin = "g2m_fftJoin"; - fnFFTMix = "g2m_fftMix"; - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g2m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = G.n8; - sMid = G.n8; - sOut = G.n8; - if (inverse) { - fnFFTFinal = "frm_fftFinal"; - } - fnFFTMix = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - } - - - let returnArray = false; - if (Array.isArray(buff)) { - buff = array2buffer(buff, sIn); - returnArray = true; - } else { - buff = buff.slice(0, buff.byteLength); - } - - const nPoints = buff.byteLength / sIn; - const bits = log2(nPoints); - - if ((1 << bits) != nPoints) { - throw new Error("fft must be multiple of 2" ); - } - - if (bits == Fr.s +1) { - let buffOut; - - if (inverse) { - buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); - } else { - buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); - } - - if (returnArray) { - return buffer2array(buffOut, sOut); - } else { - return buffOut; - } - } - - let inv; - if (inverse) { - inv = Fr.inv(Fr.e(nPoints)); - } - - let buffOut; - - buffReverseBits(buff, sIn); - - let chunks; - let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); - let nChunks = nPoints / pointsInChunk; - - while ((nChunks < tm.concurrency)&&(pointsInChunk>=16)) { - nChunks *= 2; - pointsInChunk /= 2; - } - - const l2Chunk = log2(pointsInChunk); - - const promises = []; - for (let i = 0; i< nChunks; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${i}/${nChunks}`); - const task = []; - task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); - const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); - task.push({cmd: "SET", var: 0, buff: buffChunk}); - if (fnIn2Mid) { - task.push({cmd: "CALL", fnName:fnIn2Mid, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - for (let j=1; j<=l2Chunk;j++) { - task.push({cmd: "CALL", fnName:fnFFTMix, params: [{var:0}, {val: pointsInChunk}, {val: j}]}); - } - - if (l2Chunk==bits) { - if (fnFFTFinal) { - task.push({cmd: "ALLOCSET", var: 1, buff: inv}); - task.push({cmd: "CALL", fnName: fnFFTFinal, params:[ - {var: 0}, - {val: pointsInChunk}, - {var: 1}, - ]}); - } - if (fnMid2Out) { - task.push({cmd: "CALL", fnName:fnMid2Out, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sOut}); - } else { - task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); - } - promises.push(tm.queueAction(task).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${i}/${nChunks}`); - return r; - })); - } - - chunks = await Promise.all(promises); - for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; - - for (let i = l2Chunk+1; i<=bits; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); - const nGroups = 1 << (bits - i); - const nChunksPerGroup = nChunks / nGroups; - const opPromises = []; - for (let j=0; j { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join ${i}/${bits} ${j+1}/${nGroups} ${k}/${nChunksPerGroup/2}`); - return r; - })); - } - } - - const res = await Promise.all(opPromises); - for (let j=0; j0; i--) { - buffOut.set(chunks[i], p); - p += pointsInChunk*sOut; - delete chunks[i]; // Liberate mem - } - buffOut.set(chunks[0].slice(0, (pointsInChunk-1)*sOut), p); - delete chunks[0]; - } else { - for (let i=0; i (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { - let b1, b2; - b1 = buff.slice( 0 , buff.byteLength/2); - b2 = buff.slice( buff.byteLength/2, buff.byteLength); - - const promises = []; - - promises.push( _fft(b1, true, inType, "jacobian", logger, loggerTxt)); - promises.push( _fft(b2, true, inType, "jacobian", logger, loggerTxt)); - - [b1, b2] = await Promise.all(promises); - - const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); - - let buffOut; - if (res1[0].byteLength > (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - - async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { - const MAX_CHUNK_SIZE = 1<<16; - const MIN_CHUNK_SIZE = 1<<4; - - let fnName; - let fnIn2Mid, fnMid2Out; - let sOut, sIn, sMid; - - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - fnName = "g1m_"+fn; - if (outType == "affine") { - fnMid2Out = "g1m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - fnName = "g2m_"+fn; - sMid = G.F.n8*3; - if (outType == "affine") { - fnMid2Out = "g2m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = Fr.n8; - sOut = Fr.n8; - sMid = Fr.n8; - fnName = "frm_" + fn; - } else { - throw new Error("Invalid group"); - } - - if (buff1.byteLength != buff2.byteLength) { - throw new Error("Invalid buffer size"); - } - const nPoints = Math.floor(buff1.byteLength / sIn); - if (nPoints != 1 << log2(nPoints)) { - throw new Error("Invalid number of points"); - } - - let chunkSize = Math.floor(nPoints /tm.concurrency); - if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; - if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - - const opPromises = []; - - for (let i=0; i { - if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); - return r; - }) - ); - } - - const result = await Promise.all(opPromises); - - let fullBuffOut1; - let fullBuffOut2; - if (nPoints * sOut > 1<<28) { - fullBuffOut1 = new BigBuffer(nPoints*sOut); - fullBuffOut2 = new BigBuffer(nPoints*sOut); - } else { - fullBuffOut1 = new Uint8Array(nPoints*sOut); - fullBuffOut2 = new Uint8Array(nPoints*sOut); - } - - let p =0; - for (let i=0; i Fr.s+1) { - if (logger) logger.error("lagrangeEvaluations input too big"); - throw new Error("lagrangeEvaluations input too big"); - } - - let t0 = buff.slice(0, buff.byteLength/2); - let t1 = buff.slice(buff.byteLength/2, buff.byteLength); - - - const shiftToSmallM = Fr.exp(Fr.shift, nPoints/2); - const sConst = Fr.inv( Fr.sub(Fr.one, shiftToSmallM)); - - [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); - - const promises = []; - - promises.push( _fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); - promises.push( _fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); - - [t0, t1] = await Promise.all(promises); - - let buffOut; - if (t0.byteLength > (1<<28)) { - buffOut = new BigBuffer(t0.byteLength*2); - } else { - buffOut = new Uint8Array(t0.byteLength*2); - } - - buffOut.set(t0); - buffOut.set(t1, t0.byteLength); - - return buffOut; - }; - - G.fftMix = async function fftMix(buff) { - const sG = G.F.n8*3; - let fnName, fnFFTJoin; - if (groupName == "G1") { - fnName = "g1m_fftMix"; - fnFFTJoin = "g1m_fftJoin"; - } else if (groupName == "G2") { - fnName = "g2m_fftMix"; - fnFFTJoin = "g2m_fftJoin"; - } else if (groupName == "Fr") { - fnName = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - } else { - throw new Error("Invalid group"); - } - - const nPoints = Math.floor(buff.byteLength / sG); - const power = log2(nPoints); - - let nChunks = 1 << log2(tm.concurrency); - - if (nPoints <= nChunks*2) nChunks = 1; - - const pointsPerChunk = nPoints / nChunks; - - const powerChunk = log2(pointsPerChunk); - - const opPromises = []; - for (let i=0; i=0; i--) { - fullBuffOut.set(result[i][0], p); - p+=result[i][0].byteLength; - } - - return fullBuffOut; - }; -} - -async function buildEngine(params) { - - const tm = await buildThreadManager(params.wasm, params.singleThread); - - - const curve = {}; - - curve.q = e(params.wasm.q.toString()); - curve.r = e(params.wasm.r.toString()); - curve.name = params.name; - curve.tm = tm; - curve.prePSize = params.wasm.prePSize; - curve.preQSize = params.wasm.preQSize; - curve.Fr = new WasmField1(tm, "frm", params.n8r, params.r); - curve.F1 = new WasmField1(tm, "f1m", params.n8q, params.q); - curve.F2 = new WasmField2(tm, "f2m", curve.F1); - curve.G1 = new WasmCurve(tm, "g1m", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1); - curve.G2 = new WasmCurve(tm, "g2m", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2); - curve.F6 = new WasmField3(tm, "f6m", curve.F2); - curve.F12 = new WasmField2(tm, "ftm", curve.F6); - - curve.Gt = curve.F12; - - buildBatchApplyKey(curve, "G1"); - buildBatchApplyKey(curve, "G2"); - buildBatchApplyKey(curve, "Fr"); - - buildMultiexp(curve, "G1"); - buildMultiexp(curve, "G2"); - - buildFFT(curve, "G1"); - buildFFT(curve, "G2"); - buildFFT(curve, "Fr"); - - buildPairing(curve); - - curve.array2buffer = function(arr, sG) { - const buff = new Uint8Array(sG*arr.length); - - for (let i=0; i. -*/ - -function toNumber(n) { - return BigInt(n); -} - -function isNegative(n) { - return n < 0n; -} - -function isZero(n) { - return n === 0n; -} - -function bitLength(n) { - if (isNegative(n)) { - return n.toString(2).length - 1; // discard the - sign - } else { - return n.toString(2).length; - } -} - -function u32(n) { - const b = []; - const v = toNumber(n); - b.push(Number(v & 0xFFn)); - b.push(Number(v >> 8n & 0xFFn)); - b.push(Number(v >> 16n & 0xFFn)); - b.push(Number(v >> 24n & 0xFFn)); - return b; -} - -function toUTF8Array(str) { - var utf8 = []; - for (var i=0; i < str.length; i++) { - var charcode = str.charCodeAt(i); - if (charcode < 0x80) utf8.push(charcode); - else if (charcode < 0x800) { - utf8.push(0xc0 | (charcode >> 6), - 0x80 | (charcode & 0x3f)); - } - else if (charcode < 0xd800 || charcode >= 0xe000) { - utf8.push(0xe0 | (charcode >> 12), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); - } - // surrogate pair - else { - i++; - // UTF-16 encodes 0x10000-0x10FFFF by - // subtracting 0x10000 and splitting the - // 20 bits of 0x0-0xFFFFF into two halves - charcode = 0x10000 + (((charcode & 0x3ff)<<10) - | (str.charCodeAt(i) & 0x3ff)); - utf8.push(0xf0 | (charcode >>18), - 0x80 | ((charcode>>12) & 0x3f), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); - } - } - return utf8; -} - -function string(str) { - const bytes = toUTF8Array(str); - return [ ...varuint32(bytes.length), ...bytes ]; -} - -function varuint(n) { - const code = []; - let v = toNumber(n); - if (isNegative(v)) throw new Error("Number cannot be negative"); - while (!isZero(v)) { - code.push(Number(v & 0x7Fn)); - v = v >> 7n; - } - if (code.length==0) code.push(0); - for (let i=0; i 0xFFFFFFFFn) throw new Error("Number too big"); - if (v > 0x7FFFFFFFn) v = v - 0x100000000n; - // bigInt("-80000000", 16) as base10 - if (v < -2147483648n) throw new Error("Number too small"); - return varint(v); -} + fnName = "g2m_"+fn; + sMid = G.F.n8*3; + if (outType == "affine") { + fnMid2Out = "g2m_batchToAffine"; + sOut = G.F.n8*2; + } else { + sOut = G.F.n8*3; + } + } else if (groupName == "Fr") { + sIn = Fr.n8; + sOut = Fr.n8; + sMid = Fr.n8; + fnName = "frm_" + fn; + } else { + throw new Error("Invalid group"); + } -function varint64(n) { - let v = toNumber(n); - if (v > 0xFFFFFFFFFFFFFFFFn) throw new Error("Number too big"); - if (v > 0x7FFFFFFFFFFFFFFFn) v = v - 0x10000000000000000n; - // bigInt("-8000000000000000", 16) as base10 - if (v < -9223372036854775808n) throw new Error("Number too small"); - return varint(v); -} + if (buff1.byteLength != buff2.byteLength) { + throw new Error("Invalid buffer size"); + } + const nPoints = Math.floor(buff1.byteLength / sIn); + if (nPoints != 1 << log2(nPoints)) { + throw new Error("Invalid number of points"); + } -function varuint32(n) { - let v = toNumber(n); - if (v > 0xFFFFFFFFn) throw new Error("Number too big"); - return varuint(v); -} + let chunkSize = Math.floor(nPoints /tm.concurrency); + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; -function toHexString(byteArray) { - return Array.from(byteArray, function(byte) { - return ("0" + (byte & 0xFF).toString(16)).slice(-2); - }).join(""); -} + const opPromises = []; -/* - Copyright 2019 0KIMS association. + for (let i=0; i { + if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); + return r; + }) + ); + } - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ + const result = await Promise.all(opPromises); + let fullBuffOut1; + let fullBuffOut2; + if (nPoints * sOut > 1<<28) { + fullBuffOut1 = new BigBuffer(nPoints*sOut); + fullBuffOut2 = new BigBuffer(nPoints*sOut); + } else { + fullBuffOut1 = new Uint8Array(nPoints*sOut); + fullBuffOut2 = new Uint8Array(nPoints*sOut); + } -class CodeBuilder { - constructor(func) { - this.func = func; - this.functionName = func.functionName; - this.module = func.module; - } + let p =0; + for (let i=0; i Fr.s+1) { + if (logger) logger.error("lagrangeEvaluations input too big"); + throw new Error("lagrangeEvaluations input too big"); + } + let t0 = buff.slice(0, buff.byteLength/2); + let t1 = buff.slice(buff.byteLength/2, buff.byteLength); - i64_store(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 3; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 3; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x37, align, ...varuint32(offset)]; - } - - i64_store32(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 2; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 2; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3e, align, ...varuint32(offset)]; - } - - - i64_store16(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 1; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 1; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3d, align, ...varuint32(offset)]; - } - - - i64_store8(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 0; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 0; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3c, align, ...varuint32(offset)]; - } - i32_load8_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default - return [...idxCode, 0x2c, align, ...varuint32(offset)]; - } + const shiftToSmallM = Fr.exp(Fr.shift, nPoints/2); + const sConst = Fr.inv( Fr.sub(Fr.one, shiftToSmallM)); - i32_load8_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default - return [...idxCode, 0x2d, align, ...varuint32(offset)]; - } + [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); - i32_load16_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default - return [...idxCode, 0x2e, align, ...varuint32(offset)]; - } + const promises = []; - i32_load16_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default - return [...idxCode, 0x2f, align, ...varuint32(offset)]; - } + promises.push( _fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); + promises.push( _fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); - i32_load(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default - return [...idxCode, 0x28, align, ...varuint32(offset)]; - } + [t0, t1] = await Promise.all(promises); - i32_store(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 2; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 2; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x36, align, ...varuint32(offset)]; - } - - - i32_store16(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 1; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 1; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3b, align, ...varuint32(offset)]; - } - - i32_store8(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 0; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 0; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; + let buffOut; + if (t0.byteLength > (1<<28)) { + buffOut = new BigBuffer(t0.byteLength*2); + } else { + buffOut = new Uint8Array(t0.byteLength*2); } - return [...idxCode, ...codeVal, 0x3a, align, ...varuint32(offset)]; - } - call(fnName, ...args) { - const idx = this.module.functionIdxByName[fnName]; - if (idx === undefined) - throw new Error(`Function not defined: Function: ${fnName}`); - return [...[].concat(...args), 0x10, ...varuint32(idx)]; - } + buffOut.set(t0); + buffOut.set(t1, t0.byteLength); - call_indirect(fnIdx, ...args) { - return [...[].concat(...args), ...fnIdx, 0x11, 0, 0]; - } + return buffOut; + }; - if(condCode, thenCode, elseCode) { - if (elseCode) { - return [...condCode, 0x04, 0x40, ...thenCode, 0x05, ...elseCode, 0x0b]; + G.fftMix = async function fftMix(buff) { + const sG = G.F.n8*3; + let fnName, fnFFTJoin; + if (groupName == "G1") { + fnName = "g1m_fftMix"; + fnFFTJoin = "g1m_fftJoin"; + } else if (groupName == "G2") { + fnName = "g2m_fftMix"; + fnFFTJoin = "g2m_fftJoin"; + } else if (groupName == "Fr") { + fnName = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; } else { - return [...condCode, 0x04, 0x40, ...thenCode, 0x0b]; + throw new Error("Invalid group"); } - } - block(bCode) { return [0x02, 0x40, ...bCode, 0x0b]; } - loop(...args) { - return [0x03, 0x40, ...[].concat(...[...args]), 0x0b]; - } - br_if(relPath, condCode) { return [...condCode, 0x0d, ...varuint32(relPath)]; } - br(relPath) { return [0x0c, ...varuint32(relPath)]; } - ret(rCode) { return [...rCode, 0x0f]; } - drop(dCode) { return [...dCode, 0x1a]; } - - i64_const(num) { return [0x42, ...varint64(num)]; } - i32_const(num) { return [0x41, ...varint32(num)]; } - - - i64_eqz(opcode) { return [...opcode, 0x50]; } - i64_eq(op1code, op2code) { return [...op1code, ...op2code, 0x51]; } - i64_ne(op1code, op2code) { return [...op1code, ...op2code, 0x52]; } - i64_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x53]; } - i64_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x54]; } - i64_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x55]; } - i64_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x56]; } - i64_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x57]; } - i64_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x58]; } - i64_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x59]; } - i64_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x5a]; } - i64_add(op1code, op2code) { return [...op1code, ...op2code, 0x7c]; } - i64_sub(op1code, op2code) { return [...op1code, ...op2code, 0x7d]; } - i64_mul(op1code, op2code) { return [...op1code, ...op2code, 0x7e]; } - i64_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x7f]; } - i64_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x80]; } - i64_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x81]; } - i64_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x82]; } - i64_and(op1code, op2code) { return [...op1code, ...op2code, 0x83]; } - i64_or(op1code, op2code) { return [...op1code, ...op2code, 0x84]; } - i64_xor(op1code, op2code) { return [...op1code, ...op2code, 0x85]; } - i64_shl(op1code, op2code) { return [...op1code, ...op2code, 0x86]; } - i64_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x87]; } - i64_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x88]; } - i64_extend_i32_s(op1code) { return [...op1code, 0xac]; } - i64_extend_i32_u(op1code) { return [...op1code, 0xad]; } - i64_clz(op1code) { return [...op1code, 0x79]; } - i64_ctz(op1code) { return [...op1code, 0x7a]; } - - i32_eqz(op1code) { return [...op1code, 0x45]; } - i32_eq(op1code, op2code) { return [...op1code, ...op2code, 0x46]; } - i32_ne(op1code, op2code) { return [...op1code, ...op2code, 0x47]; } - i32_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x48]; } - i32_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x49]; } - i32_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x4a]; } - i32_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x4b]; } - i32_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x4c]; } - i32_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x4d]; } - i32_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x4e]; } - i32_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x4f]; } - i32_add(op1code, op2code) { return [...op1code, ...op2code, 0x6a]; } - i32_sub(op1code, op2code) { return [...op1code, ...op2code, 0x6b]; } - i32_mul(op1code, op2code) { return [...op1code, ...op2code, 0x6c]; } - i32_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x6d]; } - i32_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x6e]; } - i32_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x6f]; } - i32_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x70]; } - i32_and(op1code, op2code) { return [...op1code, ...op2code, 0x71]; } - i32_or(op1code, op2code) { return [...op1code, ...op2code, 0x72]; } - i32_xor(op1code, op2code) { return [...op1code, ...op2code, 0x73]; } - i32_shl(op1code, op2code) { return [...op1code, ...op2code, 0x74]; } - i32_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x75]; } - i32_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x76]; } - i32_rotl(op1code, op2code) { return [...op1code, ...op2code, 0x77]; } - i32_rotr(op1code, op2code) { return [...op1code, ...op2code, 0x78]; } - i32_wrap_i64(op1code) { return [...op1code, 0xa7]; } - i32_clz(op1code) { return [...op1code, 0x67]; } - i32_ctz(op1code) { return [...op1code, 0x68]; } - - unreachable() { return [ 0x0 ]; } - - current_memory() { return [ 0x3f, 0]; } - - comment() { return []; } -} + const nPoints = Math.floor(buff.byteLength / sG); + const power = log2(nPoints); -/* - Copyright 2019 0KIMS association. + let nChunks = 1 << log2(tm.concurrency); - This file is part of wasmbuilder + if (nPoints <= nChunks*2) nChunks = 1; - wasmbuilder is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + const pointsPerChunk = nPoints / nChunks; - wasmbuilder is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. + const powerChunk = log2(pointsPerChunk); - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ + const opPromises = []; + for (let i=0; i typeCodes[p.type])]; - const returns = this.returnType ? [0x01, typeCodes[this.returnType]] : [0]; - return [0x60, ...params, ...returns]; - } + return fullBuffOut; + }; - getBody() { - const locals = this.locals.map((l) => [ - ...varuint32(l.length), - typeCodes[l.type] - ]); + G.fftJoin = async function fftJoin(buff1, buff2, first, inc) { + const sG = G.F.n8*3; + let fnName; + if (groupName == "G1") { + fnName = "g1m_fftJoin"; + } else if (groupName == "G2") { + fnName = "g2m_fftJoin"; + } else if (groupName == "Fr") { + fnName = "frm_fftJoin"; + } else { + throw new Error("Invalid group"); + } - const body = [ - ...varuint32(this.locals.length), - ...[].concat(...locals), - ...this.code, - 0x0b - ]; - return [ - ...varuint32(body.length), - ...body - ]; - } + if (buff1.byteLength != buff2.byteLength) { + throw new Error("Invalid buffer size"); + } + const nPoints = Math.floor(buff1.byteLength / sG); + if (nPoints != 1 << log2(nPoints)) { + throw new Error("Invalid number of points"); + } - addCode(...code) { - this.code.push(...[].concat(...[...code])); - } + let nChunks = 1 << log2(tm.concurrency); + if (nPoints <= nChunks*2) nChunks = 1; - getCodeBuilder() { - return new CodeBuilder(this); - } -} + const pointsPerChunk = nPoints / nChunks; -/* - Copyright 2019 0KIMS association. - This file is part of wasmbuilder + const opPromises = []; + for (let i=0; i. -*/ + const result = await Promise.all(opPromises); -class ModuleBuilder { + let fullBuffOut1; + let fullBuffOut2; + if (buff1 instanceof BigBuffer) { + fullBuffOut1 = new BigBuffer(nPoints*sG); + fullBuffOut2 = new BigBuffer(nPoints*sG); + } else { + fullBuffOut1 = new Uint8Array(nPoints*sG); + fullBuffOut2 = new Uint8Array(nPoints*sG); + } - constructor() { - this.functions = []; - this.functionIdxByName = {}; - this.nImportFunctions = 0; - this.nInternalFunctions =0; - this.memory = { - pagesSize: 1, - moduleName: "env", - fieldName: "memory" - }; - this.free = 8; - this.datas = []; - this.modules = {}; - this.exports = []; - this.functionsTable = []; - } + let p =0; + for (let i=0; i0) - &&(this.functions[this.functions.length-1].type == "internal")) - throw new Error(`Import functions must be declared before internal: ${fnName}`); + const opPromises = []; + for (let i=0; i=0; i--) { + fullBuffOut.set(result[i][0], p); + p+=result[i][0].byteLength; + } - setMemory(pagesSize, moduleName, fieldName) { - this.memory = { - pagesSize: pagesSize, - moduleName: moduleName || "env", - fieldName: fieldName || "memory" - }; - } + return fullBuffOut; + }; +} - exportFunction(fnName, _exportName) { - const exportName = _exportName || fnName; - if (typeof(this.functionIdxByName[fnName]) === "undefined") - throw new Error(`Function not defined: ${fnName}`); - const idx = this.functionIdxByName[fnName]; - if (exportName != fnName) { - this.functionIdxByName[exportName] = idx; - } - this.exports.push({ - exportName: exportName, - idx: idx - }); - } +async function buildEngine(params) { - addFunctionToTable(fnName) { - const idx = this.functionIdxByName[fnName]; - this.functionsTable.push(idx); - } + const tm = await buildThreadManager(params.wasm, params.singleThread); - addData(offset, bytes) { - this.datas.push({ - offset: offset, - bytes: bytes - }); - } - alloc(a, b) { - let size; - let bytes; - if ((Array.isArray(a) || ArrayBuffer.isView(a)) && (typeof(b) === "undefined")) { - size = a.length; - bytes = a; - } else { - size = a; - bytes = b; - } - size = (((size-1)>>3) +1)<<3; // Align to 64 bits. - const p = this.free; - this.free += size; - if (bytes) { - this.addData(p, bytes); - } - return p; - } + const curve = {}; - allocString(s) { - const encoder = new globalThis.TextEncoder(); - const uint8array = encoder.encode(s); - return this.alloc([...uint8array, 0]); - } + curve.q = e(params.wasm.q.toString()); + curve.r = e(params.wasm.r.toString()); + curve.name = params.name; + curve.tm = tm; + curve.prePSize = params.wasm.prePSize; + curve.preQSize = params.wasm.preQSize; + curve.Fr = new WasmField1(tm, "frm", params.n8r, params.r); + curve.F1 = new WasmField1(tm, "f1m", params.n8q, params.q); + curve.F2 = new WasmField2(tm, "f2m", curve.F1); + curve.G1 = new WasmCurve(tm, "g1m", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1); + curve.G2 = new WasmCurve(tm, "g2m", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2); + curve.F6 = new WasmField3(tm, "f6m", curve.F2); + curve.F12 = new WasmField2(tm, "ftm", curve.F6); - _setSignatures() { - this.signatures = []; - const signatureIdxByName = {}; - if (this.functionsTable.length>0) { - const signature = this.functions[this.functionsTable[0]].getSignature(); - const signatureName = "s_"+toHexString(signature); - signatureIdxByName[signatureName] = 0; - this.signatures.push(signature); - } - for (let i=0; i Uint8Array, used once at curve load to decode the vendored wasm. +// +// Prefer the platform decoder (Buffer in Node, atob in browsers/extensions) for +// speed, and fall back to a pure-JS implementation only where neither exists -- +// e.g. a SES hardened realm that has not endowed atob/Buffer. The fallback keeps the +// curve loadable everywhere without depending on any host base64 primitive. + +const CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +let LOOKUP; + +function decodePureJs(b64) { + if (!LOOKUP) { + LOOKUP = new Uint8Array(256); + for (let i = 0; i < CHARS.length; i++) LOOKUP[CHARS.charCodeAt(i)] = i; + } + const len = b64.length; + let pad = 0; + if (len > 0 && b64[len - 1] === "=") pad++; + if (len > 1 && b64[len - 2] === "=") pad++; + const outLen = ((len * 3) >> 2) - pad; + const out = new Uint8Array(outLen); + let o = 0; + for (let i = 0; i < len; i += 4) { + const a = LOOKUP[b64.charCodeAt(i)]; + const b = LOOKUP[b64.charCodeAt(i + 1)]; + const c = LOOKUP[b64.charCodeAt(i + 2)]; + const d = LOOKUP[b64.charCodeAt(i + 3)]; + if (o < outLen) out[o++] = (a << 2) | (b >> 4); + if (o < outLen) out[o++] = ((b & 15) << 4) | (c >> 2); + if (o < outLen) out[o++] = ((c & 3) << 6) | d; } + return out; +} - _buildData() { - const entries = []; - entries.push([ - 0x00, - 0x41, - 0x00, - 0x0b, - 0x04, - ...u32(this.free) - ]); - for (let i=0; i< this.datas.length; i++) { - entries.push([ - 0x00, - 0x41, - ...varint32(this.datas[i].offset), - 0x0b, - ...varuint32(this.datas[i].bytes.length), - ...this.datas[i].bytes, - ]); - } - return this._buildSection( - 0x0b, - varuint32(entries.length).concat(...entries) - ); +function base64ToUint8Array(b64) { + if (typeof Buffer !== "undefined" && typeof Buffer.from === "function") { + // Node (and Node-compatible runtimes) — fastest. + return new Uint8Array(Buffer.from(b64, "base64")); } - + if (typeof atob === "function") { + // Browsers, extensions, modern Node, Deno. + const bin = atob(b64); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); + return out; + } + // SES hardened realm or any host without a base64 primitive. + return decodePureJs(b64); } -globalThis.curve_bn128 = null; +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bn128 = null; async function buildBn128(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bn128)) return globalThis.curve_bn128; - - const moduleBuilder = new ModuleBuilder(); - moduleBuilder.setMemory(25); - buildBn128$1(moduleBuilder); - - if (plugins) plugins(moduleBuilder); - - const bn128wasm = {}; - - bn128wasm.code = moduleBuilder.build(); - bn128wasm.pq = moduleBuilder.modules.f1m.pq; - bn128wasm.pr = moduleBuilder.modules.frm.pq; - bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; - bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; - bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; - bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; - bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; - bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; - bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; - bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; - bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; - bn128wasm.n8q = 32; - bn128wasm.n8r = 32; - bn128wasm.q = moduleBuilder.modules.bn128.q; - bn128wasm.r = moduleBuilder.modules.bn128.r; + if ((!singleThread) && (curve_bn128)) return curve_bn128; + + let bn128wasm = {}; + + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: statically imported (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Regenerate the vendored module with `npm run gen-wasm`. + bn128wasm.code = base64ToUint8Array(code$2); + bn128wasm.pq = pq$1; + bn128wasm.pr = pq$1; + bn128wasm.pG1gen = pG1gen$1; + bn128wasm.pG1zero = pG1zero$1; + bn128wasm.pG1b = pG1b$1; + bn128wasm.pG2gen = pG2gen$1; + bn128wasm.pG2zero = pG2zero$1; + bn128wasm.pG2b = pG2b$1; + bn128wasm.pOneT = pOneT$1; + bn128wasm.prePSize = prePSize$1; + bn128wasm.preQSize = preQSize$1; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = q$1; + bn128wasm.r = r$1; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import('wasmbuilder'); + const { buildBn128: buildBn128wasm } = await import('wasmcurves'); + + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBn128wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bn128wasm.code = moduleBuilder.build(); + bn128wasm.pq = moduleBuilder.modules.f1m.pq; + bn128wasm.pr = moduleBuilder.modules.frm.pq; + bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; + bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; + bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; + bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; + bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; + bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; + bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; + bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; + bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = moduleBuilder.modules.bn128.q; + bn128wasm.r = moduleBuilder.modules.bn128.r; + } + + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bn128wasm.batchCode = base64ToUint8Array(code$1); + // The batch module's GLV path hardcodes the bn254 endomorphism constants. + bn128wasm.glv = true; const params = { name: "bn128", @@ -18070,48 +6277,106 @@ async function buildBn128(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bn128 = null; + curve_bn128 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bn128 = curve; + curve_bn128 = curve; } return curve; } -globalThis.curve_bls12381 = null; +// AUTO-GENERATED from wasmcurves/build/bls12381_wasm.js — do not edit. +// Regenerate with: npm run gen-wasm +// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are +// pointer offsets / field moduli. +const code = "AGFzbQEAAAABjwERYAJ/fwBgA39/fwBgAX8Bf2AEf39/fwBgBX9/f39/AGABfwBgAn9/AX9gBn9/f39/fwBgA39/fwF/YAh/f39/f39/fwBgAn9+AGAEf39/fwF/YAp/f39/f39/f39/AGAFf39/f38Bf2AHf39/f39/fwF/YAl/f39/f39/f38Bf2ALf39/f39/f39/f38BfwIPAQNlbnYGbWVtb3J5AgAZA68CrQIABQIFBgYICAEAAAoDAQIBAQAAAQAAAAACAgAFAQMEAQEDAAIABQIFBgYICAEAAAMBAgEBAAABAAAAAAICAAUBAwQBAQMAAgEAAAICAgUFAAAABgYGAAABAQEAAAEBAQAAAAAAAgIBAAEAAAAAAQEBAQELBwkECQQDAwADAgAABAcHAQEHAAMMBAMCBQABAQABAQAAAwICBAMAAgICBQUAAAAGBgYAAAEBAQAAAQEBAAAAAAACAgEAAAAAAAEBAQEBCQQJBAMDAQADAAAEBwcBAQcBAAMAAAQHBwEBBwEBBAQEBAQAAgIFBQABAAEBAAIGAAMCBAMAAgIFBQABAQABAQAAAAAGAAMCAgQDAAIBAwQBAAAAAAAAAAAAAAICAgIAAAEAAAAACA0ODxABB74nvQIJaW50cV9jb3B5AAAJaW50cV96ZXJvAAEIaW50cV9vbmUAAwtpbnRxX2lzWmVybwACB2ludHFfZXEABAhpbnRxX2d0ZQAFCGludHFfYWRkAAYIaW50cV9zdWIABwhpbnRxX211bAAIC2ludHFfc3F1YXJlAAkOaW50cV9zcXVhcmVPbGQACghpbnRxX2RpdgAMD2ludHFfaW52ZXJzZU1vZAANCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAPB2YxbV9zdWIAEAdmMW1fbmVnABEOZjFtX2lzTmVnYXRpdmUAGAlmMW1faXNPbmUADghmMW1fc2lnbgAZC2YxbV9tUmVkdWN0ABIHZjFtX211bAATCmYxbV9zcXVhcmUAFA1mMW1fc3F1YXJlT2xkABUSZjFtX2Zyb21Nb250Z29tZXJ5ABcQZjFtX3RvTW9udGdvbWVyeQAWC2YxbV9pbnZlcnNlABoHZjFtX29uZQAbCGYxbV9sb2FkABwPZjFtX3RpbWVzU2NhbGFyAB0HZjFtX2V4cAAhEGYxbV9iYXRjaEludmVyc2UAHghmMW1fc3FydAAiDGYxbV9pc1NxdWFyZQAjFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAfF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5ACAJaW50cl9jb3B5ACQJaW50cl96ZXJvACUIaW50cl9vbmUAJwtpbnRyX2lzWmVybwAmB2ludHJfZXEAKAhpbnRyX2d0ZQApCGludHJfYWRkACoIaW50cl9zdWIAKwhpbnRyX211bAAsC2ludHJfc3F1YXJlAC0OaW50cl9zcXVhcmVPbGQALghpbnRyX2RpdgAvD2ludHJfaW52ZXJzZU1vZAAwCGZybV9jb3B5ACQIZnJtX3plcm8AJQpmcm1faXNaZXJvACYGZnJtX2VxACgHZnJtX2FkZAAyB2ZybV9zdWIAMwdmcm1fbmVnADQOZnJtX2lzTmVnYXRpdmUAOwlmcm1faXNPbmUAMQhmcm1fc2lnbgA8C2ZybV9tUmVkdWN0ADUHZnJtX211bAA2CmZybV9zcXVhcmUANw1mcm1fc3F1YXJlT2xkADgSZnJtX2Zyb21Nb250Z29tZXJ5ADoQZnJtX3RvTW9udGdvbWVyeQA5C2ZybV9pbnZlcnNlAD0HZnJtX29uZQA+CGZybV9sb2FkAD8PZnJtX3RpbWVzU2NhbGFyAEAHZnJtX2V4cABEEGZybV9iYXRjaEludmVyc2UAQQhmcm1fc3FydABFDGZybV9pc1NxdWFyZQBGFWZybV9iYXRjaFRvTW9udGdvbWVyeQBCF2ZybV9iYXRjaEZyb21Nb250Z29tZXJ5AEMGZnJfYWRkADIGZnJfc3ViADMGZnJfbmVnADQGZnJfbXVsAEcJZnJfc3F1YXJlAEgKZnJfaW52ZXJzZQBJDWZyX2lzTmVnYXRpdmUASgdmcl9jb3B5ACQHZnJfemVybwAlBmZyX29uZQA+CWZyX2lzWmVybwAmBWZyX2VxACgMZzFtX211bHRpZXhwAHUSZzFtX211bHRpZXhwX2NodW5rAHQSZzFtX211bHRpZXhwQWZmaW5lAHcYZzFtX211bHRpZXhwQWZmaW5lX2NodW5rAHYKZzFtX2lzWmVybwBMEGcxbV9pc1plcm9BZmZpbmUASwZnMW1fZXEAVAtnMW1fZXFNaXhlZABTDGcxbV9lcUFmZmluZQBSCGcxbV9jb3B5AFAOZzFtX2NvcHlBZmZpbmUATwhnMW1femVybwBODmcxbV96ZXJvQWZmaW5lAE0KZzFtX2RvdWJsZQBWEGcxbV9kb3VibGVBZmZpbmUAVQdnMW1fYWRkAFkMZzFtX2FkZE1peGVkAFgNZzFtX2FkZEFmZmluZQBXB2cxbV9uZWcAWw1nMW1fbmVnQWZmaW5lAFoHZzFtX3N1YgBeDGcxbV9zdWJNaXhlZABdDWcxbV9zdWJBZmZpbmUAXBJnMW1fZnJvbU1vbnRnb21lcnkAYBhnMW1fZnJvbU1vbnRnb21lcnlBZmZpbmUAXxBnMW1fdG9Nb250Z29tZXJ5AGIWZzFtX3RvTW9udGdvbWVyeUFmZmluZQBhD2cxbV90aW1lc1NjYWxhcgB4FWcxbV90aW1lc1NjYWxhckFmZmluZQB5DWcxbV9ub3JtYWxpemUAZwpnMW1fTEVNdG9VAGkKZzFtX0xFTXRvQwBqCmcxbV9VdG9MRU0AawpnMW1fQ3RvTEVNAGwPZzFtX2JhdGNoTEVNdG9VAG0PZzFtX2JhdGNoTEVNdG9DAG4PZzFtX2JhdGNoVXRvTEVNAG8PZzFtX2JhdGNoQ3RvTEVNAHAMZzFtX3RvQWZmaW5lAGMOZzFtX3RvSmFjb2JpYW4AURFnMW1fYmF0Y2hUb0FmZmluZQBmE2cxbV9iYXRjaFRvSmFjb2JpYW4AcQtnMW1faW5DdXJ2ZQBlEWcxbV9pbkN1cnZlQWZmaW5lAGQXZnJtX19yZXZlcnNlUGVybXV0YXRpb24Aegdmcm1fZmZ0AH0IZnJtX2lmZnQAfgpmcm1fcmF3ZmZ0AHsLZnJtX2ZmdEpvaW4Afw5mcm1fZmZ0Sm9pbkV4dACAARFmcm1fZmZ0Sm9pbkV4dEludgCBAQpmcm1fZmZ0TWl4AIIBDGZybV9mZnRGaW5hbACDAR1mcm1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgCEAQhwb2xfemVybwCFAQ9wb2xfY29uc3RydWN0TEMAhgEMcWFwX2J1aWxkQUJDAIcBC3FhcF9qb2luQUJDAIgBDHFhcF9iYXRjaEFkZACJAQpmMm1faXNaZXJvAEsJZjJtX2lzT25lAIoBCGYybV96ZXJvAE0HZjJtX29uZQCLAQhmMm1fY29weQCMAQdmMm1fbXVsAI0BCGYybV9tdWwxAI4BCmYybV9zcXVhcmUAjwEHZjJtX2FkZACQAQdmMm1fc3ViAJEBB2YybV9uZWcAkgEIZjJtX3NpZ24AlQENZjJtX2Nvbmp1Z2F0ZQBaEmYybV9mcm9tTW9udGdvbWVyeQBfEGYybV90b01vbnRnb21lcnkAYQZmMm1fZXEAUgtmMm1faW52ZXJzZQCTAQdmMm1fZXhwAJgBD2YybV90aW1lc1NjYWxhcgCUARBmMm1fYmF0Y2hJbnZlcnNlAJcBCGYybV9zcXJ0AJkBDGYybV9pc1NxdWFyZQCaAQ5mMm1faXNOZWdhdGl2ZQCWAQxnMm1fbXVsdGlleHAAwgESZzJtX211bHRpZXhwX2NodW5rAMEBEmcybV9tdWx0aWV4cEFmZmluZQDEARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsAwwEKZzJtX2lzWmVybwCcARBnMm1faXNaZXJvQWZmaW5lAJsBBmcybV9lcQCkAQtnMm1fZXFNaXhlZACjAQxnMm1fZXFBZmZpbmUAogEIZzJtX2NvcHkAoAEOZzJtX2NvcHlBZmZpbmUAnwEIZzJtX3plcm8AngEOZzJtX3plcm9BZmZpbmUAnQEKZzJtX2RvdWJsZQCmARBnMm1fZG91YmxlQWZmaW5lAKUBB2cybV9hZGQAqQEMZzJtX2FkZE1peGVkAKgBDWcybV9hZGRBZmZpbmUApwEHZzJtX25lZwCrAQ1nMm1fbmVnQWZmaW5lAKoBB2cybV9zdWIArgEMZzJtX3N1Yk1peGVkAK0BDWcybV9zdWJBZmZpbmUArAESZzJtX2Zyb21Nb250Z29tZXJ5ALABGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQCvARBnMm1fdG9Nb250Z29tZXJ5ALIBFmcybV90b01vbnRnb21lcnlBZmZpbmUAsQEPZzJtX3RpbWVzU2NhbGFyAMUBFWcybV90aW1lc1NjYWxhckFmZmluZQDGAQ1nMm1fbm9ybWFsaXplALcBCmcybV9MRU10b1UAuAEKZzJtX0xFTXRvQwC5AQpnMm1fVXRvTEVNALoBCmcybV9DdG9MRU0AuwEPZzJtX2JhdGNoTEVNdG9VALwBD2cybV9iYXRjaExFTXRvQwC9AQ9nMm1fYmF0Y2hVdG9MRU0AvgEPZzJtX2JhdGNoQ3RvTEVNAL8BDGcybV90b0FmZmluZQCzAQ5nMm1fdG9KYWNvYmlhbgChARFnMm1fYmF0Y2hUb0FmZmluZQC2ARNnMm1fYmF0Y2hUb0phY29iaWFuAMABC2cybV9pbkN1cnZlALUBEWcybV9pbkN1cnZlQWZmaW5lALQBC2cxbV90aW1lc0ZyAMcBF2cxbV9fcmV2ZXJzZVBlcm11dGF0aW9uAMgBB2cxbV9mZnQAygEIZzFtX2lmZnQAywEKZzFtX3Jhd2ZmdADJAQtnMW1fZmZ0Sm9pbgDMAQ5nMW1fZmZ0Sm9pbkV4dADNARFnMW1fZmZ0Sm9pbkV4dEludgDOAQpnMW1fZmZ0TWl4AM8BDGcxbV9mZnRGaW5hbADQAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDRAQtnMm1fdGltZXNGcgDSARdnMm1fX3JldmVyc2VQZXJtdXRhdGlvbgDTAQdnMm1fZmZ0ANUBCGcybV9pZmZ0ANYBCmcybV9yYXdmZnQA1AELZzJtX2ZmdEpvaW4A1wEOZzJtX2ZmdEpvaW5FeHQA2AERZzJtX2ZmdEpvaW5FeHRJbnYA2QEKZzJtX2ZmdE1peADaAQxnMm1fZmZ0RmluYWwA2wEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A3AERZzFtX3RpbWVzRnJBZmZpbmUA3QERZzJtX3RpbWVzRnJBZmZpbmUA3gERZnJtX2JhdGNoQXBwbHlLZXkA3wERZzFtX2JhdGNoQXBwbHlLZXkA4AEWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZADhARFnMm1fYmF0Y2hBcHBseUtleQDiARZnMm1fYmF0Y2hBcHBseUtleU1peGVkAOMBCmY2bV9pc1plcm8A5QEJZjZtX2lzT25lAOYBCGY2bV96ZXJvAOcBB2Y2bV9vbmUA6AEIZjZtX2NvcHkA6QEHZjZtX211bADqAQpmNm1fc3F1YXJlAOsBB2Y2bV9hZGQA7AEHZjZtX3N1YgDtAQdmNm1fbmVnAO4BCGY2bV9zaWduAO8BEmY2bV9mcm9tTW9udGdvbWVyeQCwARBmNm1fdG9Nb250Z29tZXJ5ALIBBmY2bV9lcQDwAQtmNm1faW52ZXJzZQDxAQdmNm1fZXhwAPUBD2Y2bV90aW1lc1NjYWxhcgDyARBmNm1fYmF0Y2hJbnZlcnNlAPQBDmY2bV9pc05lZ2F0aXZlAPMBCmZ0bV9pc1plcm8A9wEJZnRtX2lzT25lAPgBCGZ0bV96ZXJvAPkBB2Z0bV9vbmUA+gEIZnRtX2NvcHkA+wEHZnRtX211bAD8AQhmdG1fbXVsMQD9AQpmdG1fc3F1YXJlAP4BB2Z0bV9hZGQA/wEHZnRtX3N1YgCAAgdmdG1fbmVnAIECCGZ0bV9zaWduAIgCDWZ0bV9jb25qdWdhdGUAggISZnRtX2Zyb21Nb250Z29tZXJ5AIQCEGZ0bV90b01vbnRnb21lcnkAgwIGZnRtX2VxAIUCC2Z0bV9pbnZlcnNlAIYCB2Z0bV9leHAAiwIPZnRtX3RpbWVzU2NhbGFyAIcCEGZ0bV9iYXRjaEludmVyc2UAigIIZnRtX3NxcnQAjAIMZnRtX2lzU3F1YXJlAI0CDmZ0bV9pc05lZ2F0aXZlAIkCEWZ0bV9mcm9iZW5pdXNNYXAwAJICEWZ0bV9mcm9iZW5pdXNNYXAxAJMCEWZ0bV9mcm9iZW5pdXNNYXAyAJQCEWZ0bV9mcm9iZW5pdXNNYXAzAJUCEWZ0bV9mcm9iZW5pdXNNYXA0AJYCEWZ0bV9mcm9iZW5pdXNNYXA1AJcCEWZ0bV9mcm9iZW5pdXNNYXA2AJgCEWZ0bV9mcm9iZW5pdXNNYXA3AJkCEWZ0bV9mcm9iZW5pdXNNYXA4AJoCEWZ0bV9mcm9iZW5pdXNNYXA5AJsCE2JsczEyMzgxX3BhaXJpbmdFcTEApwITYmxzMTIzODFfcGFpcmluZ0VxMgCoAhNibHMxMjM4MV9wYWlyaW5nRXEzAKkCE2JsczEyMzgxX3BhaXJpbmdFcTQAqgITYmxzMTIzODFfcGFpcmluZ0VxNQCrAhBibHMxMjM4MV9wYWlyaW5nAKwCEmJsczEyMzgxX3ByZXBhcmVHMQCgAhJibHMxMjM4MV9wcmVwYXJlRzIAoQITYmxzMTIzODFfbWlsbGVyTG9vcACiAhxibHMxMjM4MV9maW5hbEV4cG9uZW50aWF0aW9uAKYCH2JsczEyMzgxX2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAowIaYmxzMTIzODFfX2N5Y2xvdG9taWNTcXVhcmUApAIaYmxzMTIzODFfX2N5Y2xvdG9taWNFeHBfdzAApQIIZjZtX211bDEAjgIJZjZtX211bDAxAI8CCmZ0bV9tdWwwMTQAkAIRZzFtX2luR3JvdXBBZmZpbmUAnAILZzFtX2luR3JvdXAAnQIRZzJtX2luR3JvdXBBZmZpbmUAngILZzJtX2luR3JvdXAAnwIK7dgErQI+ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKAssACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtEACAAKQMoUAR+IAApAyBQBH4gACkDGFAEfiAAKQMQUAR+IAApAwhQBH4gACkDAAVCAQsFQgELBUIBCwVCAQsFQgELUAssACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtiACAAKQMoIAEpAyhRBH8gACkDICABKQMgUQR/IAApAxggASkDGFEEfyAAKQMQIAEpAxBRBH8gACkDCCABKQMIUQR/IAApAwAgASkDAFEFQQALBUEACwVBAAsFQQALBUEACwu3AQAgACkDKCABKQMoVAR/QQAFIAApAyggASkDKFYEf0EBBSAAKQMgIAEpAyBUBH9BAAUgACkDICABKQMgVgR/QQEFIAApAxggASkDGFQEf0EABSAAKQMYIAEpAxhWBH9BAQUgACkDECABKQMQVAR/QQAFIAApAxAgASkDEFYEf0EBBSAAKQMIIAEpAwhUBH9BAAUgACkDCCABKQMIVgR/QQEFIAApAwAgASkDAFoLCwsLCwsLCwsLC6QCAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIAIgADUCICABNQIgfCADQiCIfCIDPgIgIAIgADUCJCABNQIkfCADQiCIfCIDPgIkIAIgADUCKCABNQIofCADQiCIfCIDPgIoIAIgADUCLCABNQIsfCADQiCIfCIDPgIsIANCIIinC/gCAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgAiAANQIgIAE1AiB9IANCIId8IgNC/////w+DPgIgIAIgADUCJCABNQIkfSADQiCHfCIDQv////8Pgz4CJCACIAA1AiggATUCKH0gA0Igh3wiA0L/////D4M+AiggAiAANQIsIAE1Aix9IANCIId8IgNC/////w+DPgIsIANCIIenC84fARl+IAQgADUCACIFIAE1AgAiBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIAIARCIIghAyADIAUgATUCBCIHfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgQiCCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgQgA0IgiCEEIAQgBSABNQIIIgl+IANC/////w+DfCIDQiCIfCEEIAQgByAIfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AggiCiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgggBEIgiCEDIAMgBSABNQIMIgt+IARC/////w+DfCIEQiCIfCEDIAMgCCAJfiAEQv////8Pg3wiBEIgiHwhAyADIAcgCn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIMIgwgBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIMIANCIIghBCAEIAUgATUCECINfiADQv////8Pg3wiA0IgiHwhBCAEIAggC34gA0L/////D4N8IgNCIIh8IQQgBCAJIAp+IANC/////w+DfCIDQiCIfCEEIAQgByAMfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhAiDiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhAgBEIgiCEDIAMgBSABNQIUIg9+IARC/////w+DfCIEQiCIfCEDIAMgCCANfiAEQv////8Pg3wiBEIgiHwhAyADIAogC34gBEL/////D4N8IgRCIIh8IQMgAyAJIAx+IARC/////w+DfCIEQiCIfCEDIAMgByAOfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhQiECAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhQgA0IgiCEEIAQgBSABNQIYIhF+IANC/////w+DfCIDQiCIfCEEIAQgCCAPfiADQv////8Pg3wiA0IgiHwhBCAEIAogDX4gA0L/////D4N8IgNCIIh8IQQgBCALIAx+IANC/////w+DfCIDQiCIfCEEIAQgCSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAcgEH4gA0L/////D4N8IgNCIIh8IQQgBCAANQIYIhIgBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIYIARCIIghAyADIAUgATUCHCITfiAEQv////8Pg3wiBEIgiHwhAyADIAggEX4gBEL/////D4N8IgRCIIh8IQMgAyAKIA9+IARC/////w+DfCIEQiCIfCEDIAMgDCANfiAEQv////8Pg3wiBEIgiHwhAyADIAsgDn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBB+IARC/////w+DfCIEQiCIfCEDIAMgByASfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhwiFCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhwgA0IgiCEEIAQgBSABNQIgIhV+IANC/////w+DfCIDQiCIfCEEIAQgCCATfiADQv////8Pg3wiA0IgiHwhBCAEIAogEX4gA0L/////D4N8IgNCIIh8IQQgBCAMIA9+IANC/////w+DfCIDQiCIfCEEIAQgDSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAsgEH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBJ+IANC/////w+DfCIDQiCIfCEEIAQgByAUfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AiAiFiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiAgBEIgiCEDIAMgBSABNQIkIhd+IARC/////w+DfCIEQiCIfCEDIAMgCCAVfiAEQv////8Pg3wiBEIgiHwhAyADIAogE34gBEL/////D4N8IgRCIIh8IQMgAyAMIBF+IARC/////w+DfCIEQiCIfCEDIAMgDiAPfiAEQv////8Pg3wiBEIgiHwhAyADIA0gEH4gBEL/////D4N8IgRCIIh8IQMgAyALIBJ+IARC/////w+DfCIEQiCIfCEDIAMgCSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAcgFn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIkIhggBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAUgATUCKCIZfiADQv////8Pg3wiA0IgiHwhBCAEIAggF34gA0L/////D4N8IgNCIIh8IQQgBCAKIBV+IANC/////w+DfCIDQiCIfCEEIAQgDCATfiADQv////8Pg3wiA0IgiHwhBCAEIA4gEX4gA0L/////D4N8IgNCIIh8IQQgBCAPIBB+IANC/////w+DfCIDQiCIfCEEIAQgDSASfiADQv////8Pg3wiA0IgiHwhBCAEIAsgFH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBZ+IANC/////w+DfCIDQiCIfCEEIAQgByAYfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AigiGiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiggBEIgiCEDIAMgBSABNQIsIht+IARC/////w+DfCIEQiCIfCEDIAMgCCAZfiAEQv////8Pg3wiBEIgiHwhAyADIAogF34gBEL/////D4N8IgRCIIh8IQMgAyAMIBV+IARC/////w+DfCIEQiCIfCEDIAMgDiATfiAEQv////8Pg3wiBEIgiHwhAyADIBAgEX4gBEL/////D4N8IgRCIIh8IQMgAyAPIBJ+IARC/////w+DfCIEQiCIfCEDIAMgDSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAsgFn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBh+IARC/////w+DfCIEQiCIfCEDIAMgByAafiAEQv////8Pg3wiBEIgiHwhAyADIAA1AiwiBSAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AiwgA0IgiCEEIAQgCCAbfiADQv////8Pg3wiA0IgiHwhBCAEIAogGX4gA0L/////D4N8IgNCIIh8IQQgBCAMIBd+IANC/////w+DfCIDQiCIfCEEIAQgDiAVfiADQv////8Pg3wiA0IgiHwhBCAEIBAgE34gA0L/////D4N8IgNCIIh8IQQgBCARIBJ+IANC/////w+DfCIDQiCIfCEEIAQgDyAUfiADQv////8Pg3wiA0IgiHwhBCAEIA0gFn4gA0L/////D4N8IgNCIIh8IQQgBCALIBh+IANC/////w+DfCIDQiCIfCEEIAQgCSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgB34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIAogG34gBEL/////D4N8IgRCIIh8IQMgAyAMIBl+IARC/////w+DfCIEQiCIfCEDIAMgDiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBAgFX4gBEL/////D4N8IgRCIIh8IQMgAyASIBN+IARC/////w+DfCIEQiCIfCEDIAMgESAUfiAEQv////8Pg3wiBEIgiHwhAyADIA8gFn4gBEL/////D4N8IgRCIIh8IQMgAyANIBh+IARC/////w+DfCIEQiCIfCEDIAMgCyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI0IANCIIghBCAEIAwgG34gA0L/////D4N8IgNCIIh8IQQgBCAOIBl+IANC/////w+DfCIDQiCIfCEEIAQgECAXfiADQv////8Pg3wiA0IgiHwhBCAEIBIgFX4gA0L/////D4N8IgNCIIh8IQQgBCATIBR+IANC/////w+DfCIDQiCIfCEEIAQgESAWfiADQv////8Pg3wiA0IgiHwhBCAEIA8gGH4gA0L/////D4N8IgNCIIh8IQQgBCANIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSALfiADQv////8Pg3wiA0IgiHwhBCACIAM+AjggBEIgiCEDIAMgDiAbfiAEQv////8Pg3wiBEIgiHwhAyADIBAgGX4gBEL/////D4N8IgRCIIh8IQMgAyASIBd+IARC/////w+DfCIEQiCIfCEDIAMgFCAVfiAEQv////8Pg3wiBEIgiHwhAyADIBMgFn4gBEL/////D4N8IgRCIIh8IQMgAyARIBh+IARC/////w+DfCIEQiCIfCEDIAMgDyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgDX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI8IANCIIghBCAEIBAgG34gA0L/////D4N8IgNCIIh8IQQgBCASIBl+IANC/////w+DfCIDQiCIfCEEIAQgFCAXfiADQv////8Pg3wiA0IgiHwhBCAEIBUgFn4gA0L/////D4N8IgNCIIh8IQQgBCATIBh+IANC/////w+DfCIDQiCIfCEEIAQgESAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgJAIARCIIghAyADIBIgG34gBEL/////D4N8IgRCIIh8IQMgAyAUIBl+IARC/////w+DfCIEQiCIfCEDIAMgFiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBUgGH4gBEL/////D4N8IgRCIIh8IQMgAyATIBp+IARC/////w+DfCIEQiCIfCEDIAMgBSARfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AkQgA0IgiCEEIAQgFCAbfiADQv////8Pg3wiA0IgiHwhBCAEIBYgGX4gA0L/////D4N8IgNCIIh8IQQgBCAXIBh+IANC/////w+DfCIDQiCIfCEEIAQgFSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgE34gA0L/////D4N8IgNCIIh8IQQgAiADPgJIIARCIIghAyADIBYgG34gBEL/////D4N8IgRCIIh8IQMgAyAYIBl+IARC/////w+DfCIEQiCIfCEDIAMgFyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgFX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJMIANCIIghBCAEIBggG34gA0L/////D4N8IgNCIIh8IQQgBCAZIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSAXfiADQv////8Pg3wiA0IgiHwhBCACIAM+AlAgBEIgiCEDIAMgGiAbfiAEQv////8Pg3wiBEIgiHwhAyADIAUgGX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJUIANCIIghBCAEIAUgG34gA0L/////D4N8IgNCIIh8IQQgAiADPgJYIAIgBD4CXAu8GQEQfiADIAA1AgAiBiAGfiACQv////8Pg3wiAkIgiHwhAyABIAI+AgAgAyIEQiCIIQUgADUCBCIHIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CBCADIgRCIIghBSAANQIIIgggBn4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgByAHfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CCCADIgRCIIghBSAANQIMIgkgBn4iAkIgiCEDIAMgByAIfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CDCADIgRCIIghBSAANQIQIgogBn4iAkIgiCEDIAMgByAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAggCH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhAgAyIEQiCIIQUgADUCFCILIAZ+IgJCIIghAyADIAcgCn4gAkL/////D4N8IgJCIIh8IQMgAyAIIAl+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIUIAMiBEIgiCEFIAA1AhgiDCAGfiICQiCIIQMgAyAHIAt+IAJC/////w+DfCICQiCIfCEDIAMgCCAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAkgCX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhggAyIEQiCIIQUgADUCHCINIAZ+IgJCIIghAyADIAcgDH4gAkL/////D4N8IgJCIIh8IQMgAyAIIAt+IAJC/////w+DfCICQiCIfCEDIAMgCSAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CHCADIgRCIIghBSAANQIgIg4gBn4iAkIgiCEDIAMgByANfiACQv////8Pg3wiAkIgiHwhAyADIAggDH4gAkL/////D4N8IgJCIIh8IQMgAyAJIAt+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCiAKfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CICADIgRCIIghBSAANQIkIg8gBn4iAkIgiCEDIAMgByAOfiACQv////8Pg3wiAkIgiHwhAyADIAggDX4gAkL/////D4N8IgJCIIh8IQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAANQIoIhAgBn4iAkIgiCEDIAMgByAPfiACQv////8Pg3wiAkIgiHwhAyADIAggDn4gAkL/////D4N8IgJCIIh8IQMgAyAJIA1+IAJC/////w+DfCICQiCIfCEDIAMgCiAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAsgC34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiggAyIEQiCIIQUgADUCLCIRIAZ+IgJCIIghAyADIAcgEH4gAkL/////D4N8IgJCIIh8IQMgAyAIIA9+IAJC/////w+DfCICQiCIfCEDIAMgCSAOfiACQv////8Pg3wiAkIgiHwhAyADIAogDX4gAkL/////D4N8IgJCIIh8IQMgAyALIAx+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIsIAMiBEIgiCEFIAcgEX4iAkIgiCEDIAMgCCAQfiACQv////8Pg3wiAkIgiHwhAyADIAkgD34gAkL/////D4N8IgJCIIh8IQMgAyAKIA5+IAJC/////w+DfCICQiCIfCEDIAMgCyANfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgCCARfiICQiCIIQMgAyAJIBB+IAJC/////w+DfCICQiCIfCEDIAMgCiAPfiACQv////8Pg3wiAkIgiHwhAyADIAsgDn4gAkL/////D4N8IgJCIIh8IQMgAyAMIA1+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI0IAMiBEIgiCEFIAkgEX4iAkIgiCEDIAMgCiAQfiACQv////8Pg3wiAkIgiHwhAyADIAsgD34gAkL/////D4N8IgJCIIh8IQMgAyAMIA5+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDSANfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4COCADIgRCIIghBSAKIBF+IgJCIIghAyADIAsgEH4gAkL/////D4N8IgJCIIh8IQMgAyAMIA9+IAJC/////w+DfCICQiCIfCEDIAMgDSAOfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CPCADIgRCIIghBSALIBF+IgJCIIghAyADIAwgEH4gAkL/////D4N8IgJCIIh8IQMgAyANIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDiAOfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CQCADIgRCIIghBSAMIBF+IgJCIIghAyADIA0gEH4gAkL/////D4N8IgJCIIh8IQMgAyAOIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJEIAMiBEIgiCEFIA0gEX4iAkIgiCEDIAMgDiAQfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIA8gD34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AkggAyIEQiCIIQUgDiARfiICQiCIIQMgAyAPIBB+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJMIAMiBEIgiCEFIA8gEX4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgECAQfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CUCADIgRCIIghBSAQIBF+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CVCADIgRCIIghBUIAIQJCACEDIAMgESARfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CWCABIAM+AlwLCgAgACAAIAEQCAtBACAAIAA1AAAgAXwiAT4AACABQiCIIQEDQCABUEUEQCAAQQRqIgA1AAAgAXwhASAAIAE+AAAgAUIgiCEBDAELCwuEBAIDfgF/IAAgA0GIASADGyIDEAAgAUEoEAAgAkHYACACGyIHEAFBuAEQAUEvIQBBLyEBA0AgAUEoai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBJWo1AABCAXwiBkIBUQRAQgBCAIAaCwNAAkADQCAAIANqLQAAIABBB0ZyRQRAIABBAWshAAwBCwsgACADakEHaykAACAGgCEFIAAgAWtBBGshAgNAIAVCgICAgHCDUCACQQBOcUUEQCAFQgiIIQUgAkEBaiECDAELCyAFUARAIANBKBAFRQ0BQgEhBUEAIQILQegBQSg1AAAgBX4iBD4AAEHsAUEsNQAAIAV+IARCIIh8IgQ+AABB8AFBMDUAACAFfiAEQiCIfCIEPgAAQfQBQTQ1AAAgBX4gBEIgiHwiBD4AAEH4AUE4NQAAIAV+IARCIIh8IgQ+AABB/AFBPDUAACAFfiAEQiCIfCIEPgAAQYACQcAANQAAIAV+IARCIIh8IgQ+AABBhAJBxAA1AAAgBX4gBEIgiHwiBD4AAEGIAkHIADUAACAFfiAEQiCIfCIEPgAAQYwCQcwANQAAIAV+IARCIIh8IgQ+AABBkAJB0AA1AAAgBX4gBEIgiHwiBD4AAEGUAkHUADUAACAFfiAEQiCIfD4AACADQegBIAJrIAMQBxogAiAHaiAFEAsMAQsLC44CAQp/QZgCIQNBmAIQAUHIAiEIIAFByAIQAEH4AiEJQfgCEANBqAMhBiAAQagDEABB2AMhC0GIBCEKQZgFIQQDQCAGEAJFBEAgCCAGIAsgChAMIAsgCUG4BBAIIAcEfyAFBH9BuAQgAxAFBH9BuAQgAyAEEAcaQQAFIANBuAQgBBAHGkEBCwVBuAQgAyAEEAYaQQELBSAFBH9BuAQgAyAEEAYaQQAFIANBuAQQBQR/IANBuAQgBBAHGkEABUG4BCADIAQQBxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACEAcaBSADIAIQAAsLCQAgAEGoBhAECywAIAAgASACEAYEQCACQcgFIAIQBxoFIAJByAUQBQRAIAJByAUgAhAHGgsLCxcAIAAgASACEAcEQCACQcgFIAIQBhoLCwsAQdgGIAAgARAQC8YhAQN+IAAgADUCAEL9//P/DyIEIAA1AgB+Qv////8PgyIDQcgFNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBzAU1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QdAFNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEHUBTUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB2AU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdwFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHgBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB5AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QegFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHsBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB8AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfQFNQIAIAN+fCICPgIsQfgIIAJCIIg+AgAgACAANQIEIAA1AgQgBH5C/////w+DIgNByAU1AgB+fCICPgIEIAAgADUCCCACQiCIfEHMBTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB0AU1AgAgA358IgI+AgwgACAANQIQIAJCIIh8QdQFNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEHYBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB3AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QeAFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHkBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB6AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QewFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHwBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB9AU1AgAgA358IgI+AjBB/AggAkIgiD4CACAAIAA1AgggADUCCCAEfkL/////D4MiA0HIBTUCAH58IgI+AgggACAANQIMIAJCIIh8QcwFNQIAIAN+fCICPgIMIAAgADUCECACQiCIfEHQBTUCACADfnwiAj4CECAAIAA1AhQgAkIgiHxB1AU1AgAgA358IgI+AhQgACAANQIYIAJCIIh8QdgFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHcBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB4AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QeQFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHoBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB7AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QfAFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEH0BTUCACADfnwiAj4CNEGACSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQcgFNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBzAU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdAFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHUBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB2AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QdwFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHgBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB5AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QegFNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEHsBTUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxB8AU1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QfQFNQIAIAN+fCICPgI4QYQJIAJCIIg+AgAgACAANQIQIAA1AhAgBH5C/////w+DIgNByAU1AgB+fCICPgIQIAAgADUCFCACQiCIfEHMBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB0AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QdQFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHYBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB3AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QeAFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHkBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB6AU1AgAgA358IgI+AjAgACAANQI0IAJCIIh8QewFNQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEHwBTUCACADfnwiAj4COCAAIAA1AjwgAkIgiHxB9AU1AgAgA358IgI+AjxBiAkgAkIgiD4CACAAIAA1AhQgADUCFCAEfkL/////D4MiA0HIBTUCAH58IgI+AhQgACAANQIYIAJCIIh8QcwFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHQBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB1AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QdgFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHcBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB4AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QeQFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHoBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB7AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QfAFNQIAIAN+fCICPgI8IAAgADUCQCACQiCIfEH0BTUCACADfnwiAj4CQEGMCSACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQcgFNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxBzAU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QdAFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHUBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB2AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QdwFNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEHgBTUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxB5AU1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QegFNQIAIAN+fCICPgI4IAAgADUCPCACQiCIfEHsBTUCACADfnwiAj4CPCAAIAA1AkAgAkIgiHxB8AU1AgAgA358IgI+AkAgACAANQJEIAJCIIh8QfQFNQIAIAN+fCICPgJEQZAJIAJCIIg+AgAgACAANQIcIAA1AhwgBH5C/////w+DIgNByAU1AgB+fCICPgIcIAAgADUCICACQiCIfEHMBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB0AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QdQFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHYBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB3AU1AgAgA358IgI+AjAgACAANQI0IAJCIIh8QeAFNQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEHkBTUCACADfnwiAj4COCAAIAA1AjwgAkIgiHxB6AU1AgAgA358IgI+AjwgACAANQJAIAJCIIh8QewFNQIAIAN+fCICPgJAIAAgADUCRCACQiCIfEHwBTUCACADfnwiAj4CRCAAIAA1AkggAkIgiHxB9AU1AgAgA358IgI+AkhBlAkgAkIgiD4CACAAIAA1AiAgADUCICAEfkL/////D4MiA0HIBTUCAH58IgI+AiAgACAANQIkIAJCIIh8QcwFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHQBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB1AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QdgFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHcBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB4AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QeQFNQIAIAN+fCICPgI8IAAgADUCQCACQiCIfEHoBTUCACADfnwiAj4CQCAAIAA1AkQgAkIgiHxB7AU1AgAgA358IgI+AkQgACAANQJIIAJCIIh8QfAFNQIAIAN+fCICPgJIIAAgADUCTCACQiCIfEH0BTUCACADfnwiAj4CTEGYCSACQiCIPgIAIAAgADUCJCAANQIkIAR+Qv////8PgyIDQcgFNQIAfnwiAj4CJCAAIAA1AiggAkIgiHxBzAU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QdAFNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEHUBTUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxB2AU1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QdwFNQIAIAN+fCICPgI4IAAgADUCPCACQiCIfEHgBTUCACADfnwiAj4CPCAAIAA1AkAgAkIgiHxB5AU1AgAgA358IgI+AkAgACAANQJEIAJCIIh8QegFNQIAIAN+fCICPgJEIAAgADUCSCACQiCIfEHsBTUCACADfnwiAj4CSCAAIAA1AkwgAkIgiHxB8AU1AgAgA358IgI+AkwgACAANQJQIAJCIIh8QfQFNQIAIAN+fCICPgJQQZwJIAJCIIg+AgAgACAANQIoIAA1AiggBH5C/////w+DIgNByAU1AgB+fCICPgIoIAAgADUCLCACQiCIfEHMBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB0AU1AgAgA358IgI+AjAgACAANQI0IAJCIIh8QdQFNQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEHYBTUCACADfnwiAj4COCAAIAA1AjwgAkIgiHxB3AU1AgAgA358IgI+AjwgACAANQJAIAJCIIh8QeAFNQIAIAN+fCICPgJAIAAgADUCRCACQiCIfEHkBTUCACADfnwiAj4CRCAAIAA1AkggAkIgiHxB6AU1AgAgA358IgI+AkggACAANQJMIAJCIIh8QewFNQIAIAN+fCICPgJMIAAgADUCUCACQiCIfEHwBTUCACADfnwiAj4CUCAAIAA1AlQgAkIgiHxB9AU1AgAgA358IgI+AlRBoAkgAkIgiD4CACAAIAA1AiwgADUCLCAEfkL/////D4MiA0HIBTUCAH58IgI+AiwgACAANQIwIAJCIIh8QcwFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHQBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB1AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QdgFNQIAIAN+fCICPgI8IAAgADUCQCACQiCIfEHcBTUCACADfnwiAj4CQCAAIAA1AkQgAkIgiHxB4AU1AgAgA358IgI+AkQgACAANQJIIAJCIIh8QeQFNQIAIAN+fCICPgJIIAAgADUCTCACQiCIfEHoBTUCACADfnwiAj4CTCAAIAA1AlAgAkIgiHxB7AU1AgAgA358IgI+AlAgACAANQJUIAJCIIh8QfAFNQIAIAN+fCICPgJUIAAgADUCWCACQiCIfEH0BTUCACADfnwiAj4CWEGkCSACQiCIPgIAQfgIIABBMGogARAPC/Q+ARt+IAUgATUCACIEIAA1AgAiEn58IgNC/////w+DIQUgBiAANQIEIhMgBH58IANCIIh8IgNC/////w+DIQYgByAANQIIIhQgBH58IANCIIh8IgNC/////w+DIQcgCCAANQIMIhUgBH58IANCIIh8IgNC/////w+DIQggCSAANQIQIhYgBH58IANCIIh8IgNC/////w+DIQkgCiAANQIUIhcgBH58IANCIIh8IgNC/////w+DIQogCyAANQIYIhggBH58IANCIIh8IgNC/////w+DIQsgDCAANQIcIhkgBH58IANCIIh8IgNC/////w+DIQwgDSAANQIgIhogBH58IANCIIh8IgNC/////w+DIQ0gDiAANQIkIhsgBH58IANCIIh8IgNC/////w+DIQ4gDyAANQIoIhwgBH58IANCIIh8IgNC/////w+DIQ8gECAANQIsIh0gBH58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCBCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AggiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIMIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCECIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AhQiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIYIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCHCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiAiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIkIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCKCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiwiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgAiAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DPgIAIAIgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4M+AgQgAiAIIARC/v+v9QF+fCADQiCIfCIDQv////8Pgz4CCCACIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DPgIMIAIgCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4M+AhAgAiALIARCv6WUnA9+fCADQiCIfCIDQv////8Pgz4CFCACIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DPgIYIAIgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4M+AhwgAiAOIARCts/u2AR+fCADQiCIfCIDQv////8Pgz4CICACIA8gBEKazf/LA358IANCIIh8IgNC/////w+DPgIkIAIgECAEQuqjhNABfnwgA0IgiHwiA0L/////D4M+AiggAiARIANCIIh8PgIsIAJByAUQBQRAIAJByAUgAhAHGgsLiEABG34gCiAANQIAIhEgEX58IgJC/////w+DIQogECAANQIEIhMgEX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIRAgA0IgiEIBhiACQiCIfCAPIAA1AggiFCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIAA1AgwiFSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIAA1AhAiFiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ0gA0IgiEIBhiACQiCIfCAMIAA1AhQiFyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AhgiGCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIAA1AhwiGSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAIIAA1AiAiGiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIAA1AiQiGyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AigiHCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIBEgADUCLCIRfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIBIgAkIgiHwhEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIBAgEyATfnwiAkL/////D4MhECAPIBMgFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIBMgFX4iA0L/////D4NCAYZ8fCICQv////8PgyEOIANCIIhCAYYgAkIgiHwgDSATIBZ+IgNC/////w+DQgGGfHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgEyAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBMgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSATIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggEyAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBMgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiATIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA8gFCAUfnwiAkL/////D4MhDyAOIBQgFX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIBQgFn4iA0L/////D4NCAYZ8fCICQv////8PgyENIANCIIhCAYYgAkIgiHwgDCAUIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhDCADQiCIQgGGIAJCIIh8IAsgFCAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBQgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAUIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFCAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBQgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgDiAVIBV+fCICQv////8PgyEOIA0gFSAWfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgFSAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBUgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAVIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFSAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBUgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAVIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAVfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA0gFiAWfnwiAkL/////D4MhDSAMIBYgF34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBYgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAWIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFiAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBYgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAWIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAWfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAwgFyAXfnwiAkL/////D4MhDCALIBcgGH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBcgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAXIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFyAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBcgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgCyAYIBh+fCICQv////8PgyELIAkgGCAZfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggGCAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBggG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAYIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAkgGSAZfnwiAkL/////D4MhCSAIIBkgGn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBkgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAZIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAZfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAggGiAafnwiAkL/////D4MhCCAHIBogG34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBogHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgByAbIBt+fCICQv////8PgyEHIAYgGyAcfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAYgHCAcfnwiAkL/////D4MhBiAEIBEgHH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAQgESARfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCESIAEgCiAKQv3/8/8PfkL/////D4MiA0Kr1f7/D358QiCIIBAgA0L///vPC358fCICQv////8Pgz4CACABIA8gA0L//8+KC358IAJCIIh8IgJC/////w+DPgIEIAEgDiADQv7/r/UBfnwgAkIgiHwiAkL/////D4M+AgggASANIANCpOzDtQ9+fCACQiCIfCICQv////8Pgz4CDCABIAwgA0KgpcO5Bn58IAJCIIh8IgJC/////w+DPgIQIAEgCyADQr+llJwPfnwgAkIgiHwiAkL/////D4M+AhQgASAJIANChJfdowZ+fCACQiCIfCICQv////8Pgz4CGCABIAggA0LX2a6aBH58IAJCIIh8IgJC/////w+DPgIcIAEgByADQrbP7tgEfnwgAkIgiHwiAkL/////D4M+AiAgASAGIANCms3/ywN+fCACQiCIfCICQv////8Pgz4CJCABIAQgA0Lqo4TQAX58IAJCIIh8IgJC/////w+DPgIoIAEgBSACQiCIfCICQv////8Pgz4CLCASIAJCIIh8pwRAIAFByAUgARAHGgUgAUHIBRAFBEAgAUHIBSABEAcaCwsLCgAgACAAIAEQEwsLACAAQfgFIAEQEwsVACAAQfgREABBqBIQAUH4ESABEBILEQAgAEHYEhAXQdgSQbgHEAULIwAgABACBEBBAA8LIABBiBMQF0GIE0G4BxAFBEBBfw8LQQELFwAgACABEBcgAUHIBSABEA0gASABEBYLCQBBqAYgABAAC7wBAQJ/IAIQAUEwIQMDQCABIANPBEAgA0EwRgRAQbgTEBsFQbgTQfgFQbgTEBMLIABBuBNB6BMQEyACQegTIAIQDyAAQTBqIQAgA0EwaiEDDAELCyABQTBwIgRFBEAPC0HoExABQQAhAQNAIAEgBEZFBEAgASAALQAAOgDoEyAAQQFqIQAgAUEBaiEBDAELCyADQTBGBEBBuBMQGwVBuBNB+AVBuBMQEwtB6BNBuBNB6BMQEyACQegTIAIQDwscACABIAJBmBQQHEGYFEGYFBAWIABBmBQgAxATC+EBAQJ/QQBBACgCACIFIAJBAWpBMGxqNgIAIAUQGyAFQTBqIQUDQCACIAZHBEAgABACBEAgBUEwayAFEAAFIAAgBUEwayAFEBMLIAAgAWohACAFQTBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBMGsiBSAFEBoDQCAGBEAgABACBEAgBSAFQTBrEAAgAhABBSAFQTBrQcgUEAAgBSAAIAVBMGsQEyAFQcgUIAIQEwsgACABayEAIAIgBGshAiAFQTBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEBYgAEEwaiEAIAJBMGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhAXIABBMGohACACQTBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADEBsPCyAAQfgUEAAgAxAbA0AgAkEBayICIAFqLQAAIQAgAyADEBQgAEGAAU8EQCADQfgUIAMQEyAAQYABayEACyADIAMQFCAAQcAATwRAIANB+BQgAxATIABBQGohAAsgAyADEBQgAEEgTwRAIANB+BQgAxATIABBIGshAAsgAyADEBQgAEEQTwRAIANB+BQgAxATIABBEGshAAsgAyADEBQgAEEITwRAIANB+BQgAxATIABBCGshAAsgAyADEBQgAEEETwRAIANB+BQgAxATIABBBGshAAsgAyADEBQgAEECTwRAIANB+BQgAxATIABBAmshAAsgAyADEBQgAARAIANB+BQgAxATCyACDQALC9UBAQF/IAAQAgRAIAEQAQ8LQQEhAkGYCEGoFRAAIABB6AdBMEHYFRAhIABByAhBMEGIFhAhA0BB2BVBqAYQBEUEQEHYFUG4FhAUQQEhAANAQbgWQagGEARFBEBBuBZBuBYQFCAAQQFqIQAMAQsLQagVQegWEAAgAiAAa0EBayECA0AgAgRAQegWQegWEBQgAkEBayECDAELCyAAIQJB6BZBqBUQFEHYFUGoFUHYFRATQYgWQegWQYgWEBMMAQsLQYgWEBgEQEGIFiABEBEFQYgWIAEQAAsLIAAgABACBEBBAQ8LIABBiAdBMEGYFxAhQZgXQagGEAQLKgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYCx4AIABCADcDACAAQgA3AwggAEIANwMQIABCADcDGAssACAAKQMYUAR+IAApAxBQBH4gACkDCFAEfiAAKQMABUIBCwVCAQsFQgELUAseACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxgLQAAgACkDGCABKQMYUQR/IAApAxAgASkDEFEEfyAAKQMIIAEpAwhRBH8gACkDACABKQMAUQVBAAsFQQALBUEACwtzACAAKQMYIAEpAxhUBH9BAAUgACkDGCABKQMYVgR/QQEFIAApAxAgASkDEFQEf0EABSAAKQMQIAEpAxBWBH9BAQUgACkDCCABKQMIVAR/QQAFIAApAwggASkDCFYEf0EBBSAAKQMAIAEpAwBaCwsLCwsLC8QBAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIANCIIinC/wBAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgA0Igh6cL5g4BEX4gBCAANQIAIgUgATUCACIGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgAgBEIgiCEDIAMgBSABNQIEIgd+IARC/////w+DfCIEQiCIfCEDIAMgADUCBCIIIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CBCADQiCIIQQgBCAFIAE1AggiCX4gA0L/////D4N8IgNCIIh8IQQgBCAHIAh+IANC/////w+DfCIDQiCIfCEEIAQgADUCCCIKIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CCCAEQiCIIQMgAyAFIAE1AgwiC34gBEL/////D4N8IgRCIIh8IQMgAyAIIAl+IARC/////w+DfCIEQiCIfCEDIAMgByAKfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgwiDCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgwgA0IgiCEEIAQgBSABNQIQIg1+IANC/////w+DfCIDQiCIfCEEIAQgCCALfiADQv////8Pg3wiA0IgiHwhBCAEIAkgCn4gA0L/////D4N8IgNCIIh8IQQgBCAHIAx+IANC/////w+DfCIDQiCIfCEEIAQgADUCECIOIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CECAEQiCIIQMgAyAFIAE1AhQiD34gBEL/////D4N8IgRCIIh8IQMgAyAIIA1+IARC/////w+DfCIEQiCIfCEDIAMgCiALfiAEQv////8Pg3wiBEIgiHwhAyADIAkgDH4gBEL/////D4N8IgRCIIh8IQMgAyAHIA5+IARC/////w+DfCIEQiCIfCEDIAMgADUCFCIQIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CFCADQiCIIQQgBCAFIAE1AhgiEX4gA0L/////D4N8IgNCIIh8IQQgBCAIIA9+IANC/////w+DfCIDQiCIfCEEIAQgCiANfiADQv////8Pg3wiA0IgiHwhBCAEIAsgDH4gA0L/////D4N8IgNCIIh8IQQgBCAJIA5+IANC/////w+DfCIDQiCIfCEEIAQgByAQfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhgiEiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhggBEIgiCEDIAMgBSABNQIcIhN+IARC/////w+DfCIEQiCIfCEDIAMgCCARfiAEQv////8Pg3wiBEIgiHwhAyADIAogD34gBEL/////D4N8IgRCIIh8IQMgAyAMIA1+IARC/////w+DfCIEQiCIfCEDIAMgCyAOfiAEQv////8Pg3wiBEIgiHwhAyADIAkgEH4gBEL/////D4N8IgRCIIh8IQMgAyAHIBJ+IARC/////w+DfCIEQiCIfCEDIAMgADUCHCIFIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CHCADQiCIIQQgBCAIIBN+IANC/////w+DfCIDQiCIfCEEIAQgCiARfiADQv////8Pg3wiA0IgiHwhBCAEIAwgD34gA0L/////D4N8IgNCIIh8IQQgBCANIA5+IANC/////w+DfCIDQiCIfCEEIAQgCyAQfiADQv////8Pg3wiA0IgiHwhBCAEIAkgEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAd+IANC/////w+DfCIDQiCIfCEEIAIgAz4CICAEQiCIIQMgAyAKIBN+IARC/////w+DfCIEQiCIfCEDIAMgDCARfiAEQv////8Pg3wiBEIgiHwhAyADIA4gD34gBEL/////D4N8IgRCIIh8IQMgAyANIBB+IARC/////w+DfCIEQiCIfCEDIAMgCyASfiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAwgE34gA0L/////D4N8IgNCIIh8IQQgBCAOIBF+IANC/////w+DfCIDQiCIfCEEIAQgDyAQfiADQv////8Pg3wiA0IgiHwhBCAEIA0gEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAt+IANC/////w+DfCIDQiCIfCEEIAIgAz4CKCAEQiCIIQMgAyAOIBN+IARC/////w+DfCIEQiCIfCEDIAMgECARfiAEQv////8Pg3wiBEIgiHwhAyADIA8gEn4gBEL/////D4N8IgRCIIh8IQMgAyAFIA1+IARC/////w+DfCIEQiCIfCEDIAIgBD4CLCADQiCIIQQgBCAQIBN+IANC/////w+DfCIDQiCIfCEEIAQgESASfiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIBIgE34gBEL/////D4N8IgRCIIh8IQMgAyAFIBF+IARC/////w+DfCIEQiCIfCEDIAIgBD4CNCADQiCIIQQgBCAFIBN+IANC/////w+DfCIDQiCIfCEEIAIgAz4COCACIAQ+AjwLzg0BDH4gAyAANQIAIgYgBn4gAkL/////D4N8IgJCIIh8IQMgASACPgIAIAMiBEIgiCEFIAA1AgQiByAGfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgQgAyIEQiCIIQUgADUCCCIIIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAcgB34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgggAyIEQiCIIQUgADUCDCIJIAZ+IgJCIIghAyADIAcgCH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgwgAyIEQiCIIQUgADUCECIKIAZ+IgJCIIghAyADIAcgCX4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAIIAh+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIQIAMiBEIgiCEFIAA1AhQiCyAGfiICQiCIIQMgAyAHIAp+IAJC/////w+DfCICQiCIfCEDIAMgCCAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CFCADIgRCIIghBSAANQIYIgwgBn4iAkIgiCEDIAMgByALfiACQv////8Pg3wiAkIgiHwhAyADIAggCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAJIAl+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIYIAMiBEIgiCEFIAA1AhwiDSAGfiICQiCIIQMgAyAHIAx+IAJC/////w+DfCICQiCIfCEDIAMgCCALfiACQv////8Pg3wiAkIgiHwhAyADIAkgCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhwgAyIEQiCIIQUgByANfiICQiCIIQMgAyAIIAx+IAJC/////w+DfCICQiCIfCEDIAMgCSALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAogCn4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiAgAyIEQiCIIQUgCCANfiICQiCIIQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAJIA1+IgJCIIghAyADIAogDH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyALIAt+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIoIAMiBEIgiCEFIAogDX4iAkIgiCEDIAMgCyAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CLCADIgRCIIghBSALIA1+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgDCANfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjQgAyIEQiCIIQVCACECQgAhAyADIA0gDX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjggASADPgI8CwoAIAAgACABECwLsgMCA34BfyAAIANBiBggAxsiAxAkIAFByBcQJCACQegXIAIbIgcQJUGoGBAlQR8hAEEfIQEDQCABQcgXai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBxRdqNQAAQgF8IgZCAVEEQEIAQgCAGgsDQAJAA0AgACADai0AACAAQQdGckUEQCAAQQFrIQAMAQsLIAAgA2pBB2spAAAgBoAhBCAAIAFrQQRrIQIDQCAEQoCAgIBwg1AgAkEATnFFBEAgBEIIiCEEIAJBAWohAgwBCwsgBFAEQCADQcgXEClFDQFCASEEQQAhAgtByBhByBc1AAAgBH4iBT4AAEHMGEHMFzUAACAEfiAFQiCIfCIFPgAAQdAYQdAXNQAAIAR+IAVCIIh8IgU+AABB1BhB1Bc1AAAgBH4gBUIgiHwiBT4AAEHYGEHYFzUAACAEfiAFQiCIfCIFPgAAQdwYQdwXNQAAIAR+IAVCIIh8IgU+AABB4BhB4Bc1AAAgBH4gBUIgiHwiBT4AAEHkGEHkFzUAACAEfiAFQiCIfD4AACADQcgYIAJrIAMQKxogAiAHaiAEEAsMAQsLC44CAQp/QegYIQNB6BgQJUGIGSEIIAFBiBkQJEGoGSEJQagZECdByBkhBiAAQcgZECRB6BkhC0GIGiEKQegaIQQDQCAGECZFBEAgCCAGIAsgChAvIAsgCUGoGhAsIAcEfyAFBH9BqBogAxApBH9BqBogAyAEECsaQQAFIANBqBogBBArGkEBCwVBqBogAyAEECoaQQELBSAFBH9BqBogAyAEECoaQQAFIANBqBoQKQR/IANBqBogBBArGkEABUGoGiADIAQQKxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACECsaBSADIAIQJAsLCQAgAEHIGxAoCywAIAAgASACECoEQCACQYgbIAIQKxoFIAJBiBsQKQRAIAJBiBsgAhArGgsLCxcAIAAgASACECsEQCACQYgbIAIQKhoLCwsAQegbIAAgARAzC7YPAQN+IAAgADUCAEL/////DyIEIAA1AgB+Qv////8PgyIDQYgbNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBjBs1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QZAbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGUGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBmBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGgGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBpBs1AgAgA358IgI+AhxBqB0gAkIgiD4CACAAIAA1AgQgADUCBCAEfkL/////D4MiA0GIGzUCAH58IgI+AgQgACAANQIIIAJCIIh8QYwbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGQGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBlBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZgbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGcGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBoBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaQbNQIAIAN+fCICPgIgQawdIAJCIIg+AgAgACAANQIIIAA1AgggBH5C/////w+DIgNBiBs1AgB+fCICPgIIIAAgADUCDCACQiCIfEGMGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBkBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZQbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGYGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBnBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGkGzUCACADfnwiAj4CJEGwHSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBjBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZAbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGUGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBmBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGgGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBpBs1AgAgA358IgI+AihBtB0gAkIgiD4CACAAIAA1AhAgADUCECAEfkL/////D4MiA0GIGzUCAH58IgI+AhAgACAANQIUIAJCIIh8QYwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGQGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBlBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZgbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGcGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBoBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaQbNQIAIAN+fCICPgIsQbgdIAJCIIg+AgAgACAANQIUIAA1AhQgBH5C/////w+DIgNBiBs1AgB+fCICPgIUIAAgADUCGCACQiCIfEGMGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBkBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZQbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGYGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBnBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaAbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGkGzUCACADfnwiAj4CMEG8HSACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxBjBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGUGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBmBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZwbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGgGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBpBs1AgAgA358IgI+AjRBwB0gAkIgiD4CACAAIAA1AhwgADUCHCAEfkL/////D4MiA0GIGzUCAH58IgI+AhwgACAANQIgIAJCIIh8QYwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGQGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBlBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZgbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGcGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBoBs1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QaQbNQIAIAN+fCICPgI4QcQdIAJCIIg+AgBBqB0gAEEgaiABEDILiBwBE34gBSABNQIAIgQgADUCACIOfnwiA0L/////D4MhBSAGIAA1AgQiDyAEfnwgA0IgiHwiA0L/////D4MhBiAHIAA1AggiECAEfnwgA0IgiHwiA0L/////D4MhByAIIAA1AgwiESAEfnwgA0IgiHwiA0L/////D4MhCCAJIAA1AhAiEiAEfnwgA0IgiHwiA0L/////D4MhCSAKIAA1AhQiEyAEfnwgA0IgiHwiA0L/////D4MhCiALIAA1AhgiFCAEfnwgA0IgiHwiA0L/////D4MhCyAMIAA1AhwiFSAEfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIEIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIIIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIMIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIQIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIUIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIYIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIcIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gAiAFIAVC/////w9+Qv////8PgyIEfEIgiCAGIARC/////w9+fHwiA0L/////D4M+AgAgAiAHIARC/rf5/w9+fCADQiCIfCIDQv////8Pgz4CBCACIAggBEKCyPadBX58IANCIIh8IgNC/////w+DPgIIIAIgCSAEQoWwh80AfnwgA0IgiHwiA0L/////D4M+AgwgAiAKIARCiLDnmQN+fCADQiCIfCIDQv////8Pgz4CECACIAsgBELI+vXMAn58IANCIIh8IgNC/////w+DPgIUIAIgDCAEQtPOtp8HfnwgA0IgiHwiA0L/////D4M+AhggAiANIANCIIh8PgIcIAJBiBsQKQRAIAJBiBsgAhArGgsLsB0BE34gCCAANQIAIg0gDX58IgJC/////w+DIQggDCAANQIEIg8gDX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AggiECANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIAA1AgwiESANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIAA1AhAiEiANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIAA1AhQiEyANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AhgiFCANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gADUCHCINfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIA4gAkIgiHwhDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAwgDyAPfnwiAkL/////D4MhDCALIA8gEH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIA8gEX4iA0L/////D4NCAYZ8fCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAPIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgDyATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIA8gFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIA9+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgCyAQIBB+fCICQv////8PgyELIAogECARfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgECASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBAgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAQIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAQfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAogESARfnwiAkL/////D4MhCiAJIBEgEn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBEgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAkgEiASfnwiAkL/////D4MhCSAHIBIgE34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBIgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgByATIBN+fCICQv////8PgyEHIAYgEyAUfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAYgFCAUfnwiAkL/////D4MhBiAEIA0gFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAQgDSANfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCEOIAEgCCAIQv////8PfkL/////D4MiA3xCIIggDCADQv////8Pfnx8IgJC/////w+DPgIAIAEgCyADQv63+f8PfnwgAkIgiHwiAkL/////D4M+AgQgASAKIANCgsj2nQV+fCACQiCIfCICQv////8Pgz4CCCABIAkgA0KFsIfNAH58IAJCIIh8IgJC/////w+DPgIMIAEgByADQoiw55kDfnwgAkIgiHwiAkL/////D4M+AhAgASAGIANCyPr1zAJ+fCACQiCIfCICQv////8Pgz4CFCABIAQgA0LTzrafB358IAJCIIh8IgJC/////w+DPgIYIAEgBSACQiCIfCICQv////8Pgz4CHCAOIAJCIIh8pwRAIAFBiBsgARArGgUgAUGIGxApBEAgAUGIGyABECsaCwsLCgAgACAAIAEQNgsLACAAQagbIAEQNgsVACAAQaghECRByCEQJUGoISABEDULEQAgAEHoIRA6QeghQagcECkLIwAgABAmBEBBAA8LIABBiCIQOkGIIkGoHBApBEBBfw8LQQELFwAgACABEDogAUGIGyABEDAgASABEDkLCQBByBsgABAkC7wBAQJ/IAIQJUEgIQMDQCABIANPBEAgA0EgRgRAQagiED4FQagiQagbQagiEDYLIABBqCJByCIQNiACQcgiIAIQMiAAQSBqIQAgA0EgaiEDDAELCyABQR9xIgRFBEAPC0HIIhAlQQAhAQNAIAEgBEZFBEAgASAALQAAOgDIIiAAQQFqIQAgAUEBaiEBDAELCyADQSBGBEBBqCIQPgVBqCJBqBtBqCIQNgtByCJBqCJByCIQNiACQcgiIAIQMgscACABIAJB6CIQP0HoIkHoIhA5IABB6CIgAxA2C+EBAQJ/QQBBACgCACIFIAJBAWpBBXRqNgIAIAUQPiAFQSBqIQUDQCACIAZHBEAgABAmBEAgBUEgayAFECQFIAAgBUEgayAFEDYLIAAgAWohACAFQSBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBIGsiBSAFED0DQCAGBEAgABAmBEAgBSAFQSBrECQgAhAlBSAFQSBrQYgjECQgBSAAIAVBIGsQNiAFQYgjIAIQNgsgACABayEAIAIgBGshAiAFQSBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEDkgAEEgaiEAIAJBIGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhA6IABBIGohACACQSBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADED4PCyAAQagjECQgAxA+A0AgAkEBayICIAFqLQAAIQAgAyADEDcgAEGAAU8EQCADQagjIAMQNiAAQYABayEACyADIAMQNyAAQcAATwRAIANBqCMgAxA2IABBQGohAAsgAyADEDcgAEEgTwRAIANBqCMgAxA2IABBIGshAAsgAyADEDcgAEEQTwRAIANBqCMgAxA2IABBEGshAAsgAyADEDcgAEEITwRAIANBqCMgAxA2IABBCGshAAsgAyADEDcgAEEETwRAIANBqCMgAxA2IABBBGshAAsgAyADEDcgAEECTwRAIANBqCMgAxA2IABBAmshAAsgAyADEDcgAARAIANBqCMgAxA2CyACDQALC9UBAQF/IAAQJgRAIAEQJQ8LQSAhAkHoHEHIIxAkIABByBxBIEHoIxBEIABBiB1BIEGIJBBEA0BB6CNByBsQKEUEQEHoI0GoJBA3QQEhAANAQagkQcgbEChFBEBBqCRBqCQQNyAAQQFqIQAMAQsLQcgjQcgkECQgAiAAa0EBayECA0AgAgRAQcgkQcgkEDcgAkEBayECDAELCyAAIQJByCRByCMQN0HoI0HII0HoIxA2QYgkQcgkQYgkEDYMAQsLQYgkEDsEQEGIJCABEDQFQYgkIAEQJAsLIAAgABAmBEBBAQ8LIABBiBxBIEHoJBBEQegkQcgbECgLFQAgACABQYglEDZBiCVBqBsgAhA2CwoAIAAgACABEEcLCwAgAEGIGyABEDALCQAgAEGoHBApCw4AIAAQAiAAQTBqEAJxCwoAIABB4ABqEAILDQAgABABIABBMGoQAQsVACAAEAEgAEEwahAbIABB4ABqEAELegAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1gLugEAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIAQsoACAAEEsEQCABEE4FIAFB4ABqEBsgAEEwaiABQTBqEAAgACABEAALCxUAIAAgARAEIABBMGogAUEwahAEcQtyAQF/IAAQTARAIAEQSw8LIAEQSwRAQQAPCyAAQeAAaiICEA4EQCAAIAEQUg8LIAJB2CUQFCABQdglQYgmEBMgAkHYJUG4JhATIAFBMGpBuCZB6CYQEyAAQYgmEAQEQCAAQTBqQegmEAQE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AEEwaiABQTBqEBELIgAgACABEAAgAEEwaiABQTBqEBEgAEHgAGogAUHgAGoQAAsSACABQeg+EFogAEHoPiACEFcLEgAgAUH4PxBaIABB+D8gAhBYCxQAIAFBiMEAEFsgAEGIwQAgAhBZCxQAIAAgARAXIABBMGogAUEwahAXCyIAIAAgARAXIABBMGogAUEwahAXIABB4ABqIAFB4ABqEBcLFAAgACABEBYgAEEwaiABQTBqEBYLIgAgACABEBYgAEEwaiABQTBqEBYgAEHgAGogAUHgAGoQFgtTACAAEEwEQCABEAEgAUEwahABBSAAQeAAakGYwgAQGkGYwgBByMIAEBRBmMIAQcjCAEH4wgAQEyAAQcjCACABEBMgAEEwakH4wgAgAUEwahATCws4ACAAQTBqQajDABAUIABB2MMAEBQgAEHYwwBB2MMAEBNB2MMAQaglQdjDABAPQajDAEHYwwAQBAsQACAAQYjEABBjQYjEABBkC5gBAQN/QQBBACgCACIEIAFBMGxqNgIAIABB4ABqQZABIAEgBEEwEB4gBCEDA0AgASAFRwRAIAMQAgRAIAIQASACQTBqEAEFIAMgAEEwakHoxAAQEyADIAMQFCADIAAgAhATIANB6MQAIAJBMGoQEwsgAEGQAWohACACQeAAaiECIANBMGohAyAFQQFqIQUMAQsLQQAgBDYCAAtUACAAEEwEQCABEE4FIABB4ABqQZjFABAaQZjFAEHIxQAQFEGYxQBByMUAQfjFABATIABByMUAIAEQEyAAQTBqQfjFACABQTBqEBMgAUHgAGoQGwsLMgAgASACakEBayEBA0AgASACSEUEQCABIAAtAAA6AAAgAUEBayEBIABBAWohAAwBCwsLLQAgABBLBEAgARBNDwsgAEGoxgAQX0GoxgBBMCABEGhB2MYAQTAgAUEwahBoC0MAIAAQSwRAIAEQASABQcAAOgAADwsgAEGIxwAQF0GIxwBBMCABEGggAEEwahAZQX9GBEAgASABLQAAQYABcjoAAAsLMgAgAC0AAEHAAHEEQCABEE0PCyAAQTBBuMcAEGggAEEwakEwQejHABBoQbjHACABEGELwQEBAn8gAC0AACICQcAAcQRAIAEQTQ8LIAJBgAFxIQMgAEHIyAAQAEHIyAAgAkE/cToAAEHIyABBMEGYyAAQaEGYyAAg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A2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIASABIAApA5ABNwOQASABIAApA5gBNwOYASABIAApA6ABNwOgASABIAApA6gBNwOoASABIAApA7ABNwOwASABIAApA7gBNwO4AQuSAwAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1ggASAAKQNgNwNgIAEgACkDaDcDaCABIAApA3A3A3AgASAAKQN4NwN4IAEgACkDgAE3A4ABIAEgACkDiAE3A4gBIAEgACkDkAE3A5ABIAEgACkDmAE3A5gBIAEgACkDoAE3A6ABIAEgACkDqAE3A6gBIAEgACkDsAE3A7ABIAEgACkDuAE3A7gBIAEgACkDwAE3A8ABIAEgACkDyAE3A8gBIAEgACkD0AE3A9ABIAEgACkD2AE3A9gBIAEgACkD4AE3A+ABIAEgACkD6AE3A+gBIAEgACkD8AE3A/ABIAEgACkD+AE3A/gBIAEgACkDgAI3A4ACIAEgACkDiAI3A4gCIAEgACkDkAI3A5ACIAEgACkDmAI3A5gCCy8AIAAQmwEEQCABEJ4BBSABQcABahCLASAAQeAAaiABQeAAahCMASAAIAEQjAELCxcAIAAgARBSIABB4ABqIAFB4ABqEFJxC4YBAQF/IAAQnAEEQCABEJsBDwsgARCbAQRAQQAPCyAAQcABaiICEIoBBEAgACABEKIBDwsgAkHYhwEQjwEgAUHYhwFBuIgBEI0BIAJB2IcBQZiJARCNASABQeAAakGYiQFB+IkBEI0BIABBuIgBEFIEQCAAQeAAakH4iQEQUgRAQQEPCwtBAAvQAQECfyAAEJwBBEAgARCcAQ8LIAEQnAEEQEEADwsgAEHAAWoiAhCKAQRAIAEgABCjAQ8LIAFBwAFqIgMQigEEQCAAIAEQowEPCyACQdiKARCPASADQbiLARCPASAAQbiLAUGYjAEQjQEgAUHYigFB+IwBEI0BIAJB2IoBQdiNARCNASADQbiLAUG4jgEQjQEgAEHgAGpBuI4BQZiPARCNASABQeAA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AEHgAGoQTSAAQcABahBNCycAIAAgARCMASAAQeAAaiABQeAAahCMASAAQcABaiABQcABahCMAQvlAgAgACABQYjcAhCNASAAQeAAaiABQeAAakHo3AIQjQEgAEHAAWogAUHAAWpByN0CEI0BIAAgAEHgAGpBqN4CEJABIAEgAUHgAGpBiN8CEJABIAAgAEHAAWpB6N8CEJABIAEgAUHAAWpByOACEJABIABB4ABqIABBwAFqQajhAhCQASABQeAAaiABQcABakGI4gIQkAFBiNwCQejcAkHo4gIQkAFBiNwCQcjdAkHI4wIQkAFB6NwCQcjdAkGo5AIQkAFBqOECQYjiAiACEI0BIAJBqOQCIAIQkQEgAiACEOQBQYjcAiACIAIQkAFBqN4CQYjfAiACQeAAahCNASACQeAAakHo4gIgAkHgAGoQkQFByN0CQYjlAhDkASACQeAAakGI5QIgAkHgAGoQkAFB6N8CQcjgAiACQcABahCNASACQcABakHI4wIgAkHAAWoQkQEgAkHAAWpB6NwCIAJBwAFqEJABC4ECACAAQejlAhCPASAAIABB4ABqQcjmAhCNAUHI5gJByOYCQajnAhCQASAAIABB4ABqQYjoAhCRAUGI6AIgAEHAAWpBiOgCEJABQYjoAkGI6AIQjwEgAEHgAGogAEHAAWpB6OgCEI0BQejoAkHo6AJByOkCEJABIABBwAFqQajqAhCPAUHI6QIgARDkAUHo5QIgASABEJABQajqAiABQeAAahDkAUGo5wIgAUHgAGogAUHgAGoQkAFB6OUCQajqAiABQcABahCQAUHI6QIgAUHAAWogAUHAAWoQkQFBiOgCIAFBwAFqIAFBwAFqEJABQajnAiABQcABaiABQcABahCQAQs1ACAAIAEgAhCQASAAQeAAaiABQeAAaiACQeAAahCQASAAQcABaiABQcABaiACQcABahCQAQs1ACAAIAEgAhCRASAAQeAAaiABQeAAaiACQeAAahCRASAAQcABaiABQcABaiACQcABahCRAQsnACAAIAEQkgEgAEHgAGogAUHgAGoQkgEgAEHAAWogAUHAAWoQkgELKwEBfyAAQcABahCVASIBBEAgAQ8LIABB4ABqEJUBIgEEQCABDwsgABCVAQsmACAAIAEQUiAAQeAAaiABQeAAahBScSAAQcABaiABQcABahBScQurAgAgAEGI6wIQjwEgAEHgAGpB6OsCEI8BIABBwAFqQcjsAhCPASAAIABB4ABqQajtAhCNASAAIABBwAFqQYjuAhCNASAAQeAAaiAAQcABakHo7gIQjQFB6O4CQcjvAhDkAUGI6wJByO8CQcjvAhCRAUHI7AJBqPACEOQBQajwAkGo7QJBqPACEJEBQejrAkGI7gJBiPECEJEBIABBwAFqQajwAkHo8QIQjQEgAEHgAGpBiPECQcjyAhCNAUHo8QJByPICQejxAhCQAUHo8QJB6PECEOQBIABByO8CQcjyAhCNAUHI8gJB6PECQejxAhCQAUHo8QJB6PECEJMBQejxAkHI7wIgARCNAUHo8QJBqPACIAFB4ABqEI0BQejxAkGI8QIgAUHAAWoQjQELMwAgACABIAIgAxCUASAAQeAAaiABIAIgA0HgAGoQlAEgAEHAAWogASACIANBwAFqEJQBCysAIABBwAFqEEsEQCAAIABB4ABqIABB4ABqEEsbEJYBDwsgAEHAAWoQlgEL+AEBAn9BAEEAKAIAIgUgAkEBakGgAmxqNgIAIAUQ6AEgBUGgAmohBQNAIAIgBkcEQCAAEOUBBEAgBUGgAmsgBRDpAQUgACAFQaACayAFEOoBCyAAIAFqIQAgBUGgAmohBSAGQQFqIQYMAQsLIAAgAWshACADIAJBAWsgBGxqIQIgBUGgAmsiBSAFEPEBA0AgBgRAIAAQ5QEEQCAFIAVBoAJrEOkBIAIQ5wEFIAVBoAJrQajzAhDpASAFIAAgBUGgAmsQ6gEgBUGo8wIgAhDqAQsgACABayEAIAIgBGshAiAFQaACayEFIAZBAWshBgwBCwtBACAFNgIAC7MCACACRQRAIAMQ6AEPCyAAQcj1AhDpASADEOgBA0AgAkEBayICIAFqLQAAIQAgAyADEOsBIABBgAFPBEAgA0HI9QIgAxDqASAAQYABayEACyADIAMQ6wEgAEHAAE8EQCADQcj1AiADEOoBIABBQGohAAsgAyADEOsBIABBIE8EQCADQcj1AiADEOoBIABBIGshAAsgAyADEOsBIABBEE8EQCADQcj1AiADEOoBIABBEGshAAsgAyADEOsBIABBCE8EQCADQcj1AiADEOoBIABBCGshAAsgAyADEOsBIABBBE8EQCADQcj1AiADEOoBIABBBGshAAsgAyADEOsBIABBAk8EQCADQcj1AiADEOoBIABBAmshAAsgAyADEOsBIAAEQCADQcj1AiADEOoBCyACDQALCzIAIABB6PcCEIwBIABBwAFqIAEQ5AEgAEHgAGogAUHAAWoQjAFB6PcCIAFB4ABqEIwBCxEAIAAQ5QEgAEGgAmoQ5QFxCxEAIAAQ5gEgAEGgAmoQ5QFxCxAAIAAQ5wEgAEGgAmoQ5wELEAAgABDoASAAQaACahDnAQsYACAAIAEQ6QEgAEGgAmogAUGgAmoQ6QELhQEAIAAgAUHI+AIQ6gEgAEGgAmogAUGgAmpB6PoCEOoBIAAgAEGgAmpBiP0CEOwBIAEgAUGgAmpBqP8CEOwBQYj9AkGo/wJBiP0CEOoBQej6AiACEPYBQcj4AiACIAIQ7AFByPgCQej6AiACQaACahDsAUGI/QIgAkGgAmogAkGgAmoQ7QELHAAgACABIAIQ6gEgAEGgAmogASACQaACahDqAQt9ACAAIABBoAJqQciBAxDqASAAIABBoAJqQeiDAxDsASAAQaACakGIhgMQ9gEgAEGIhgNBiIYDEOwBQciBA0GoiAMQ9gFBqIgDQciBA0GoiAMQ7AFB6IMDQYiGAyABEOoBIAFBqIgDIAEQ7QFByIEDQciBAyABQaACahDsAQsgACAAIAEgAhDsASAAQaACaiABQaACaiACQaACahDsAQsgACAAIAEgAhDtASAAQaACaiABQaACaiACQaACahDtAQsYACAAIAEQ7gEgAEGgAmogAUGgAmoQ7gELGAAgACABEOkBIABBoAJqIAFBoAJqEO4BCxgAIAAgARCyASAAQaACaiABQaACahCyAQsYACAAIAEQsAEgAEGgAmogAUGgAmoQsAELGQAgACABEPABIABBoAJqIAFBoAJqEPABcQtqACAAQciKAxDrASAAQaACakHojAMQ6wFB6IwDQYiPAxD2AUHIigNBiI8DQYiPAxDtAUGIjwNBqJEDEPEBIABBqJEDIAEQ6gEgAEGgAmpBqJEDIAFBoAJqEOoBIAFBoAJqIAFBoAJqEO4BCyAAIAAgASACIAMQ8gEgAEGgAmogASACIANBoAJqEPIBCxoBAX8gAEGgAmoQ7wEiAQRAIAEPCyAAEO8BCx0AIABBoAJqEOUBBEAgABDzAQ8LIABBoAJqEPMBC/gBAQJ/QQBBACgCACIFIAJBAWpBwARsajYCACAFEPoBIAVBwARqIQUDQCACIAZHBEAgABD3AQRAIAVBwARrIAUQ+wEFIAAgBUHABGsgBRD8AQsgACABaiEAIAVBwARqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBwARrIgUgBRCGAgNAIAYEQCAAEPcBBEAgBSAFQcAEaxD7ASACEPkBBSAFQcAEa0HIkwMQ+wEgBSAAIAVBwARrEPwBIAVByJMDIAIQ/AELIAAgAWshACACIARrIQIgBUHABGshBSAGQQFrIQYMAQsLQQAgBTYCAAuzAgAgAkUEQCADEPoBDwsgAEGImAMQ+wEgAxD6AQNAIAJBAWsiAiABai0AACEAIAMgAxD+ASAAQYABTwRAIANBiJgDIAMQ/AEgAEGAAWshAAsgAyADEP4BIABBwABPBEAgA0GImAMgAxD8ASAAQUBqIQALIAMgAxD+ASAAQSBPBEAgA0GImAMgAxD8ASAAQSBrIQALIAMgAxD+ASAAQRBPBEAgA0GImAMgAxD8ASAAQRBrIQALIAMgAxD+ASAAQQhPBEAgA0GImAMgAxD8ASAAQQhrIQALIAMgAxD+ASAAQQRPBEAgA0GImAMgAxD8ASAAQQRrIQALIAMgAxD+ASAAQQJPBEAgA0GImAMgAxD8ASAAQQJrIQALIAMgAxD+ASAABEAgA0GImAMgAxD8AQsgAg0ACwvRAQBByK4DEPoBQciuA0HIrgMQgQIgAEHInANBoAJBiKEDEIsCQYihA0HIpQMQ/gEgAEHIpQNByKUDEPwBQcilA0GIqgMQggJBiKoDQcilA0GIqgMQ/AFBiKoDQciuAxCFAgRAAAtBiKEDIABBiLMDEPwBQcilA0HIrgMQhQIEQEHIrgMQ5wFB6LADEOgBQciuA0GIswMgARD8AQVByLcDEPoBQci3A0HIpQNByLcDEP8BQci3A0HongNBoAJByLcDEIsCQci3A0GIswMgARD8AQsLaQBB6MsDEPoBQejLA0HoywMQgQIgAEGIvANBoAJBqL4DEIsCQai+A0HowgMQ/gEgAEHowgNB6MIDEPwBQejCA0GoxwMQggJBqMcDQejCA0GoxwMQ/AFBqMcDQejLAxCFAgRAQQAPC0EBC3gAIAAgAEHgAGpB6NADEJABIABB4ABqIABBwAFqQcjRAxCQASAAQeAAaiABIAJBwAFqEI0BQcjRAyABIAIQjQEgAiACQcABaiACEJEBIAIgAhDkAUHo0AMgASACQeAAahCNASACQeAAaiACQcABaiACQeAAahCRAQvsAQAgACABQajSAxCNASAAQeAAaiACQYjTAxCNASAAIABB4ABqQejTAxCQASAAIABBwAFqQcjUAxCQASAAQeAAaiAAQcABaiADEJABIAMgAiADEI0BIANBiNMDIAMQkQEgAyADEOQBIANBqNIDIAMQkAEgASACIANB4ABqEJABIANB4ABqQejTAyADQeAAahCNASADQeAAakGo0gMgA0HgAGoQkQEgA0HgAGpBiNMDIANB4ABqEJEBQcjUAyABIANBwAFqEI0BIANBwAFqQajSAyADQcABahCRASADQcABakGI0wMgA0HAAWoQkAELkAEAIAAgASACQajVAxCPAiAAQaACaiADQcjXAxCOAiACIANB6NkDEJABIABBoAJqIAAgBEGgAmoQ7AEgBEGgAmogAUHo2QMgBEGgAmoQjwIgBEGgAmpBqNUDIARBoAJqEO0BIARBoAJqQcjXAyAEQaACahDtAUHI1wMgBBDpASAEIAQQ9gEgBEGo1QMgBBDsAQtQACABIABBMGpByNoDEBMgAUEwaiAAQTBqQfjaAxATIAFB4ABqIABBqNsDEBMgAUGQAWogAEHY2wMQEyACIAFBwAFqQajbA0HI2gMgAhCQAgtsACAAQYj+BCABEI0BIABB4ABqQej+BCABQeAAahCNASAAQcABakHI/wQgAUHAAWoQjQEgAEGgAmpBqIAFIAFBoAJqEI0BIABBgANqQYiBBSABQYADahCNASAAQeADakHogQUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByIIFIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaiDBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiIQFIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHohAUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQciFBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqIYFIAFB4ANqEI0BC2wAIABBiIcFIAEQjQEgAEHgAGpB6IcFIAFB4ABqEI0BIABBwAFqQciIBSABQcABahCNASAAQaACakGoiQUgAUGgAmoQjQEgAEGAA2pBiIoFIAFBgANqEI0BIABB4ANqQeiKBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIiwUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqIwFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIjQUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeiNBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByI4FIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGojwUgAUHgA2oQjQELbAAgAEGIkAUgARCNASAAQeAAakHokAUgAUHgAGoQjQEgAEHAAWpByJEFIAFBwAFqEI0BIABBoAJqQaiSBSABQaACahCNASAAQYADakGIkwUgAUGAA2oQjQEgAEHgA2pB6JMFIAFB4ANqEI0BC4oCACAAIAEQACAAQTBqIAFBMGoQESABQciUBSABEI0BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQESABQeAAakGolQUgAUHgAGoQjQEgAEHAAWogAUHAAWoQACAAQfABaiABQfABahARIAFBwAFqQYiWBSABQcABahCNASAAQaACaiABQaACahAAIABB0AJqIAFB0AJqEBEgAUGgAmpB6JYFIAFBoAJqEI0BIABBgANqIAFBgANqEAAgAEGwA2ogAUGwA2oQESABQYADakHIlwUgAUGAA2oQjQEgAEHgA2ogAUHgA2oQACAAQZAEaiABQZAEahARIAFB4ANqQaiYBSABQeADahCNAQtsACAAQYiZBSABEI0BIABB4ABqQeiZBSABQeAAahCNASAAQcABakHImgUgAUHAAWoQjQEgAEGgAmpBqJsFIAFBoAJqEI0BIABBgANqQYicBSABQYADahCNASAAQeADakHonAUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByJ0FIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaieBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiJ8FIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHonwUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQcigBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqKEFIAFB4ANqEI0BC2wAIABBiKIFIAEQjQEgAEHgAGpB6KIFIAFB4ABqEI0BIABBwAFqQcijBSABQcABahCNASAAQaACakGopAUgAUGgAmoQjQEgAEGAA2pBiKUFIAFBgANqEI0BIABB4ANqQeilBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIpgUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqKcFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIqAUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeioBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByKkFIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGoqgUgAUHgA2oQjQELgwEAIAAQSwRAQQEPCyAAEGRFBEBBAA8LIABBiKsFQfirBRATIABBMGpBqKwFEAAgAEG4qwVBiK0FEBMgAEEwakG4rQUQAEH4qwVB+KsFEFVB+KsFIABB+KsFEF1B+KsFQYitBUH4qwUQXUH4qwVB6KsFQRBB+KsFEHhB+KsFQYitBRBTCxEAIABB6K0FEGNB6K0FEJwCC7MCACAAEJsBBEBBAQ8LIAAQtAFFBEBBAA8LIABByK4FQfCwBRCNASAAQeAAakHIrgVB0LEFEI0BQfCwBUGorwVBsLIFEI4BQdCxBUGQswUQkgFB8LAFQfCzBRCSAUHQsQVB2K8FQdC0BRCNAUGwsgVB4LIF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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHongMLoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYi8AwugAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBqNADC0AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAB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"; +const pq = 712; +const pr = 3464; +const pG1gen = 42968; +const pG1zero = 43112; +const pG1b = 4776; +const pG2gen = 43256; +const pG2zero = 43544; +const pG2b = 17272; +const pOneT = 43832; +const prePSize = 288; +const preQSize = 20448; +const q = "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787"; +const r = "52435875175126190479447740508185965837690552500527637822603658699938581184513"; + +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bls12381 = null; async function buildBls12381(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bls12381)) return globalThis.curve_bls12381; - - const moduleBuilder = new ModuleBuilder(); - moduleBuilder.setMemory(25); - buildBls12381$1(moduleBuilder); - - if (plugins) plugins(moduleBuilder); + if ((!singleThread) && (curve_bls12381)) return curve_bls12381; const bls12381wasm = {}; - bls12381wasm.code = moduleBuilder.build(); - bls12381wasm.pq = moduleBuilder.modules.f1m.pq; - bls12381wasm.pr = moduleBuilder.modules.frm.pq; - bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; - bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; - bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; - bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; - bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; - bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; - bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; - bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; - bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; - bls12381wasm.n8q = 48; - bls12381wasm.n8r = 32; - bls12381wasm.q = moduleBuilder.modules.bls12381.q; - bls12381wasm.r = moduleBuilder.modules.bls12381.r; - + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: static import (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Also avoids recompiling the wasm on every load. + // Regenerate the vendored module with `npm run gen-wasm`. + bls12381wasm.code = base64ToUint8Array(code); + bls12381wasm.pq = pq; + bls12381wasm.pr = pr; + bls12381wasm.pG1gen = pG1gen; + bls12381wasm.pG1zero = pG1zero; + bls12381wasm.pG1b = pG1b; + bls12381wasm.pG2gen = pG2gen; + bls12381wasm.pG2zero = pG2zero; + bls12381wasm.pG2b = pG2b; + bls12381wasm.pOneT = pOneT; + bls12381wasm.prePSize = prePSize; + bls12381wasm.preQSize = preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = q; + bls12381wasm.r = r; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import('wasmbuilder'); + const { buildBls12381: buildBls12381wasm } = await import('wasmcurves'); + + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBls12381wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bls12381wasm.code = moduleBuilder.build(); + bls12381wasm.pq = moduleBuilder.modules.f1m.pq; + bls12381wasm.pr = moduleBuilder.modules.frm.pq; + bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; + bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; + bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; + bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; + bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; + bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; + bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; + bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; + bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = moduleBuilder.modules.bls12381.q; + bls12381wasm.r = moduleBuilder.modules.bls12381.r; + } + + + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bls12381wasm.batchCode = base64ToUint8Array(code$1); + // The batch module's GLV path carries bls12-381 G1 constants too (G2 GLS + // is bn254-only; the wasm falls through internally for bls G2 sizes). + bls12381wasm.glv = true; const params = { name: "bls12381", @@ -18128,13 +6393,13 @@ async function buildBls12381(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bls12381 = null; + curve_bls12381 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bls12381 = curve; + curve_bls12381 = curve; } return curve; diff --git a/build/main.cjs b/build/main.cjs index 5bb247b..754b833 100644 --- a/build/main.cjs +++ b/build/main.cjs @@ -1,12 +1,9 @@ 'use strict'; var crypto = require('crypto'); -var wasmcurves = require('wasmcurves'); var os = require('os'); var Worker = require('web-worker'); -var wasmbuilder = require('wasmbuilder'); -/* global BigInt */ const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; function fromString(s, radix) { @@ -351,7 +348,7 @@ class PolField { this.roots = []; -/* for (let i=0; i<16; i++) { + /* for (let i=0; i<16; i++) { let r = this.F.one; n = 1 << i; const rootsi = new Array(n); @@ -1271,17 +1268,19 @@ class ChaCha { function getRandomBytes(n) { let array = new Uint8Array(n); - if (process.browser) { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } - } - } - else { // NodeJS + // Feature-detect rather than rely on `process.browser` (undefined under + // Vite/esbuild/SES -> ReferenceError). Prefer Node crypto (no per-call size + // limit); fall back to Web Crypto chunked to its 65536-byte cap. + if (crypto && crypto.randomFillSync) { // Node crypto.randomFillSync(array); + } else if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.getRandomValues) { + for (let i = 0; i < n; i += 65536) { + globalThis.crypto.getRandomValues(array.subarray(i, Math.min(i + 65536, n))); + } + } else { // insecure last resort + for (let i=0; i>>0; + } } return array; } @@ -1452,8 +1451,6 @@ function __fft(PF, pall, bits, offset, step) { return out; } -/* global BigInt */ - class ZqField { constructor(p) { this.type="F1"; @@ -2768,8 +2765,6 @@ class EC { } -/* global BigInt */ - function stringifyBigInts(o) { if (typeof o == "bigint" || o.eq !== undefined) { return o.toString(10); @@ -3034,7 +3029,10 @@ var _utils = /*#__PURE__*/Object.freeze({ unstringifyFElements: unstringifyFElements }); -const PAGE_SIZE = 1<<30; +// 1 GiB page size: a deliberately conservative, fragmentation-friendly page -- not +// the engine's max single-buffer length (~8 GiB+), which would defeat paging and +// risk OOM on the multi-GiB G1/G2 buffers large circuits produce. +const PAGE_SIZE = 1 << 30; class BigBuffer { @@ -3151,7 +3149,7 @@ function buildBatchConvert(tm, fnName, sIn, sOut) { {cmd: "GET", out: 0, var: 1, len:sOut * n}, ]; opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [buffChunk.buffer]) ); } @@ -3451,7 +3449,7 @@ class WasmField1 { {cmd: "GET", out: 0, var: 1, len:sOut * n}, ]; opPromises.push( - this.tm.queueAction(task) + this.tm.queueAction(task, [buffChunk.buffer]) ); } @@ -4246,12 +4244,13 @@ class WasmCurve { } -/* global WebAssembly */ - function thread(self) { const MAXMEM = 32767; let instance; let memory; + let batchFns = null; // batch-affine MSM entry points (per-group wrappers) + let terminationTimeout = 1500; // milliseconds + let terminationTimer; if (self) { self.onmessage = function(e) { @@ -4262,22 +4261,51 @@ function thread(self) { data = e; } - if (data[0].cmd == "INIT") { - init(data[0]).then(function() { - self.postMessage(data.result); - }); - } else if (data[0].cmd == "TERMINATE") { - self.close(); - } else { - const res = runTask(data); - self.postMessage(res); + try { + if (data[0].cmd === "INIT") { + init(data[0]).then(function() { + self.postMessage({status: "initialized"}); + // Start idle timer only after init completes so it never + // fires during async WASM compilation. + scheduleTermination(); + }); + return; // skip the scheduleTermination() call at the bottom + } else if (data[0].cmd === "TERMINATE") { + terminate(); + } else { + let terminateAfterTask = false; + if (data[data.length-1].cmd === "TERMINATE") { + terminateAfterTask = true; + data.pop(); + } + const res = runTask(data); + let transfers = []; + for (let i=0; i (await WebAssembly.instantiate(batchModule, { + env: { "memory": memory }, + curve: { + f_mul: ex[f + "_mul"], f_square: ex[f + "_square"], f_add: ex[f + "_add"], + f_sub: ex[f + "_sub"], f_neg: ex[f + "_neg"], f_inverse: ex[f + "_inverse"], + f_isZero: ex[f + "_isZero"], f_conj: ex[conj], + g_add: ex[g + "_add"], g_addMixed: ex[g + "_addMixed"], + g_double: ex[g + "_double"], g_zero: ex[g + "_zero"], g_isZero: ex[g + "_isZero"], + }, + })).exports; + const n8f = data.n8f; + batchFns = {}; + if (ex.f1m_mul && ex.g1m_addMixed) { + // f_conj is only used by the G2 GLS path; wire a harmless copy for G1 + const b = await mkBatch("f1m", "g1m", "f1m_copy"); + // GLV path (bn254 G1 endomorphism) when the curve advertises it; + // the wasm falls back internally for unexpected sizes. + const useGlv = data.glv && b.multiexpAffineGLV; + const fn = useGlv ? b.multiexpAffineGLV : b.multiexpAffine; + batchFns["g1m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn(pB, pS, sS, n, pr, n8f); + // NoGlv variant, selectable per call ({glv: "disabled"} option) + batchFns["g1m_multiexpAffineBatchNoGlv"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f); + } + if (ex.f2m_mul && ex.g2m_addMixed) { + const b = await mkBatch("f2m", "g2m", "f2m_conjugate"); + // GLS (bn254 G2 endomorphism) when the curve advertises it; the + // wasm gates internally on chunk size and falls back to batch. + // The NoGls variant is selectable per call ({gls:false} option). + const useGls = data.glv && b.multiexpAffineGLS; + const fn2 = useGls ? b.multiexpAffineGLS : b.multiexpAffine; + batchFns["g2m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn2(pB, pS, sS, n, pr, n8f * 2); + batchFns["g2m_multiexpAffineBatchNoGls"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f * 2); + } + } + + if (data.terminationTimeout) { + terminationTimeout = data.terminationTimeout; + } } + // Reverse the low `bits` of a 32-bit integer (O(1) bit-twiddle). + function rev32(x) { + x = ((x & 0x55555555) << 1) | ((x >>> 1) & 0x55555555); + x = ((x & 0x33333333) << 2) | ((x >>> 2) & 0x33333333); + x = ((x & 0x0f0f0f0f) << 4) | ((x >>> 4) & 0x0f0f0f0f); + x = ((x & 0x00ff00ff) << 8) | ((x >>> 8) & 0x00ff00ff); + x = (x << 16) | (x >>> 16); + return x >>> 0; + } + + // In-place bit-reversal permutation of fixed-size (sIn-byte) elements. + // Works for any element size, like the old pure-JS buffReverseBits. When + // the elements are 4-byte aligned it swaps Uint32Array lanes (no BigInt + // boxing, no allocation); otherwise it falls back to a byte-wise swap with + // a single reused temp buffer. Either way it touches no WASM linear memory. + function reverseInPlace(u8, sIn, bits) { + const n = u8.byteLength / sIn; + const shift = 32 - bits; + if (((sIn & 3) === 0) && ((u8.byteOffset & 3) === 0)) { + const lanes = sIn >>> 2; + const u32 = new Uint32Array(u8.buffer, u8.byteOffset, u8.byteLength >>> 2); + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + let a = i * lanes; + let b = ri * lanes; + for (let l = 0; l < lanes; l++) { + const t = u32[a + l]; + u32[a + l] = u32[b + l]; + u32[b + l] = t; + } + } + } + } else { + const tmp = new Uint8Array(sIn); // one reused temp, not one per swap + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + const ao = i * sIn; + const bo = ri * sIn; + tmp.set(u8.subarray(ao, ao + sIn)); + u8.copyWithin(ao, bo, bo + sIn); + u8.set(tmp, bo); + } + } + } + } + function alloc(length) { const u32 = new Uint32Array(memory.buffer, 0, 1); while (u32[0] & 3) u32[0]++; // Return always aligned pointers @@ -4310,8 +4437,7 @@ function thread(self) { } function getBuffer(pointer, length) { - const u8 = new Uint8Array(memory.buffer); - return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); + return new Uint8Array(memory.buffer, pointer, length); } function setBuffer(pointer, buffer) { @@ -4320,7 +4446,8 @@ function thread(self) { } function runTask(task) { - if (task[0].cmd == "INIT") { + clearTimeout(terminationTimer); + if (task[0].cmd === "INIT") { return init(task[0]); } const ctx = { @@ -4331,6 +4458,15 @@ function thread(self) { const oldAlloc = u32a[0]; for (let i=0; i plain + // in-module variant when the batch module is unavailable + // (same 5-arg signature) + if (!fn) { + const base = fname.replace(/Batch(NoGls|NoGlv)?$/, ""); + fn = instance.exports[base]; + } + } + fn(...params); + } break; } case "GET": @@ -4362,9 +4512,29 @@ function thread(self) { } const u32b = new Uint32Array(memory.buffer, 0, 1); u32b[0] = oldAlloc; + return ctx.out; } + function scheduleTermination() { + clearTimeout(terminationTimer); + if (terminationTimeout > 0) { + terminationTimer = setTimeout(() => { + // 2-phase termination: notify main thread first; close only after + // it acks with TERMINATE. This prevents the race where the main + // thread dispatches a task to a worker that has already closed. + if (self) self.postMessage({status: "want_to_terminate"}); + }, terminationTimeout); + } + } + + function terminate() { + clearTimeout(terminationTimer); + if (self) { + self.postMessage({status: "terminated"}); + self.close(); + } + } return runTask; } @@ -4391,6 +4561,10 @@ function thread(self) { // const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) +// Robust Node detection that never throws (unlike `process.browser`, which is a +// webpack-ism and is undefined under Vite/esbuild/SES). +const isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; + class Deferred { constructor() { this.promise = new Promise((resolve, reject)=> { @@ -4400,23 +4574,40 @@ class Deferred { } } -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); +// WorkerSlot holds the native Worker and all per-worker state. +// Each call to startWorker() creates a fresh WorkerSlot instance. +// Message handlers close over the slot reference so that stale messages +// from a replaced worker are detected by a simple identity check +// (tm.pool[i] !== slot). +class WorkerSlot { + constructor(worker) { + this.worker = worker; // native Worker thread + this.initialized = false; + this.initializing= false; + this.working = false; + this.pendingDeferred = null; + this.onMsg = null; // stored so removeEventListener can be called on termination + this.onError = null; + } } +// Computed lazily on first worker creation, NOT at module load: a SES +// hardened realm (which runs single-threaded) has no Blob/btoa/URL.createObjectURL, and +// touching them at import time would throw before a curve could even be built. let workerSource; - -const threadStr = `(${thread.toString()})(self)`; -if(process.browser) { - if(globalThis?.Blob) { - const threadBytes= new TextEncoder().encode(threadStr); - const workerBlob = new Blob([threadBytes], { type: "application/javascript" }) ; +function getWorkerSource() { + if (workerSource !== undefined) return workerSource; + const threadStr = `(${thread.toString()})(self)`; + if (isNode) { + workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); + } else if (globalThis?.Blob && globalThis.URL && globalThis.URL.createObjectURL) { + const threadBytes = new TextEncoder().encode(threadStr); + const workerBlob = new Blob([threadBytes], { type: "application/javascript" }); workerSource = URL.createObjectURL(workerBlob); } else { workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); } -} else { - workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); + return workerSource; } @@ -4435,11 +4626,16 @@ async function buildThreadManager(wasm, singleThread) { "memory": tm.memory } }); - - if(process.browser && !globalThis?.Worker) { + + // Force single-thread when no Worker is available. Covers SES hardened realms + // (no Worker, frozen globals) and old/limited browsers, regardless of what + // the caller requested -- the worker path (and getWorkerSource's + // Blob/btoa) would otherwise fail. Node uses the web-worker import, so it + // keeps multi-threading. + if(!isNode && !globalThis?.Worker) { singleThread = true; } - + tm.singleThread = singleThread; tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. tm.pq = wasm.pq; @@ -4450,120 +4646,227 @@ async function buildThreadManager(wasm, singleThread) { tm.pG2zero = wasm.pG2zero; tm.pOneT = wasm.pOneT; - // tm.pTmp0 = tm.alloc(curve.G2.F.n8*3); - // tm.pTmp1 = tm.alloc(curve.G2.F.n8*3); + tm.code = wasm.code; + tm.wasmModule = wasmModule; + // Batch-affine MSM helper module (optional): compiled once, shipped to every + // worker alongside the main module. n8f = base-field element size in bytes. + tm.batchCode = wasm.batchCode; + tm.batchWasmModule = wasm.batchCode ? await WebAssembly.compile(wasm.batchCode) : undefined; + tm.n8f = wasm.n8q; + tm.glv = !!wasm.glv; if (singleThread) { - tm.code = wasm.code; tm.taskManager = thread(); await tm.taskManager([{ cmd: "INIT", init: MEM_SIZE, - code: tm.code.slice() + code: tm.code.slice(), + batchCode: tm.batchCode ? tm.batchCode.slice() : undefined, + n8f: tm.n8f, + glv: tm.glv }]); tm.concurrency = 1; } else { - tm.workers = []; - tm.pendingDeferreds = []; - tm.working = []; + // pool[i] is the active WorkerSlot at slot i, or null if the slot is empty. + tm.pool = []; let concurrency = 2; - if (process.browser) { - if (typeof navigator === "object" && navigator.hardwareConcurrency) { - concurrency = navigator.hardwareConcurrency; - } - } else { + if (typeof navigator === "object" && navigator.hardwareConcurrency) { + concurrency = navigator.hardwareConcurrency; + } else if (os && os.cpus) { concurrency = os.cpus().length; } - if(concurrency == 0){ + if(concurrency === 0){ concurrency = 2; } // Limit to 64 threads for memory reasons. if (concurrency>64) concurrency=64; tm.concurrency = concurrency; + } + return tm; +} - for (let i = 0; i { + slot.initialized = true; + }); } startSyncOp() { - if (this.oldPFree != 0) throw new Error("Sync operation in progress"); + if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); this.oldPFree = this.u32[0]; } endSyncOp() { - if (this.oldPFree == 0) throw new Error("No sync operation in progress"); + if (this.oldPFree === 0) throw new Error("No sync operation in progress"); this.u32[0] = this.oldPFree; this.oldPFree = 0; } - postAction(workerId, e, transfers, _deferred) { - if (this.working[workerId]) { - throw new Error("Posting a job t a working worker"); + async postAction(slotIndex, e, transfers, _deferred) { + const slot = this.pool[slotIndex]; + if (!slot || slot.working) { + throw new Error("Posting a job to a working worker"); } - this.working[workerId] = true; - - this.pendingDeferreds[workerId] = _deferred ? _deferred : new Deferred(); - this.workers[workerId].postMessage(e, transfers); - - return this.pendingDeferreds[workerId].promise; + slot.working = true; + slot.pendingDeferred = _deferred ? _deferred : new Deferred(); + await slot.worker.postMessage(e, transfers); + return slot.pendingDeferred.promise; } - processWorks() { - for (let i=0; (i 0); i++) { - if (this.working[i] == false) { + async processWorks() { + // Dispatch queued tasks to ready workers. + for (let i = 0; i < this.concurrency && this.actionQueue.length > 0; i++) { + const slot = this.pool[i]; + if (slot && slot.initialized && !slot.working) { const work = this.actionQueue.shift(); - this.postAction(i, work.data, work.transfers, work.deferred); + await this.postAction(i, work.data, work.transfers, work.deferred); + } + } + + // Start new workers for slots that need them. + if (this.actionQueue.length > 0) { + let initializingCount = 0; + for (let i = 0; i < this.concurrency; i++) { + const slot = this.pool[i]; + if (slot) { + if (slot.initializing) initializingCount++; + // slot exists: skip whether initialized, initializing, or working + continue; + } + // slot is null: this slot is available to host a new worker + if (initializingCount >= this.actionQueue.length) break; + initializingCount++; + this.startWorker(i); } } } - queueAction(actionData, transfers) { + async queueAction(actionData, transfers) { const d = new Deferred(); if (this.singleThread) { @@ -4571,11 +4874,11 @@ class ThreadManager { d.resolve(res); } else { this.actionQueue.push({ - data: actionData, + data: actionData, transfers: transfers, - deferred: d + deferred: d }); - this.processWorks(); + await this.processWorks(); } return d.promise; } @@ -4591,7 +4894,7 @@ class ThreadManager { } getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); + return this.u8.slice(pointer, pointer + length); } setBuff(pointer, buffer) { @@ -4606,10 +4909,11 @@ class ThreadManager { } async terminate() { - for (let i=0; i=0; i--) { - if (!G.isZero(res)) { - for (let j=0; j MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + return chunkSize; } - async function _multiExp(buffBases, buffScalars, inType, logger, logText) { - const MAX_CHUNK_SIZE = 1 << 22; - const MIN_CHUNK_SIZE = 1 << 10; - let sGIn; - - if (groupName == "G1") { - if (inType == "affine") { - sGIn = G.F.n8*2; - } else { - sGIn = G.F.n8*3; - } - } else if (groupName == "G2") { - if (inType == "affine") { - sGIn = G.F.n8*2; - } else { - sGIn = G.F.n8*3; - } - } else { - throw new Error("Invalid group"); - } - + // Run the multiexp of one chunk on a worker; returns the partial point. + async function _multiExpChunk(buffBases, buffScalars, inType, batchMode, endoMode, logText) { + if (!(buffBases instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + if (!(buffScalars instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + const sGIn = pointSize(inType); const nPoints = Math.floor(buffBases.byteLength / sGIn); - if (nPoints == 0) return G.zero; + if (nPoints === 0) return G.zero; const sScalar = Math.floor(buffScalars.byteLength / nPoints); - if( sScalar * nPoints != buffScalars.byteLength) { - throw new Error("Scalar size does not match"); - } - - const bitChunkSize = pTSizes[log2(nPoints)]; - const nChunks = Math.floor((sScalar*8 - 1) / bitChunkSize) +1; - - let chunkSize; - chunkSize = Math.floor(nPoints / (tm.concurrency /nChunks)); - if (chunkSize>MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize { - if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error(`${logText} Scalar size does not match`); + + const task = [ + {cmd: "ALLOCSET", var: 0, buff: buffBases}, + {cmd: "ALLOCSET", var: 1, buff: buffScalars}, + {cmd: "ALLOC", var: 2, len: G.F.n8*3}, + {cmd: "CALL", fnName: fnNameFor(inType, buffBases.byteLength, batchMode, endoMode), params: [ + {var: 0}, {var: 1}, {val: sScalar}, {val: nPoints}, {var: 2} + ]}, + {cmd: "GET", out: 0, var: 2, len: G.F.n8*3}, + ]; + // transfer the chunk buffers to the worker (zero-copy); one GET -> one point + const out = await tm.queueAction(task, [buffBases.buffer, buffScalars.buffer]); + return out[0]; + } + + // Shared driver. `getChunk(byteOffset, byteLength)` supplies each bases chunk -- + // a synchronous slice of an in-memory buffer, or an async sub-range read. At most + // `maxInFlight` chunks are sourced at once (Infinity = dispatch them all). The + // point set is partitioned across chunks, so the full multiexp is the sum of the + // per-chunk multiexps. + async function _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, maxInFlight, batchMode, endoMode, logger, logText) { + if (nPoints === 0) return G.zero; + const chunkSize = chunkSizeFor(nPoints, sScalar); + const inFlight = new Set(); + const partials = []; + + for (let off = 0; off < nPoints; off += chunkSize) { + const n = Math.min(nPoints - off, chunkSize); + const at = off; + // Backpressure: block until a slot frees (Promise.race also surfaces a + // failed chunk promptly). With maxInFlight = Infinity this never blocks. + while (inFlight.size >= maxInFlight) await Promise.race(inFlight); + if (logger) logger.debug(`Multiexp start: ${logText}: ${at}/${nPoints}`); + const op = (async () => { + const basesChunk = await getChunk(at*sGIn, n*sGIn); + const scalarsChunk = buffScalars.slice(at*sScalar, (at+n)*sScalar); + const r = await _multiExpChunk(basesChunk, scalarsChunk, inType, batchMode, endoMode, logText); + if (logger) logger.debug(`Multiexp end: ${logText}: ${at}/${nPoints}`); return r; - })); + })(); + // settle-either-way cleanup so a rejected chunk can't wedge the set + const slot = op.finally(() => inFlight.delete(slot)); + inFlight.add(slot); + partials.push(slot); } - const result = await Promise.all(opPromises); - + const result = await Promise.all(partials); let res = G.zero; - for (let i=result.length-1; i>=0; i--) { - res = G.add(res, result[i]); + for (let i = result.length-1; i >= 0; i--) res = G.add(res, result[i]); + return res; + } + + // Derive nPoints/sScalar and validate before dispatching. + function geometry(totalBasesBytes, buffScalars, inType) { + const sGIn = pointSize(inType); + const nPoints = Math.floor(totalBasesBytes / sGIn); + let sScalar = 0; + if (nPoints > 0) { + sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); } + return { sGIn, nPoints, sScalar }; + } - return res; + // multiexp over an in-memory bases buffer (sliced per chunk, all dispatched at once). + async function _multiExp(buffBases, buffScalars, inType, batchMode, endoMode, logger, logText) { + const { sGIn, nPoints, sScalar } = geometry(buffBases.byteLength, buffScalars, inType); + const getChunk = (off, len) => buffBases.slice(off, off + len); + return _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, Infinity, batchMode, endoMode, logger, logText); } - G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "jacobian", logger, logText); + G.multiExp = async function multiExp(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "jacobian", "disabled", "auto", logger, logText); + }; + // options.batch: "auto" (default) | "enabled" | "disabled" -- see batchModeOf. + // options.glv / options.gls: "auto" (default) | "disabled" -- see endoOf. + G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText, options) { + return _multiExp(buffBases, buffScalars, "affine", batchModeOf(options), endoOf(options), logger, logText); }; - G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "affine", logger, logText); + + // Streaming affine multiexp: bases are produced chunk-by-chunk by `basesReader` + // (e.g. a direct sub-range file read) instead of being read whole and sliced -- + // no main-thread slice copy, and the full section never sits in RAM (reads are + // bounded to a few in-flight chunks). Result is identical to multiExpAffine. + G.multiExpAffineChunked = async function multiExpAffineChunked(basesReader, totalBasesBytes, buffScalars, logger, logText, options) { + if (typeof basesReader !== "function") { + throw new Error(`${logText || "multiExpAffineChunked"}: basesReader must be a function (byteOffset, byteLength) => Promise`); + } + const { sGIn, nPoints, sScalar } = geometry(totalBasesBytes, buffScalars, "affine"); + return _multiExpDispatch(basesReader, buffScalars, nPoints, sGIn, sScalar, "affine", tm.concurrency + 2, batchModeOf(options), endoOf(options), logger, logText); }; } @@ -5021,7 +5355,28 @@ function buildFFT(curve, groupName) { const G = curve[groupName]; const Fr = curve.Fr; const tm = G.tm; - async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { + + // In-place bit-reversal permutation in a worker. The buffer is transferred + // in, reversed where it lies via plain typed-array lane swaps (no WASM + // linear memory grown, nothing allocated), and transferred back. Both + // transfers are pointer moves, so this is zero-copy. The swap is + // memory-bandwidth bound, so a single worker is as fast as splitting across + // many — which is why no SharedArrayBuffer is needed (only concurrent + // multi-worker access to one buffer would require that). + async function _reversePermutation(buff, sIn, bits) { + const res = await tm.queueAction( + [{cmd: "REVERSE", src: buff, sIn, bits}], + [buff.buffer] // transfer in; reversed in place and transferred back + ); + return res[0]; + } + + // `consume`: when true the caller cedes ownership of `buff` -- we skip the + // defensive full-copy below and reverse/transfer the caller's buffer in place + // (its backing ArrayBuffer is detached as a result). Only pass it when the + // input is discarded right after the call (e.g. the groth16 IFFT->applyKey->FFT + // pipeline). Default false preserves the input. + async function _fft(buff, inverse, inType, outType, logger, loggerTxt, consume) { inType = inType || "affine"; outType = outType || "affine"; @@ -5084,7 +5439,11 @@ function buildFFT(curve, groupName) { if (Array.isArray(buff)) { buff = array2buffer(buff, sIn); returnArray = true; - } else { + } else if (!consume || !ArrayBuffer.isView(buff)) { + // Defensive copy: the bit-reversal runs in place and chunks are + // transferred, so without consume we must not touch the caller's buffer. + // It also flattens a BigBuffer (no single .buffer to transfer) to a + // Uint8Array, so consume can only be honoured for an ArrayBuffer view. buff = buff.slice(0, buff.byteLength); } @@ -5118,7 +5477,14 @@ function buildFFT(curve, groupName) { let buffOut; - buffReverseBits(buff, sIn); + // Bit-reversal permutation. Like the old pure-JS buffReverseBits, this is + // just a permutation of fixed-size (sIn-byte) elements and works for any + // element size, so it covers Fr, G1 and G2 alike. Reversed in place in a + // worker via typed-array swaps — no WASM linear memory grown, nothing + // allocated. (The previous WASM __reversePermutation swapped n8g-sized + // elements rather than sIn-sized ones, which was wrong whenever + // sIn != n8g, e.g. affine-input G1/G2 FFTs.) + buff = await _reversePermutation(buff, sIn, bits); let chunks; let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); @@ -5132,8 +5498,8 @@ function buildFFT(curve, groupName) { const l2Chunk = log2(pointsInChunk); const promises = []; + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`); for (let i = 0; i< nChunks; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${i}/${nChunks}`); const task = []; task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); @@ -5161,17 +5527,15 @@ function buildFFT(curve, groupName) { } else { task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); } - promises.push(tm.queueAction(task).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${i}/${nChunks}`); - return r; - })); + promises.push(tm.queueAction(task, [buffChunk.buffer])); } chunks = await Promise.all(promises); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`); for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; for (let i = l2Chunk+1; i<=bits; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); const nGroups = 1 << (bits - i); const nChunksPerGroup = nChunks / nGroups; const opPromises = []; @@ -5218,10 +5582,7 @@ function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sMid}); task.push({cmd: "GET", out: 1, var: 1, len: pointsInChunk*sMid}); } - opPromises.push(tm.queueAction(task).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join ${i}/${bits} ${j+1}/${nGroups} ${k}/${nChunksPerGroup/2}`); - return r; - })); + opPromises.push(tm.queueAction(task, [chunks[o1].buffer, chunks[o2].buffer, first.buffer ])); } } @@ -5417,7 +5778,7 @@ function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: n*sOut}); task.push({cmd: "GET", out: 1, var: 1, len: n*sOut}); opPromises.push( - tm.queueAction(task).then( (r) => { + tm.queueAction(task, [b1.buffer, b2.buffer, firstChunk.buffer]).then((r) => { if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); return r; }) @@ -5447,12 +5808,12 @@ function buildFFT(curve, groupName) { } - G.fft = async function(buff, inType, outType, logger, loggerTxt) { - return await _fft(buff, false, inType, outType, logger, loggerTxt); + G.fft = async function(buff, inType, outType, logger, loggerTxt, consume) { + return await _fft(buff, false, inType, outType, logger, loggerTxt, consume); }; - G.ifft = async function(buff, inType, outType, logger, loggerTxt) { - return await _fft(buff, true, inType, outType, logger, loggerTxt); + G.ifft = async function(buff, inType, outType, logger, loggerTxt, consume) { + return await _fft(buff, true, inType, outType, logger, loggerTxt, consume); }; G.lagrangeEvaluations = async function (buff, inType, outType, logger, loggerTxt) { @@ -5565,7 +5926,7 @@ function buildFFT(curve, groupName) { } task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b.buffer]) ); } @@ -5600,7 +5961,7 @@ function buildFFT(curve, groupName) { ]}); task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); task.push({cmd: "GET", out: 1, var: 1, len: pointsPerChunk*sG}); - opPromises.push(tm.queueAction(task)); + opPromises.push(tm.queueAction(task, [chunks[o1].buffer, chunks[o2].buffer, first.buffer])); } } @@ -5679,7 +6040,7 @@ function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); task.push({cmd: "GET", out: 1, var: 1, len: pointsPerChunk*sG}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b1.buffer, b2.buffer, firstChunk.buffer]) ); } @@ -5755,7 +6116,7 @@ function buildFFT(curve, groupName) { ]}); task.push({cmd: "GET", out: 0, var: 0, len: n*sGout}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b.buffer]) ); } @@ -5837,35 +6198,145 @@ async function buildEngine(params) { return curve; } -globalThis.curve_bn128 = null; +// AUTO-GENERATED from wasmcurves/build/bn128_wasm.js — do not edit. +// Regenerate with: npm run gen-wasm +// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are +// pointer offsets / field moduli. +const code$2 = "AGFzbQEAAAABigEQYAJ/fwBgA39/fwBgAX8Bf2AEf39/fwBgBX9/f39/AGABfwBgAn9/AX9gBn9/f39/fwBgCH9/f39/f39/AGADf39/AX9gBH9/f38Bf2AKf39/f39/f39/fwBgBX9/f39/AX9gB39/f39/f38Bf2AJf39/f39/f39/AX9gC39/f39/f39/f39/AX8CDwEDZW52Bm1lbW9yeQIAGQOdApsCAAUCBQYGCQkBAAADAQIBAQAAAQAAAAACAgAFAQMEAQEDAAICAQEAAAEAAAAAAgIABQEDBAEBAwACAQAAAgICBQUAAAAGBgYAAAEBAQAAAQEBAAAAAAACAgEAAQAAAAABAQEBAQoHCAQIBAMDAAMCAAAEBwcBAQcAAwsEAwIFAAEBAAEBAAADAgIEAwACAgIFBQAAAAYGBgAAAQEBAAABAQEAAAAAAAICAQAAAAAAAQEBAQEIBAgEAwMBAAMAAAQHBwEBBwEAAwAABAcHAQEHAQEEBAQEBAACAgUFAAEAAQEAAgYAAwIEAwACAgUFAAEBAAEBAAAAAAYAAwICBAMAAgAAAAADAwEAAAAAAAAAAAAAAAAAAAkMDQ4PAQexJasCCGludF9jb3B5AAAIaW50X3plcm8AAQdpbnRfb25lAAMKaW50X2lzWmVybwACBmludF9lcQAEB2ludF9ndGUABQdpbnRfYWRkAAYHaW50X3N1YgAHB2ludF9tdWwACAppbnRfc3F1YXJlAAkNaW50X3NxdWFyZU9sZAAKB2ludF9kaXYACw5pbnRfaW52ZXJzZU1vZAAMCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAOB2YxbV9zdWIADwdmMW1fbmVnABAOZjFtX2lzTmVnYXRpdmUAFwlmMW1faXNPbmUADQhmMW1fc2lnbgAYC2YxbV9tUmVkdWN0ABEHZjFtX211bAASCmYxbV9zcXVhcmUAEw1mMW1fc3F1YXJlT2xkABQSZjFtX2Zyb21Nb250Z29tZXJ5ABYQZjFtX3RvTW9udGdvbWVyeQAVC2YxbV9pbnZlcnNlABkHZjFtX29uZQAaCGYxbV9sb2FkABsPZjFtX3RpbWVzU2NhbGFyABwHZjFtX2V4cAAgEGYxbV9iYXRjaEludmVyc2UAHQhmMW1fc3FydAAhDGYxbV9pc1NxdWFyZQAiFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAeF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5AB8IZnJtX2NvcHkAAAhmcm1femVybwABCmZybV9pc1plcm8AAgZmcm1fZXEABAdmcm1fYWRkACQHZnJtX3N1YgAlB2ZybV9uZWcAJg5mcm1faXNOZWdhdGl2ZQAtCWZybV9pc09uZQAjCGZybV9zaWduAC4LZnJtX21SZWR1Y3QAJwdmcm1fbXVsACgKZnJtX3NxdWFyZQApDWZybV9zcXVhcmVPbGQAKhJmcm1fZnJvbU1vbnRnb21lcnkALBBmcm1fdG9Nb250Z29tZXJ5ACsLZnJtX2ludmVyc2UALwdmcm1fb25lADAIZnJtX2xvYWQAMQ9mcm1fdGltZXNTY2FsYXIAMgdmcm1fZXhwADYQZnJtX2JhdGNoSW52ZXJzZQAzCGZybV9zcXJ0ADcMZnJtX2lzU3F1YXJlADgVZnJtX2JhdGNoVG9Nb250Z29tZXJ5ADQXZnJtX2JhdGNoRnJvbU1vbnRnb21lcnkANQZmcl9hZGQAJAZmcl9zdWIAJQZmcl9uZWcAJgZmcl9tdWwAOQlmcl9zcXVhcmUAOgpmcl9pbnZlcnNlADsNZnJfaXNOZWdhdGl2ZQA8B2ZyX2NvcHkAAAdmcl96ZXJvAAEGZnJfb25lADAJZnJfaXNaZXJvAAIFZnJfZXEABAxnMW1fbXVsdGlleHAAZxJnMW1fbXVsdGlleHBfY2h1bmsAZhJnMW1fbXVsdGlleHBBZmZpbmUAaRhnMW1fbXVsdGlleHBBZmZpbmVfY2h1bmsAaApnMW1faXNaZXJvAD4QZzFtX2lzWmVyb0FmZmluZQA9BmcxbV9lcQBGC2cxbV9lcU1peGVkAEUMZzFtX2VxQWZmaW5lAEQIZzFtX2NvcHkAQg5nMW1fY29weUFmZmluZQBBCGcxbV96ZXJvAEAOZzFtX3plcm9BZmZpbmUAPwpnMW1fZG91YmxlAEgQZzFtX2RvdWJsZUFmZmluZQBHB2cxbV9hZGQASwxnMW1fYWRkTWl4ZWQASg1nMW1fYWRkQWZmaW5lAEkHZzFtX25lZwBNDWcxbV9uZWdBZmZpbmUATAdnMW1fc3ViAFAMZzFtX3N1Yk1peGVkAE8NZzFtX3N1YkFmZmluZQBOEmcxbV9mcm9tTW9udGdvbWVyeQBSGGcxbV9mcm9tTW9udGdvbWVyeUFmZmluZQBREGcxbV90b01vbnRnb21lcnkAVBZnMW1fdG9Nb250Z29tZXJ5QWZmaW5lAFMPZzFtX3RpbWVzU2NhbGFyAGoVZzFtX3RpbWVzU2NhbGFyQWZmaW5lAGsNZzFtX25vcm1hbGl6ZQBZCmcxbV9MRU10b1UAWwpnMW1fTEVNdG9DAFwKZzFtX1V0b0xFTQBdCmcxbV9DdG9MRU0AXg9nMW1fYmF0Y2hMRU10b1UAXw9nMW1fYmF0Y2hMRU10b0MAYA9nMW1fYmF0Y2hVdG9MRU0AYQ9nMW1fYmF0Y2hDdG9MRU0AYgxnMW1fdG9BZmZpbmUAVQ5nMW1fdG9KYWNvYmlhbgBDEWcxbV9iYXRjaFRvQWZmaW5lAFgTZzFtX2JhdGNoVG9KYWNvYmlhbgBjC2cxbV9pbkN1cnZlAFcRZzFtX2luQ3VydmVBZmZpbmUAVhdmcm1fX3JldmVyc2VQZXJtdXRhdGlvbgBsB2ZybV9mZnQAbwhmcm1faWZmdABwCmZybV9yYXdmZnQAbQtmcm1fZmZ0Sm9pbgBxDmZybV9mZnRKb2luRXh0AHIRZnJtX2ZmdEpvaW5FeHRJbnYAcwpmcm1fZmZ0TWl4AHQMZnJtX2ZmdEZpbmFsAHUdZnJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24Adghwb2xfemVybwB3D3BvbF9jb25zdHJ1Y3RMQwB4DHFhcF9idWlsZEFCQwB5C3FhcF9qb2luQUJDAHoMcWFwX2JhdGNoQWRkAHsKZjJtX2lzWmVybwA9CWYybV9pc09uZQB8CGYybV96ZXJvAD8HZjJtX29uZQB9CGYybV9jb3B5AH4HZjJtX211bAB/CGYybV9tdWwxAIABCmYybV9zcXVhcmUAgQEHZjJtX2FkZACCAQdmMm1fc3ViAIMBB2YybV9uZWcAhAEIZjJtX3NpZ24AhwENZjJtX2Nvbmp1Z2F0ZQBMEmYybV9mcm9tTW9udGdvbWVyeQBREGYybV90b01vbnRnb21lcnkAUwZmMm1fZXEARAtmMm1faW52ZXJzZQCFAQdmMm1fZXhwAIoBD2YybV90aW1lc1NjYWxhcgCGARBmMm1fYmF0Y2hJbnZlcnNlAIkBCGYybV9zcXJ0AIsBDGYybV9pc1NxdWFyZQCMAQ5mMm1faXNOZWdhdGl2ZQCIAQxnMm1fbXVsdGlleHAAtAESZzJtX211bHRpZXhwX2NodW5rALMBEmcybV9tdWx0aWV4cEFmZmluZQC2ARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsAtQEKZzJtX2lzWmVybwCOARBnMm1faXNaZXJvQWZmaW5lAI0BBmcybV9lcQCWAQtnMm1fZXFNaXhlZACVAQxnMm1fZXFBZmZpbmUAlAEIZzJtX2NvcHkAkgEOZzJtX2NvcHlBZmZpbmUAkQEIZzJtX3plcm8AkAEOZzJtX3plcm9BZmZpbmUAjwEKZzJtX2RvdWJsZQCYARBnMm1fZG91YmxlQWZmaW5lAJcBB2cybV9hZGQAmwEMZzJtX2FkZE1peGVkAJoBDWcybV9hZGRBZmZpbmUAmQEHZzJtX25lZwCdAQ1nMm1fbmVnQWZmaW5lAJwBB2cybV9zdWIAoAEMZzJtX3N1Yk1peGVkAJ8BDWcybV9zdWJBZmZpbmUAngESZzJtX2Zyb21Nb250Z29tZXJ5AKIBGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQChARBnMm1fdG9Nb250Z29tZXJ5AKQBFmcybV90b01vbnRnb21lcnlBZmZpbmUAowEPZzJtX3RpbWVzU2NhbGFyALcBFWcybV90aW1lc1NjYWxhckFmZmluZQC4AQ1nMm1fbm9ybWFsaXplAKkBCmcybV9MRU10b1UAqgEKZzJtX0xFTXRvQwCrAQpnMm1fVXRvTEVNAKwBCmcybV9DdG9MRU0ArQEPZzJtX2JhdGNoTEVNdG9VAK4BD2cybV9iYXRjaExFTXRvQwCvAQ9nMm1fYmF0Y2hVdG9MRU0AsAEPZzJtX2JhdGNoQ3RvTEVNALEBDGcybV90b0FmZmluZQClAQ5nMm1fdG9KYWNvYmlhbgCTARFnMm1fYmF0Y2hUb0FmZmluZQCoARNnMm1fYmF0Y2hUb0phY29iaWFuALIBC2cybV9pbkN1cnZlAKcBEWcybV9pbkN1cnZlQWZmaW5lAKYBC2cxbV90aW1lc0ZyALkBF2cxbV9fcmV2ZXJzZVBlcm11dGF0aW9uALoBB2cxbV9mZnQAvAEIZzFtX2lmZnQAvQEKZzFtX3Jhd2ZmdAC7AQtnMW1fZmZ0Sm9pbgC+AQ5nMW1fZmZ0Sm9pbkV4dAC/ARFnMW1fZmZ0Sm9pbkV4dEludgDAAQpnMW1fZmZ0TWl4AMEBDGcxbV9mZnRGaW5hbADCAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDDAQtnMm1fdGltZXNGcgDEARdnMm1fX3JldmVyc2VQZXJtdXRhdGlvbgDFAQdnMm1fZmZ0AMcBCGcybV9pZmZ0AMgBCmcybV9yYXdmZnQAxgELZzJtX2ZmdEpvaW4AyQEOZzJtX2ZmdEpvaW5FeHQAygERZzJtX2ZmdEpvaW5FeHRJbnYAywEKZzJtX2ZmdE1peADMAQxnMm1fZmZ0RmluYWwAzQEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24AzgERZzFtX3RpbWVzRnJBZmZpbmUAzwERZzJtX3RpbWVzRnJBZmZpbmUA0AERZnJtX2JhdGNoQXBwbHlLZXkA0QERZzFtX2JhdGNoQXBwbHlLZXkA0gEWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZADTARFnMm1fYmF0Y2hBcHBseUtleQDUARZnMm1fYmF0Y2hBcHBseUtleU1peGVkANUBCmY2bV9pc1plcm8A1wEJZjZtX2lzT25lANgBCGY2bV96ZXJvANkBB2Y2bV9vbmUA2gEIZjZtX2NvcHkA2wEHZjZtX211bADcAQpmNm1fc3F1YXJlAN0BB2Y2bV9hZGQA3gEHZjZtX3N1YgDfAQdmNm1fbmVnAOABCGY2bV9zaWduAOEBEmY2bV9mcm9tTW9udGdvbWVyeQCiARBmNm1fdG9Nb250Z29tZXJ5AKQBBmY2bV9lcQDiAQtmNm1faW52ZXJzZQDjAQdmNm1fZXhwAOcBD2Y2bV90aW1lc1NjYWxhcgDkARBmNm1fYmF0Y2hJbnZlcnNlAOYBDmY2bV9pc05lZ2F0aXZlAOUBCmZ0bV9pc1plcm8A6QEJZnRtX2lzT25lAOoBCGZ0bV96ZXJvAOsBB2Z0bV9vbmUA7AEIZnRtX2NvcHkA7QEHZnRtX211bADuAQhmdG1fbXVsMQDvAQpmdG1fc3F1YXJlAPABB2Z0bV9hZGQA8QEHZnRtX3N1YgDyAQdmdG1fbmVnAPMBCGZ0bV9zaWduAPoBDWZ0bV9jb25qdWdhdGUA9AESZnRtX2Zyb21Nb250Z29tZXJ5APYBEGZ0bV90b01vbnRnb21lcnkA9QEGZnRtX2VxAPcBC2Z0bV9pbnZlcnNlAPgBB2Z0bV9leHAA/QEPZnRtX3RpbWVzU2NhbGFyAPkBEGZ0bV9iYXRjaEludmVyc2UA/AEIZnRtX3NxcnQA/gEMZnRtX2lzU3F1YXJlAP8BDmZ0bV9pc05lZ2F0aXZlAPsBFGJuMTI4X19mcm9iZW5pdXNNYXAwAIcCFGJuMTI4X19mcm9iZW5pdXNNYXAxAIgCFGJuMTI4X19mcm9iZW5pdXNNYXAyAIkCFGJuMTI4X19mcm9iZW5pdXNNYXAzAIoCFGJuMTI4X19mcm9iZW5pdXNNYXA0AIsCFGJuMTI4X19mcm9iZW5pdXNNYXA1AIwCFGJuMTI4X19mcm9iZW5pdXNNYXA2AI0CFGJuMTI4X19mcm9iZW5pdXNNYXA3AI4CFGJuMTI4X19mcm9iZW5pdXNNYXA4AI8CFGJuMTI4X19mcm9iZW5pdXNNYXA5AJACEGJuMTI4X3BhaXJpbmdFcTEAlQIQYm4xMjhfcGFpcmluZ0VxMgCWAhBibjEyOF9wYWlyaW5nRXEzAJcCEGJuMTI4X3BhaXJpbmdFcTQAmAIQYm4xMjhfcGFpcmluZ0VxNQCZAg1ibjEyOF9wYWlyaW5nAJoCD2JuMTI4X3ByZXBhcmVHMQCBAg9ibjEyOF9wcmVwYXJlRzIAgwIQYm4xMjhfbWlsbGVyTG9vcACGAhlibjEyOF9maW5hbEV4cG9uZW50aWF0aW9uAJQCHGJuMTI4X2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAkQIPYm4xMjhfX211bEJ5MDI0AIQCEmJuMTI4X19tdWxCeTAyNE9sZACFAhdibjEyOF9fY3ljbG90b21pY1NxdWFyZQCSAhdibjEyOF9fY3ljbG90b21pY0V4cF93MACTAgrerAObAioAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGAseACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxgLLAAgACkDGFAEfiAAKQMQUAR+IAApAwhQBH4gACkDAAVCAQsFQgELBUIBC1ALHgAgAEIBNwMAIABCADcDCCAAQgA3AxAgAEIANwMYC0AAIAApAxggASkDGFEEfyAAKQMQIAEpAxBRBH8gACkDCCABKQMIUQR/IAApAwAgASkDAFEFQQALBUEACwVBAAsLcwAgACkDGCABKQMYVAR/QQAFIAApAxggASkDGFYEf0EBBSAAKQMQIAEpAxBUBH9BAAUgACkDECABKQMQVgR/QQEFIAApAwggASkDCFQEf0EABSAAKQMIIAEpAwhWBH9BAQUgACkDACABKQMAWgsLCwsLCwvEAQEBfiACIAA1AgAgATUCAHwiAz4CACACIAA1AgQgATUCBHwgA0IgiHwiAz4CBCACIAA1AgggATUCCHwgA0IgiHwiAz4CCCACIAA1AgwgATUCDHwgA0IgiHwiAz4CDCACIAA1AhAgATUCEHwgA0IgiHwiAz4CECACIAA1AhQgATUCFHwgA0IgiHwiAz4CFCACIAA1AhggATUCGHwgA0IgiHwiAz4CGCACIAA1AhwgATUCHHwgA0IgiHwiAz4CHCADQiCIpwv8AQEBfiACIAA1AgAgATUCAH0iA0L/////D4M+AgAgAiAANQIEIAE1AgR9IANCIId8IgNC/////w+DPgIEIAIgADUCCCABNQIIfSADQiCHfCIDQv////8Pgz4CCCACIAA1AgwgATUCDH0gA0Igh3wiA0L/////D4M+AgwgAiAANQIQIAE1AhB9IANCIId8IgNC/////w+DPgIQIAIgADUCFCABNQIUfSADQiCHfCIDQv////8Pgz4CFCACIAA1AhggATUCGH0gA0Igh3wiA0L/////D4M+AhggAiAANQIcIAE1Ahx9IANCIId8IgNC/////w+DPgIcIANCIIenC+YOARF+IAQgADUCACIFIAE1AgAiBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIAIARCIIghAyADIAUgATUCBCIHfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgQiCCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgQgA0IgiCEEIAQgBSABNQIIIgl+IANC/////w+DfCIDQiCIfCEEIAQgByAIfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AggiCiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgggBEIgiCEDIAMgBSABNQIMIgt+IARC/////w+DfCIEQiCIfCEDIAMgCCAJfiAEQv////8Pg3wiBEIgiHwhAyADIAcgCn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIMIgwgBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIMIANCIIghBCAEIAUgATUCECINfiADQv////8Pg3wiA0IgiHwhBCAEIAggC34gA0L/////D4N8IgNCIIh8IQQgBCAJIAp+IANC/////w+DfCIDQiCIfCEEIAQgByAMfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhAiDiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhAgBEIgiCEDIAMgBSABNQIUIg9+IARC/////w+DfCIEQiCIfCEDIAMgCCANfiAEQv////8Pg3wiBEIgiHwhAyADIAogC34gBEL/////D4N8IgRCIIh8IQMgAyAJIAx+IARC/////w+DfCIEQiCIfCEDIAMgByAOfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhQiECAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhQgA0IgiCEEIAQgBSABNQIYIhF+IANC/////w+DfCIDQiCIfCEEIAQgCCAPfiADQv////8Pg3wiA0IgiHwhBCAEIAogDX4gA0L/////D4N8IgNCIIh8IQQgBCALIAx+IANC/////w+DfCIDQiCIfCEEIAQgCSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAcgEH4gA0L/////D4N8IgNCIIh8IQQgBCAANQIYIhIgBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIYIARCIIghAyADIAUgATUCHCITfiAEQv////8Pg3wiBEIgiHwhAyADIAggEX4gBEL/////D4N8IgRCIIh8IQMgAyAKIA9+IARC/////w+DfCIEQiCIfCEDIAMgDCANfiAEQv////8Pg3wiBEIgiHwhAyADIAsgDn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBB+IARC/////w+DfCIEQiCIfCEDIAMgByASfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhwiBSAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhwgA0IgiCEEIAQgCCATfiADQv////8Pg3wiA0IgiHwhBCAEIAogEX4gA0L/////D4N8IgNCIIh8IQQgBCAMIA9+IANC/////w+DfCIDQiCIfCEEIAQgDSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAsgEH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBJ+IANC/////w+DfCIDQiCIfCEEIAQgBSAHfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiAgBEIgiCEDIAMgCiATfiAEQv////8Pg3wiBEIgiHwhAyADIAwgEX4gBEL/////D4N8IgRCIIh8IQMgAyAOIA9+IARC/////w+DfCIEQiCIfCEDIAMgDSAQfiAEQv////8Pg3wiBEIgiHwhAyADIAsgEn4gBEL/////D4N8IgRCIIh8IQMgAyAFIAl+IARC/////w+DfCIEQiCIfCEDIAIgBD4CJCADQiCIIQQgBCAMIBN+IANC/////w+DfCIDQiCIfCEEIAQgDiARfiADQv////8Pg3wiA0IgiHwhBCAEIA8gEH4gA0L/////D4N8IgNCIIh8IQQgBCANIBJ+IANC/////w+DfCIDQiCIfCEEIAQgBSALfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiggBEIgiCEDIAMgDiATfiAEQv////8Pg3wiBEIgiHwhAyADIBAgEX4gBEL/////D4N8IgRCIIh8IQMgAyAPIBJ+IARC/////w+DfCIEQiCIfCEDIAMgBSANfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AiwgA0IgiCEEIAQgECATfiADQv////8Pg3wiA0IgiHwhBCAEIBEgEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIA9+IANC/////w+DfCIDQiCIfCEEIAIgAz4CMCAEQiCIIQMgAyASIBN+IARC/////w+DfCIEQiCIfCEDIAMgBSARfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AjQgA0IgiCEEIAQgBSATfiADQv////8Pg3wiA0IgiHwhBCACIAM+AjggAiAEPgI8C84NAQx+IAMgADUCACIGIAZ+IAJC/////w+DfCICQiCIfCEDIAEgAj4CACADIgRCIIghBSAANQIEIgcgBn4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIEIAMiBEIgiCEFIAA1AggiCCAGfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAHIAd+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIIIAMiBEIgiCEFIAA1AgwiCSAGfiICQiCIIQMgAyAHIAh+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIMIAMiBEIgiCEFIAA1AhAiCiAGfiICQiCIIQMgAyAHIAl+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCCAIfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CECADIgRCIIghBSAANQIUIgsgBn4iAkIgiCEDIAMgByAKfiACQv////8Pg3wiAkIgiHwhAyADIAggCX4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhQgAyIEQiCIIQUgADUCGCIMIAZ+IgJCIIghAyADIAcgC34gAkL/////D4N8IgJCIIh8IQMgAyAIIAp+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCSAJfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CGCADIgRCIIghBSAANQIcIg0gBn4iAkIgiCEDIAMgByAMfiACQv////8Pg3wiAkIgiHwhAyADIAggC34gAkL/////D4N8IgJCIIh8IQMgAyAJIAp+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIcIAMiBEIgiCEFIAcgDX4iAkIgiCEDIAMgCCAMfiACQv////8Pg3wiAkIgiHwhAyADIAkgC34gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAKIAp+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIgIAMiBEIgiCEFIAggDX4iAkIgiCEDIAMgCSAMfiACQv////8Pg3wiAkIgiHwhAyADIAogC34gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiQgAyIEQiCIIQUgCSANfiICQiCIIQMgAyAKIAx+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCyALfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CKCADIgRCIIghBSAKIA1+IgJCIIghAyADIAsgDH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiwgAyIEQiCIIQUgCyANfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAMIAx+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIwIAMiBEIgiCEFIAwgDX4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI0IAMiBEIgiCEFQgAhAkIAIQMgAyANIA1+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI4IAEgAz4CPAsKACAAIAAgARAIC+QDAgN+AX8gACADQegAIAMbIgMQACABQSgQACACQcgAIAIbIgcQAUGIARABQR8hAEEfIQEDQCABQShqLQAAIAFBA0ZyRQRAIAFBAWshAQwBCwsgAUElajUAAEIBfCIGQgFRBEBCAEIAgBoLA0ACQANAIAAgA2otAAAgAEEHRnJFBEAgAEEBayEADAELCyAAIANqQQdrKQAAIAaAIQQgACABa0EEayECA0AgBEKAgICAcINQIAJBAE5xRQRAIARCCIghBCACQQFqIQIMAQsLIARQBEAgA0EoEAVFDQFCASEEQQAhAgtBqAFBKDUAACAEfiIFPgAAQawBQSw1AAAgBH4gBUIgiHwiBT4AAEGwAUEwNQAAIAR+IAVCIIh8IgU+AABBtAFBNDUAACAEfiAFQiCIfCIFPgAAQbgBQTg1AAAgBH4gBUIgiHwiBT4AAEG8AUE8NQAAIAR+IAVCIIh8IgU+AABBwAFBwAA1AAAgBH4gBUIgiHwiBT4AAEHEAUHEADUAACAEfiAFQiCIfD4AACADQagBIAJrIAMQBxogAiAHaiICIAI1AAAgBHwiBD4AACAEQiCIIQQDQCAEQgBSBEAgAkEEaiICNQAAIAR8IQQgAiAEPgAAIARCIIghBAwBCwsMAQsLC44CAQp/QcgBIQNByAEQAUHoASEIIAFB6AEQAEGIAiEJQYgCEANBqAIhBiAAQagCEABByAIhC0HoAiEKQcgDIQQDQCAGEAJFBEAgCCAGIAsgChALIAsgCUGIAxAIIAcEfyAFBH9BiAMgAxAFBH9BiAMgAyAEEAcaQQAFIANBiAMgBBAHGkEBCwVBiAMgAyAEEAYaQQELBSAFBH9BiAMgAyAEEAYaQQAFIANBiAMQBQR/IANBiAMgBBAHGkEABUGIAyADIAQQBxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACEAcaBSADIAIQAAsLCQAgAEGoBBAECywAIAAgASACEAYEQCACQegDIAIQBxoFIAJB6AMQBQRAIAJB6AMgAhAHGgsLCxcAIAAgASACEAcEQCACQegDIAIQBhoLCwsAQcgEIAAgARAPC7YPAQN+IAAgADUCAEKJx5mkDiIEIAA1AgB+Qv////8PgyIDQegDNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxB7AM1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QfADNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEH0AzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB+AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfwDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGABDUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBhAQ1AgAgA358IgI+AhxBiAYgAkIgiD4CACAAIAA1AgQgADUCBCAEfkL/////D4MiA0HoAzUCAH58IgI+AgQgACAANQIIIAJCIIh8QewDNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEHwAzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB9AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfgDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH8AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBgAQ1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QYQENQIAIAN+fCICPgIgQYwGIAJCIIg+AgAgACAANQIIIAA1AgggBH5C/////w+DIgNB6AM1AgB+fCICPgIIIAAgADUCDCACQiCIfEHsAzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB8AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfQDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH4AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB/AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QYAENQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGEBDUCACADfnwiAj4CJEGQBiACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQegDNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxB7AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfADNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH0AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB+AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfwDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGABDUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBhAQ1AgAgA358IgI+AihBlAYgAkIgiD4CACAAIAA1AhAgADUCECAEfkL/////D4MiA0HoAzUCAH58IgI+AhAgACAANQIUIAJCIIh8QewDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHwAzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB9AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfgDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH8AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBgAQ1AgAgA358IgI+AiggACAANQIsIAJCIIh8QYQENQIAIAN+fCICPgIsQZgGIAJCIIg+AgAgACAANQIUIAA1AhQgBH5C/////w+DIgNB6AM1AgB+fCICPgIUIAAgADUCGCACQiCIfEHsAzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB8AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfQDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH4AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB/AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QYAENQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGEBDUCACADfnwiAj4CMEGcBiACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQegDNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxB7AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfADNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH0AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB+AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfwDNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGABDUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBhAQ1AgAgA358IgI+AjRBoAYgAkIgiD4CACAAIAA1AhwgADUCHCAEfkL/////D4MiA0HoAzUCAH58IgI+AhwgACAANQIgIAJCIIh8QewDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHwAzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB9AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfgDNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEH8AzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBgAQ1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QYQENQIAIAN+fCICPgI4QaQGIAJCIIg+AgBBiAYgAEEgaiABEA4LwBwBE34gBSABNQIAIgQgADUCACIOfnwiA0L/////D4MhBSAGIAA1AgQiDyAEfnwgA0IgiHwiA0L/////D4MhBiAHIAA1AggiECAEfnwgA0IgiHwiA0L/////D4MhByAIIAA1AgwiESAEfnwgA0IgiHwiA0L/////D4MhCCAJIAA1AhAiEiAEfnwgA0IgiHwiA0L/////D4MhCSAKIAA1AhQiEyAEfnwgA0IgiHwiA0L/////D4MhCiALIAA1AhgiFCAEfnwgA0IgiHwiA0L/////D4MhCyAMIAA1AhwiFSAEfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCBCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUKJx5mkDn5C/////w+DIgRCx/rzww1+fEIgiCAGIARClpiC4QN+fHwiA0L/////D4MhBSAHIARCjZXHwwZ+fCADQiCIfCIDQv////8PgyEGIAggBEKR1YW8CX58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AggiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVCiceZpA5+Qv////8PgyIEQsf688MNfnxCIIggBiAEQpaYguEDfnx8IgNC/////w+DIQUgByAEQo2Vx8MGfnwgA0IgiHwiA0L/////D4MhBiAIIARCkdWFvAl+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIMIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCECIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUKJx5mkDn5C/////w+DIgRCx/rzww1+fEIgiCAGIARClpiC4QN+fHwiA0L/////D4MhBSAHIARCjZXHwwZ+fCADQiCIfCIDQv////8PgyEGIAggBEKR1YW8CX58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhQiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVCiceZpA5+Qv////8PgyIEQsf688MNfnxCIIggBiAEQpaYguEDfnx8IgNC/////w+DIQUgByAEQo2Vx8MGfnwgA0IgiHwiA0L/////D4MhBiAIIARCkdWFvAl+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIYIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCHCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAIgBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8Pgz4CACACIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DPgIEIAIgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4M+AgggAiAJIARC3bCFjAh+fCADQiCIfCIDQv////8Pgz4CDCACIAogBEK2i8HCC358IANCIIh8IgNC/////w+DPgIQIAIgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4M+AhQgAiAMIARC8pyRgwN+fCADQiCIfCIDQv////8Pgz4CGCACIA0gA0IgiHw+AhwgAkHoAxAFBEAgAkHoAyACEAcaCwvoHQETfiAIIAA1AgAiDSANfnwiAkL/////D4MhCCAMIAA1AgQiDyANfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhDCADQiCIQgGGIAJCIIh8IAsgADUCCCIQIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCyADQiCIQgGGIAJCIIh8IAogADUCDCIRIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgADUCECISIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgADUCFCITIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhByADQiCIQgGGIAJCIIh8IAYgADUCGCIUIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAANQIcIg1+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgDiACQiCIfCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAwgDyAPfnwiAkL/////D4MhDCALIA8gEH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIA8gEX4iA0L/////D4NCAYZ8fCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAPIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgDyATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIA8gFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIA9+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAsgECAQfnwiAkL/////D4MhCyAKIBAgEX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIBAgEn4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgByAQIBN+IgNC/////w+DQgGGfHwiAkL/////D4MhByADQiCIQgGGIAJCIIh8IAYgECAUfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gEH4iA0L/////D4NCAYZ8fCICQv////8PgyEEIAUgA0IgiEIBhiACQiCIfHwiAkL/////D4MhBSACQiCIIQ4gCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8PgyEIIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DIQwgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4MhCyAJIANC3bCFjAh+fCACQiCIfCICQv////8PgyEKIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DIQkgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4MhByAEIANC8pyRgwN+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgCiARIBF+fCICQv////8PgyEKIAkgESASfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgESATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBEgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBF+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAkgEiASfnwiAkL/////D4MhCSAHIBIgE34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBIgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAcgEyATfnwiAkL/////D4MhByAGIBMgFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gE34iA0L/////D4NCAYZ8fCICQv////8PgyEEIAUgA0IgiEIBhiACQiCIfHwiAkL/////D4MhBSACQiCIIQ4gCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8PgyEIIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DIQwgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4MhCyAJIANC3bCFjAh+fCACQiCIfCICQv////8PgyEKIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DIQkgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4MhByAEIANC8pyRgwN+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgBiAUIBR+fCICQv////8PgyEGIAQgDSAUfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAQgDSANfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCEOIAEgCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8Pgz4CACABIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DPgIEIAEgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4M+AgggASAJIANC3bCFjAh+fCACQiCIfCICQv////8Pgz4CDCABIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DPgIQIAEgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4M+AhQgASAEIANC8pyRgwN+fCACQiCIfCICQv////8Pgz4CGCABIAUgAkIgiHwiAkL/////D4M+AhwgDiACQiCIfKcEQCABQegDIAEQBxoFIAFB6AMQBQRAIAFB6AMgARAHGgsLCwoAIAAgACABEBILCwAgAEGIBCABEBILFQAgAEGIChAAQagKEAFBiAogARARCxEAIABByAoQFkHICkGIBRAFCyMAIAAQAgRAQQAPCyAAQegKEBZB6ApBiAUQBQRAQX8PC0EBCxcAIAAgARAWIAFB6AMgARAMIAEgARAVCwkAQagEIAAQAAu8AQECfyACEAFBICEDA0AgASADTwRAIANBIEYEQEGICxAaBUGIC0GIBEGICxASCyAAQYgLQagLEBIgAkGoCyACEA4gAEEgaiEAIANBIGohAwwBCwsgAUEfcSIERQRADwtBqAsQAUEAIQEDQCABIARGRQRAIAEgAC0AADoAqAsgAEEBaiEAIAFBAWohAQwBCwsgA0EgRgRAQYgLEBoFQYgLQYgEQYgLEBILQagLQYgLQagLEBIgAkGoCyACEA4LHAAgASACQcgLEBtByAtByAsQFSAAQcgLIAMQEgvhAQECf0EAQQAoAgAiBSACQQFqQQV0ajYCACAFEBogBUEgaiEFA0AgAiAGRwRAIAAQAgRAIAVBIGsgBRAABSAAIAVBIGsgBRASCyAAIAFqIQAgBUEgaiEFIAZBAWohBgwBCwsgACABayEAIAMgAkEBayAEbGohAiAFQSBrIgUgBRAZA0AgBgRAIAAQAgRAIAUgBUEgaxAAIAIQAQUgBUEga0HoCxAAIAUgACAFQSBrEBIgBUHoCyACEBILIAAgAWshACACIARrIQIgBUEgayEFIAZBAWshBgwBCwtBACAFNgIACy0BAX8DQCABIANGRQRAIAAgAhAVIABBIGohACACQSBqIQIgA0EBaiEDDAELCwstAQF/A0AgASADRkUEQCAAIAIQFiAAQSBqIQAgAkEgaiECIANBAWohAwwBCwsLlwIAIAJFBEAgAxAaDwsgAEGIDBAAIAMQGgNAIAJBAWsiAiABai0AACEAIAMgAxATIABBgAFPBEAgA0GIDCADEBIgAEGAAWshAAsgAyADEBMgAEHAAE8EQCADQYgMIAMQEiAAQUBqIQALIAMgAxATIABBIE8EQCADQYgMIAMQEiAAQSBrIQALIAMgAxATIABBEE8EQCADQYgMIAMQEiAAQRBrIQALIAMgAxATIABBCE8EQCADQYgMIAMQEiAAQQhrIQALIAMgAxATIABBBE8EQCADQYgMIAMQEiAAQQRrIQALIAMgAxATIABBAk8EQCADQYgMIAMQEiAAQQJrIQALIAMgAxATIAAEQCADQYgMIAMQEgsgAg0ACwvVAQEBfyAAEAIEQCABEAEPC0EBIQJByAVBqAwQACAAQagFQSBByAwQICAAQegFQSBB6AwQIANAQcgMQagEEARFBEBByAxBiA0QE0EBIQADQEGIDUGoBBAERQRAQYgNQYgNEBMgAEEBaiEADAELC0GoDEGoDRAAIAIgAGtBAWshAgNAIAIEQEGoDUGoDRATIAJBAWshAgwBCwsgACECQagNQagMEBNByAxBqAxByAwQEkHoDEGoDUHoDBASDAELC0HoDBAXBEBB6AwgARAQBUHoDCABEAALCyAAIAAQAgRAQQEPCyAAQegEQSBByA0QIEHIDUGoBBAECwkAIABBqA4QBAssACAAIAEgAhAGBEAgAkHoDSACEAcaBSACQegNEAUEQCACQegNIAIQBxoLCwsXACAAIAEgAhAHBEAgAkHoDSACEAYaCwsLAEHIDiAAIAEQJQu2DwEDfiAAIAA1AgBC/////w4iBCAANQIAfkL/////D4MiA0HoDTUCAH58IgI+AgAgACAANQIEIAJCIIh8QewNNQIAIAN+fCICPgIEIAAgADUCCCACQiCIfEHwDTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB9A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfgNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH8DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxBgA41AgAgA358IgI+AhggACAANQIcIAJCIIh8QYQONQIAIAN+fCICPgIcQYgQIAJCIIg+AgAgACAANQIEIAA1AgQgBH5C/////w+DIgNB6A01AgB+fCICPgIEIAAgADUCCCACQiCIfEHsDTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB8A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfQNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH4DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB/A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QYAONQIAIAN+fCICPgIcIAAgADUCICACQiCIfEGEDjUCACADfnwiAj4CIEGMECACQiCIPgIAIAAgADUCCCAANQIIIAR+Qv////8PgyIDQegNNQIAfnwiAj4CCCAAIAA1AgwgAkIgiHxB7A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfANNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH0DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB+A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfwNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEGADjUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxBhA41AgAgA358IgI+AiRBkBAgAkIgiD4CACAAIAA1AgwgADUCDCAEfkL/////D4MiA0HoDTUCAH58IgI+AgwgACAANQIQIAJCIIh8QewNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEHwDTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB9A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfgNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH8DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxBgA41AgAgA358IgI+AiQgACAANQIoIAJCIIh8QYQONQIAIAN+fCICPgIoQZQQIAJCIIg+AgAgACAANQIQIAA1AhAgBH5C/////w+DIgNB6A01AgB+fCICPgIQIAAgADUCFCACQiCIfEHsDTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB8A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfQNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH4DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB/A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QYAONQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEGEDjUCACADfnwiAj4CLEGYECACQiCIPgIAIAAgADUCFCAANQIUIAR+Qv////8PgyIDQegNNQIAfnwiAj4CFCAAIAA1AhggAkIgiHxB7A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfANNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH0DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB+A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfwNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEGADjUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxBhA41AgAgA358IgI+AjBBnBAgAkIgiD4CACAAIAA1AhggADUCGCAEfkL/////D4MiA0HoDTUCAH58IgI+AhggACAANQIcIAJCIIh8QewNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHwDTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB9A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfgNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEH8DTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxBgA41AgAgA358IgI+AjAgACAANQI0IAJCIIh8QYQONQIAIAN+fCICPgI0QaAQIAJCIIg+AgAgACAANQIcIAA1AhwgBH5C/////w+DIgNB6A01AgB+fCICPgIcIAAgADUCICACQiCIfEHsDTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB8A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfQNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEH4DTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB/A01AgAgA358IgI+AjAgACAANQI0IAJCIIh8QYAONQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEGEDjUCACADfnwiAj4COEGkECACQiCIPgIAQYgQIABBIGogARAkC8AcARN+IAUgATUCACIEIAA1AgAiDn58IgNC/////w+DIQUgBiAANQIEIg8gBH58IANCIIh8IgNC/////w+DIQYgByAANQIIIhAgBH58IANCIIh8IgNC/////w+DIQcgCCAANQIMIhEgBH58IANCIIh8IgNC/////w+DIQggCSAANQIQIhIgBH58IANCIIh8IgNC/////w+DIQkgCiAANQIUIhMgBH58IANCIIh8IgNC/////w+DIQogCyAANQIYIhQgBH58IANCIIh8IgNC/////w+DIQsgDCAANQIcIhUgBH58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AgQiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVC/////w5+Qv////8PgyIEQoGAgIAPfnxCIIggBiAEQpPrh58Efnx8IgNC/////w+DIQUgByAEQpHh5c0HfnwgA0IgiHwiA0L/////D4MhBiAIIARCyNDPwQJ+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIIIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8OfkL/////D4MiBEKBgICAD358QiCIIAYgBEKT64efBH58fCIDQv////8PgyEFIAcgBEKR4eXNB358IANCIIh8IgNC/////w+DIQYgCCAEQsjQz8ECfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCDCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhAiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVC/////w5+Qv////8PgyIEQoGAgIAPfnxCIIggBiAEQpPrh58Efnx8IgNC/////w+DIQUgByAEQpHh5c0HfnwgA0IgiHwiA0L/////D4MhBiAIIARCyNDPwQJ+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIUIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8OfkL/////D4MiBEKBgICAD358QiCIIAYgBEKT64efBH58fCIDQv////8PgyEFIAcgBEKR4eXNB358IANCIIh8IgNC/////w+DIQYgCCAEQsjQz8ECfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCGCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhwiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSACIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4M+AgAgAiAHIARCkeHlzQd+fCADQiCIfCIDQv////8Pgz4CBCACIAggBELI0M/BAn58IANCIIh8IgNC/////w+DPgIIIAIgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4M+AgwgAiAKIARCtovBwgt+fCADQiCIfCIDQv////8Pgz4CECACIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DPgIUIAIgDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4M+AhggAiANIANCIIh8PgIcIAJB6A0QBQRAIAJB6A0gAhAHGgsL6B0BE34gCCAANQIAIg0gDX58IgJC/////w+DIQggDCAANQIEIg8gDX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AggiECANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIAA1AgwiESANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIAA1AhAiEiANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIAA1AhQiEyANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AhgiFCANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gADUCHCINfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIA4gAkIgiHwhDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAMIA8gD358IgJC/////w+DIQwgCyAPIBB+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCiAPIBF+IgNC/////w+DQgGGfHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgDyASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIA8gE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAPIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAPfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSALIBAgEH58IgJC/////w+DIQsgCiAQIBF+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAQIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgECATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBAgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBB+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4MhCCALIANCkeHlzQd+fCACQiCIfCICQv////8PgyEMIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAogESARfnwiAkL/////D4MhCiAJIBEgEn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBEgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAJIBIgEn58IgJC/////w+DIQkgByASIBN+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiASIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAHIBMgE358IgJC/////w+DIQcgBiATIBR+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBN+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4MhCCALIANCkeHlzQd+fCACQiCIfCICQv////8PgyEMIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAYgFCAUfnwiAkL/////D4MhBiAEIA0gFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAEIA0gDX58IgJC/////w+DIQQgBSACQiCIfCICQv////8PgyEFIAJCIIghDiABIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4M+AgAgASALIANCkeHlzQd+fCACQiCIfCICQv////8Pgz4CBCABIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DPgIIIAEgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4M+AgwgASAHIANCtovBwgt+fCACQiCIfCICQv////8Pgz4CECABIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DPgIUIAEgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4M+AhggASAFIAJCIIh8IgJC/////w+DPgIcIA4gAkIgiHynBEAgAUHoDSABEAcaBSABQegNEAUEQCABQegNIAEQBxoLCwsKACAAIAAgARAoCwsAIABBiA4gARAoCxUAIABBiBQQAEGoFBABQYgUIAEQJwsRACAAQcgUECxByBRBiA8QBQsjACAAEAIEQEEADwsgAEHoFBAsQegUQYgPEAUEQEF/DwtBAQsXACAAIAEQLCABQegNIAEQDCABIAEQKwsJAEGoDiAAEAALvAEBAn8gAhABQSAhAwNAIAEgA08EQCADQSBGBEBBiBUQMAVBiBVBiA5BiBUQKAsgAEGIFUGoFRAoIAJBqBUgAhAkIABBIGohACADQSBqIQMMAQsLIAFBH3EiBEUEQA8LQagVEAFBACEBA0AgASAERkUEQCABIAAtAAA6AKgVIABBAWohACABQQFqIQEMAQsLIANBIEYEQEGIFRAwBUGIFUGIDkGIFRAoC0GoFUGIFUGoFRAoIAJBqBUgAhAkCxwAIAEgAkHIFRAxQcgVQcgVECsgAEHIFSADECgL4QEBAn9BAEEAKAIAIgUgAkEBakEFdGo2AgAgBRAwIAVBIGohBQNAIAIgBkcEQCAAEAIEQCAFQSBrIAUQAAUgACAFQSBrIAUQKAsgACABaiEAIAVBIGohBSAGQQFqIQYMAQsLIAAgAWshACADIAJBAWsgBGxqIQIgBUEgayIFIAUQLwNAIAYEQCAAEAIEQCAFIAVBIGsQACACEAEFIAVBIGtB6BUQACAFIAAgBUEgaxAoIAVB6BUgAhAoCyAAIAFrIQAgAiAEayECIAVBIGshBSAGQQFrIQYMAQsLQQAgBTYCAAstAQF/A0AgASADRkUEQCAAIAIQKyAAQSBqIQAgAkEgaiECIANBAWohAwwBCwsLLQEBfwNAIAEgA0ZFBEAgACACECwgAEEgaiEAIAJBIGohAiADQQFqIQMMAQsLC5cCACACRQRAIAMQMA8LIABBiBYQACADEDADQCACQQFrIgIgAWotAAAhACADIAMQKSAAQYABTwRAIANBiBYgAxAoIABBgAFrIQALIAMgAxApIABBwABPBEAgA0GIFiADECggAEFAaiEACyADIAMQKSAAQSBPBEAgA0GIFiADECggAEEgayEACyADIAMQKSAAQRBPBEAgA0GIFiADECggAEEQayEACyADIAMQKSAAQQhPBEAgA0GIFiADECggAEEIayEACyADIAMQKSAAQQRPBEAgA0GIFiADECggAEEEayEACyADIAMQKSAAQQJPBEAgA0GIFiADECggAEECayEACyADIAMQKSAABEAgA0GIFiADECgLIAINAAsL1QEBAX8gABACBEAgARABDwtBHCECQcgPQagWEAAgAEGoD0EgQcgWEDYgAEHoD0EgQegWEDYDQEHIFkGoDhAERQRAQcgWQYgXEClBASEAA0BBiBdBqA4QBEUEQEGIF0GIFxApIABBAWohAAwBCwtBqBZBqBcQACACIABrQQFrIQIDQCACBEBBqBdBqBcQKSACQQFrIQIMAQsLIAAhAkGoF0GoFhApQcgWQagWQcgWEChB6BZBqBdB6BYQKAwBCwtB6BYQLQRAQegWIAEQJgVB6BYgARAACwsgACAAEAIEQEEBDwsgAEHoDkEgQcgXEDZByBdBqA4QBAsVACAAIAFB6BcQKEHoF0GIDiACECgLCgAgACAAIAEQOQsLACAAQegNIAEQDAsJACAAQYgPEAULDgAgABACIABBIGoQAnELCQAgAEFAaxACCw0AIAAQASAAQSBqEAELFAAgABABIABBIGoQGiAAQUBrEAELUgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOAt6ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWAsnACAAED0EQCABEEAFIAFBQGsQGiAAQSBqIAFBIGoQACAAIAEQAAsLFQAgACABEAQgAEEgaiABQSBqEARxC3EBAX8gABA+BEAgARA9DwsgARA9BEBBAA8LIABBQGsiAhANBEAgACABEEQPCyACQagYEBMgAUGoGEHIGBASIAJBqBhB6BgQEiABQSBqQegYQYgZEBIgAEHIGBAEBEAgAEEgakGIGRAEBEBB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ECAAQUBrIAFBQGsQAAsSACABQYgpEEwgAEGIKSACEEkLEgAgAUHoKRBMIABB6CkgAhBKCxIAIAFByCoQTSAAQcgqIAIQSwsUACAAIAEQFiAAQSBqIAFBIGoQFgsgACAAIAEQFiAAQSBqIAFBIGoQFiAAQUBrIAFBQGsQFgsUACAAIAEQFSAAQSBqIAFBIGoQFQsgACAAIAEQFSAAQSBqIAFBIGoQFSAAQUBrIAFBQGsQFQtKACAAED4EQCABEAEgAUEgahABBSAAQUBrQagrEBlBqCtByCsQE0GoK0HIK0HoKxASIABByCsgARASIABBIGpB6CsgAUEgahASCwswACAAQSBqQYgsEBMgAEGoLBATIABBqCxBqCwQEkGoLEGIGEGoLBAOQYgsQagsEAQLDgAgAEHILBBVQcgsEFYLlAEBA39BAEEAKAIAIgQgAUEFdGo2AgAgAEFAa0HgACABIARBIBAdIAQhAwNAIAEgBUcEQCADEAIEQCACEAEgAkEgahABBSADIABBIGpBiC0QEiADIAMQEyADIAAgAhASIANBiC0gAkEgahASCyAAQeAAaiEAIAJBQGshAiADQSBqIQMgBUEBaiEFDAELC0EAIAQ2AgALSgAgABA+BEAgARBABSAAQUBrQagtEBlBqC1ByC0QE0GoLUHILUHoLRASIABByC0gARASIABBIGpB6C0gAUEgahASIAFBQGsQGgsLMgAgASACakEBayEBA0AgASACSEUEQCABIAAtAAA6AAAgAUEBayEBIABBAWohAAwBCwsLKgAgABA9BEAgARA/DwsgAEGILhBRQYguQSAgARBaQaguQSAgAUEgahBaC0EAIAAQPQRAIAEQASABQcAAOgAADwsgAEHILhAWQcguQSAgARBaIABBIGoQGEF/RgRAIAEgAS0AAEGAAXI6AAALCy8AIAAtAABBwABxBEAgARA/DwsgAEEgQeguEFogAEEgakEgQYgvEFpB6C4gARBTC64BAQJ/IAAtAAAiAkHAAHEEQCABED8PCyACQYABcSEDIABByC8QAEHILyACQT9xOgAAQcgvQSBBqC8QWkGoLyABEBUgAUHILxATIAFByC9ByC8QEkHIL0GIGEHILxAOQcgvQcgvECFByC9BqC8QEEHILxAYQX9GBEAgAwRAQcgvIAFBIGoQAAVByC8gAUEgahAQCwUg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fyAAQYABayEACyADIAMQgQEgAEHAAE8EQCADQcjcACADEH8gAEFAaiEACyADIAMQgQEgAEEgTwRAIANByNwAIAMQfyAAQSBrIQALIAMgAxCBASAAQRBPBEAgA0HI3AAgAxB/IABBEGshAAsgAyADEIEBIABBCE8EQCADQcjcACADEH8gAEEIayEACyADIAMQgQEgAEEETwRAIANByNwAIAMQfyAAQQRrIQALIAMgAxCBASAAQQJPBEAgA0HI3AAgAxB/IABBAmshAAsgAyADEIEBIAAEQCADQcjcACADEH8LIAINAAsLwwEAQYjfABB9QYjfAEGI3wAQhAEgAEGI3QBBIEHI3QAQigFByN0AQYjeABCBASAAQYjeAEGI3gAQf0GI3gBByN4AEExByN4AQYjeAEHI3gAQf0HI3gBBiN8AEEQEQAALQcjdACAAQcjfABB/QYjeAEGI3wAQRARAQYjfABABQajfABAaQYjfAEHI3wAgARB/BUGI4AAQfUGI4ABBiN4AQYjgABCCAUGI4ABBqN0AQSBBiOAAEIoBQYjgAEHI3wAgARB/CwtjAEGo4gAQfUGo4gBBqOIAEIQBIABByOAAQSBB6OAAEIoBQejgAEGo4QAQgQEgAEGo4QBBqOEAEH9BqOEAQejhABBMQejhAEGo4QBB6OEAEH9B6OEAQajiABBEBEBBAA8LQQELDgAgABA9IABBQGsQPXELCgAgAEGAAWoQPQsNACAAED8gAEFAaxA/CxUAIAAQPyAAQUBrEH0gAEGAAWoQPwuiAQAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1ggASAAKQNgNwNgIAEgACkDaDcDaCABIAApA3A3A3AgASAAKQN4NwN4C4ICACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWCABIAApA2A3A2AgASAAKQNoNwNoIAEg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gAFqIAFBgAFqEIMBQYiLAiABQYABaiABQYABahCCAUHIigIgAUGAAWogAUGAAWoQggELMgAgACABIAIQggEgAEFAayABQUBrIAJBQGsQggEgAEGAAWogAUGAAWogAkGAAWoQggELMgAgACABIAIQgwEgAEFAayABQUBrIAJBQGsQgwEgAEGAAWogAUGAAWogAkGAAWoQgwELJQAgACABEIQBIABBQGsgAUFAaxCEASAAQYABaiABQYABahCEAQsqAQF/IABBgAFqEIcBIgEEQCABDwsgAEFAaxCHASIBBEAgAQ8LIAAQhwELJAAgACABEEQgAEFAayABQUBrEERxIABBgAFqIAFBgAFqEERxC50CACAAQYiNAhCBASAAQUBrQciNAhCBASAAQYABakGIjgIQgQEgACAAQUBrQciOAhB/IAAgAEGAAWpBiI8CEH8gAEFAayAAQYABakHIjwIQf0HIjwJBiJACENYBQYiNAkGIkAJBiJACEIMBQYiOAkHIkAIQ1gFByJACQciOAkHIkAIQgwFByI0CQYiPAkGIkQIQgwEgAEGAAWpByJACQciRAhB/IABBQGtBiJECQYiSAhB/QciRAkGIkgJByJECEIIBQciRAkHIkQIQ1gEgAEGIkAJBiJICEH9BiJICQciRAkHIkQIQggFByJECQciRAhCFAUHIkQJBiJACIAEQf0HIkQJByJACIAFBQGsQf0HIkQJBiJECIAFBgAFqEH8LMQAgACABIAIgAxCGASAAQUBrIAEgAiADQUBrEIYBIABBgAFqIAEgAiADQYABahCGAQspACAAQYABahA9BEAgACAAQUBrIABBQGsQPRsQiAEPCyAAQYABahCIAQv4AQECf0EAQQAoAgAiBSACQQFqQcABbGo2AgAgBRDaASAFQcABaiEFA0AgAiAGRwRAIAAQ1wEEQCAFQcABayAFENsBBSAAIAVBwAFrIAUQ3AELIAAgAWohACAFQcABaiEFIAZBAWohBgwBCwsgACABayEAIAMgAkEBayAEbGohAiAFQcABayIFIAUQ4wEDQCAGBEAgABDXAQRAIAUgBUHAAWsQ2wEgAhDZAQUgBUHAAWtByJICENsBIAUgACAFQcABaxDcASAFQciSAiACENwBCyAAIAFrIQAgAiAEayECIAVBwAFrIQUgBkEBayEGDAELC0EAIAU2AgALswIAIAJFBEAgAxDaAQ8LIABBiJQCENsBIAMQ2gEDQCACQQFrIgIgAWotAAAhACADIAMQ3QEgAEGAAU8EQCADQYiUAiADENwBIABBgAFrIQALIAMgAxDdASAAQcAATwRAIANBiJQCIAMQ3AEgAEFAaiEACyADIAMQ3QEgAEEgTwRAIANBiJQCIAMQ3AEgAEEgayEACyADIAMQ3QEgAEEQTwRAIANBiJQCIAMQ3AEgAEEQayEACyADIAMQ3QEgAEEITwRAIANBiJQCIAMQ3AEgAEEIayEACyADIAMQ3QEgAEEETwRAIANBiJQCIAMQ3AEgAEEEayEACyADIAMQ3QEgAEECTwRAIANBiJQCIAMQ3AEgAEECayEACyADIAMQ3QEgAARAIANBiJQCIAMQ3AELIAINAAsLJgBByIECIABBgAFqIAEQfyAAIAFBQGsQfiAAQUBrIAFBgAFqEH4LEQAgABDXASAAQcABahDXAXELEQAgABDYASAAQcABahDXAXELEAAgABDZASAAQcABahDZAQsQACAAENoBIABBwAFqENkBCxgAIAAgARDbASAAQcABaiABQcABahDbAQuFAQAgACABQciVAhDcASAAQcABaiABQcABakGIlwIQ3AEgACAAQcABakHImAIQ3gEgASABQcABakGImgIQ3gFByJgCQYiaAkHImAIQ3AFBiJcCIAIQ6AFByJUCIAIgAhDeAUHIlQJBiJcCIAJBwAFqEN4BQciYAiACQcABaiACQcABahDfAQscACAAIAEgAhDcASAAQcABaiABIAJBwAFqENwBC30AIAAgAEHAAWpByJsCENwBIAAgAEHAAWpBiJ0CEN4BIABBwAFqQcieAhDoASAAQcieAkHIngIQ3gFByJsCQYigAhDoAUGIoAJByJsCQYigAhDeAUGInQJByJ4CIAEQ3AEgAUGIoAIgARDfAUHImwJByJsCIAFBwAFqEN4BCyAAIAAgASACEN4BIABBwAFqIAFBwAFqIAJBwAFqEN4BCyAAIAAgASACEN8BIABBwAFqIAFBwAFqIAJBwAFqEN8BCxgAIAAgARDgASAAQcABaiABQcABahDgAQsYACAAIAEQ2wEgAEHAAWogAUHAAWoQ4AELGAAgACABEKQBIABBwAFqIAFBwAFqEKQBCxgAIAAgARCiASAAQcABaiABQcABahCiAQsZACAAIAEQ4gEgAEHAAWogAUHAAWoQ4gFxC2oAIABByKECEN0BIABBwAFqQYijAhDdAUGIowJByKQCEOgBQcihAkHIpAJByKQCEN8BQcikAkGIpgIQ4wEgAEGIpgIgARDcASAAQcABakGIpgIgAUHAAWoQ3AEgAUHAAWogAUHAAWoQ4AELIAAgACABIAIgAxDkASAAQcABaiABIAIgA0HAAWoQ5AELGgEBfyAAQcABahDhASIBBEAgAQ8LIAAQ4QELHQAgAEHAAWoQ1wEEQCAAEOUBDwsgAEHAAWoQ5QEL+AEBAn9BAEEAKAIAIgUgAkEBakGAA2xqNgIAIAUQ7AEgBUGAA2ohBQNAIAIgBkcEQCAAEOkBBEAgBUGAA2sgBRDtAQUgACAFQYADayAFEO4BCyAAIAFqIQAgBUGAA2ohBSAGQQFqIQYMAQsLIAAgAWshACADIAJBAWsgBGxqIQIgBUGAA2siBSAFEPgBA0AgBgRAIAAQ6QEEQCAFIAVBgANrEO0BIAIQ6wEFIAVBgANrQcinAhDtASAFIAAgBUGAA2sQ7gEgBUHIpwIgAhDuAQsgACABayEAIAIgBGshAiAFQYADayEFIAZBAWshBgwBCwtBACAFNgIAC7MCACACRQRAIAMQ7AEPCyAAQciqAhDtASADEOwBA0AgAkEBayICIAFqLQAAIQAgAyADEPABIABBgAFPBEAgA0HIqgIgAxDuASAAQYABayEACyADIAMQ8AEgAEHAAE8EQCADQciqAiADEO4BIABBQGohAAsgAyADEPABIABBIE8EQCADQciqAiADEO4BIABBIGshAAsgAyADEPABIABBEE8EQCADQciqAiADEO4BIABBEGshAAsgAyADEPABIABBCE8EQCADQciqAiADEO4BIABBCGshAAsgAyADEPABIABBBE8EQCADQciqAiADEO4BIABBBGshAAsgAyADEPABIABBAk8EQCADQciqAiADEO4BIABBAmshAAsgAyADEPABIAAEQCADQciqAiADEO4BCyACDQALC9EBAEHIuQIQ7AFByLkCQci5AhDzASAAQcitAkHAAUHIsAIQ/QFByLACQcizAhDwASAAQcizAkHIswIQ7gFByLMCQci2AhD0AUHItgJByLMCQci2AhDuAUHItgJByLkCEPcBBEAAC0HIsAIgAEHIvAIQ7gFByLMC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ECABQYABakGQjwQgAUGAAWoQfyAAQcABaiABQcABahAAIABB4AFqIAFB4AFqEBAgAUHAAWpB0I8EIAFBwAFqEH8gAEGAAmogAUGAAmoQACAAQaACaiABQaACahAQIAFBgAJqQZCQBCABQYACahB/IABBwAJqIAFBwAJqEAAgAEHgAmogAUHgAmoQECABQcACakHQkAQgAUHAAmoQfwtkACAAQZCRBCABEH8gAEFAa0HQkQQgAUFAaxB/IABBgAFqQZCSBCABQYABahB/IABBwAFqQdCSBCABQcABahB/IABBgAJqQZCTBCABQYACahB/IABBwAJqQdCTBCABQcACahB/C4ACACAAIAEQACAAQSBqIAFBIGoQECABQZCUBCABEH8gAEFAayABQUBrEAAgAEHgAGogAUHgAGoQECABQUBrQdCUBCABQUBrEH8gAEGAAWogAUGAAWoQACAAQaABaiABQaABahAQIAFBgAFqQZCVBCABQYABahB/IABBwAFqIAFBwAFqEAAgAEHgAWogAUHgAWoQECABQcABakHQlQQgAUHAAWoQfyAAQYACaiABQYACahAAIABBoAJqIAFBoAJqEBAgAUGAAmpBkJYEIAFBgAJqEH8gAEHAAmogAUHAAmoQACAAQeACaiABQeACahAQIAFBwAJqQdCWBCABQcACahB/C2QAIABBkJcEIAEQfyAAQUBrQdCXBCABQUBrEH8gAEGAAWpBkJgEIAFBgAFqEH8gAEHAAWpB0JgEIAFBwAFqEH8gAEGAAmpBkJkEIAFBgAJqEH8gAEHAAmpB0JkEIAFBwAJqEH8LgAIAIAAgARAAIABBIGogAUEgahAQIAFBkJoEIAEQfyAAQUBrIAFBQGsQACAAQeAAaiABQeAAahAQIAFBQGtB0JoEIAFBQGsQfyAAQYABaiABQYABahAAIABBoAFqIAFBoAFqEBAgAUGAAWpBkJsEIAFBgAFqEH8gAEHAAWogAUHAAWoQACAAQeABaiABQeABahAQIAFBwAFqQdCbBCABQcABahB/IABBgAJqIAFBgAJqEAAgAEGgAmogAUGgAmoQECABQYACakGQnAQgAUGAAmoQfyAAQcACaiABQcACahAAIABB4AJqIAFB4AJqEBAgAUHAAmpB0JwEIAFBwAJqEH8LZAAgAEGQnQQgARB/IABBQGtB0J0EIAFB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"; +const pq$1 = 488; +const pG1gen$1 = 32008; +const pG1zero$1 = 32104; +const pG1b$1 = 3080; +const pG2gen$1 = 32200; +const pG2zero$1 = 32392; +const pG2b$1 = 12648; +const pOneT$1 = 32584; +const prePSize$1 = 192; +const preQSize$1 = 19776; +const q$1 = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; +const r$1 = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; + +// AUTO-GENERATED from wasmcurves/build/msm_batch.wasm — do not edit. +// Regenerate with: npm run gen-wasm +// Batch-affine MSM module; links against the main curve module at runtime. +const code$1 = "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"; + +// base64 -> Uint8Array, used once at curve load to decode the vendored wasm. +// +// Prefer the platform decoder (Buffer in Node, atob in browsers/extensions) for +// speed, and fall back to a pure-JS implementation only where neither exists -- +// e.g. a SES hardened realm that has not endowed atob/Buffer. The fallback keeps the +// curve loadable everywhere without depending on any host base64 primitive. + +const CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +let LOOKUP; + +function decodePureJs(b64) { + if (!LOOKUP) { + LOOKUP = new Uint8Array(256); + for (let i = 0; i < CHARS.length; i++) LOOKUP[CHARS.charCodeAt(i)] = i; + } + const len = b64.length; + let pad = 0; + if (len > 0 && b64[len - 1] === "=") pad++; + if (len > 1 && b64[len - 2] === "=") pad++; + const outLen = ((len * 3) >> 2) - pad; + const out = new Uint8Array(outLen); + let o = 0; + for (let i = 0; i < len; i += 4) { + const a = LOOKUP[b64.charCodeAt(i)]; + const b = LOOKUP[b64.charCodeAt(i + 1)]; + const c = LOOKUP[b64.charCodeAt(i + 2)]; + const d = LOOKUP[b64.charCodeAt(i + 3)]; + if (o < outLen) out[o++] = (a << 2) | (b >> 4); + if (o < outLen) out[o++] = ((b & 15) << 4) | (c >> 2); + if (o < outLen) out[o++] = ((c & 3) << 6) | d; + } + return out; +} + +function base64ToUint8Array(b64) { + if (typeof Buffer !== "undefined" && typeof Buffer.from === "function") { + // Node (and Node-compatible runtimes) — fastest. + return new Uint8Array(Buffer.from(b64, "base64")); + } + if (typeof atob === "function") { + // Browsers, extensions, modern Node, Deno. + const bin = atob(b64); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); + return out; + } + // SES hardened realm or any host without a base64 primitive. + return decodePureJs(b64); +} + +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bn128 = null; async function buildBn128(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bn128)) return globalThis.curve_bn128; - - const moduleBuilder = new wasmbuilder.ModuleBuilder(); - moduleBuilder.setMemory(25); - wasmcurves.buildBn128(moduleBuilder); - - if (plugins) plugins(moduleBuilder); - - const bn128wasm = {}; - - bn128wasm.code = moduleBuilder.build(); - bn128wasm.pq = moduleBuilder.modules.f1m.pq; - bn128wasm.pr = moduleBuilder.modules.frm.pq; - bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; - bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; - bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; - bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; - bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; - bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; - bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; - bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; - bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; - bn128wasm.n8q = 32; - bn128wasm.n8r = 32; - bn128wasm.q = moduleBuilder.modules.bn128.q; - bn128wasm.r = moduleBuilder.modules.bn128.r; + if ((!singleThread) && (curve_bn128)) return curve_bn128; + + let bn128wasm = {}; + + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: statically imported (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Regenerate the vendored module with `npm run gen-wasm`. + bn128wasm.code = base64ToUint8Array(code$2); + bn128wasm.pq = pq$1; + bn128wasm.pr = pq$1; + bn128wasm.pG1gen = pG1gen$1; + bn128wasm.pG1zero = pG1zero$1; + bn128wasm.pG1b = pG1b$1; + bn128wasm.pG2gen = pG2gen$1; + bn128wasm.pG2zero = pG2zero$1; + bn128wasm.pG2b = pG2b$1; + bn128wasm.pOneT = pOneT$1; + bn128wasm.prePSize = prePSize$1; + bn128wasm.preQSize = preQSize$1; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = q$1; + bn128wasm.r = r$1; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import('wasmbuilder'); + const { buildBn128: buildBn128wasm } = await import('wasmcurves'); + + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBn128wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bn128wasm.code = moduleBuilder.build(); + bn128wasm.pq = moduleBuilder.modules.f1m.pq; + bn128wasm.pr = moduleBuilder.modules.frm.pq; + bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; + bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; + bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; + bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; + bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; + bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; + bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; + bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; + bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = moduleBuilder.modules.bn128.q; + bn128wasm.r = moduleBuilder.modules.bn128.r; + } + + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bn128wasm.batchCode = base64ToUint8Array(code$1); + // The batch module's GLV path hardcodes the bn254 endomorphism constants. + bn128wasm.glv = true; const params = { name: "bn128", @@ -5881,48 +6352,106 @@ async function buildBn128(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bn128 = null; + curve_bn128 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bn128 = curve; + curve_bn128 = curve; } return curve; } -globalThis.curve_bls12381 = null; +// AUTO-GENERATED from wasmcurves/build/bls12381_wasm.js — do not edit. +// Regenerate with: npm run gen-wasm +// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are +// pointer offsets / field moduli. +const code = "AGFzbQEAAAABjwERYAJ/fwBgA39/fwBgAX8Bf2AEf39/fwBgBX9/f39/AGABfwBgAn9/AX9gBn9/f39/fwBgA39/fwF/YAh/f39/f39/fwBgAn9+AGAEf39/fwF/YAp/f39/f39/f39/AGAFf39/f38Bf2AHf39/f39/fwF/YAl/f39/f39/f38Bf2ALf39/f39/f39/f38BfwIPAQNlbnYGbWVtb3J5AgAZA68CrQIABQIFBgYICAEAAAoDAQIBAQAAAQAAAAACAgAFAQMEAQEDAAIABQIFBgYICAEAAAMBAgEBAAABAAAAAAICAAUBAwQBAQMAAgEAAAICAgUFAAAABgYGAAABAQEAAAEBAQAAAAAAAgIBAAEAAAAAAQEBAQELBwkECQQDAwADAgAABAcHAQEHAAMMBAMCBQABAQABAQAAAwICBAMAAgICBQUAAAAGBgYAAAEBAQAAAQEBAAAAAAACAgEAAAAAAAEBAQEBCQQJBAMDAQADAAAEBwcBAQcBAAMAAAQHBwEBBwEBBAQEBAQAAgIFBQABAAEBAAIGAAMCBAMAAgIFBQABAQABAQAAAAAGAAMCAgQDAAIBAwQBAAAAAAAAAAAAAAICAgIAAAEAAAAACA0ODxABB74nvQIJaW50cV9jb3B5AAAJaW50cV96ZXJvAAEIaW50cV9vbmUAAwtpbnRxX2lzWmVybwACB2ludHFfZXEABAhpbnRxX2d0ZQAFCGludHFfYWRkAAYIaW50cV9zdWIABwhpbnRxX211bAAIC2ludHFfc3F1YXJlAAkOaW50cV9zcXVhcmVPbGQACghpbnRxX2RpdgAMD2ludHFfaW52ZXJzZU1vZAANCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAPB2YxbV9zdWIAEAdmMW1fbmVnABEOZjFtX2lzTmVnYXRpdmUAGAlmMW1faXNPbmUADghmMW1fc2lnbgAZC2YxbV9tUmVkdWN0ABIHZjFtX211bAATCmYxbV9zcXVhcmUAFA1mMW1fc3F1YXJlT2xkABUSZjFtX2Zyb21Nb250Z29tZXJ5ABcQZjFtX3RvTW9udGdvbWVyeQAWC2YxbV9pbnZlcnNlABoHZjFtX29uZQAbCGYxbV9sb2FkABwPZjFtX3RpbWVzU2NhbGFyAB0HZjFtX2V4cAAhEGYxbV9iYXRjaEludmVyc2UAHghmMW1fc3FydAAiDGYxbV9pc1NxdWFyZQAjFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAfF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5ACAJaW50cl9jb3B5ACQJaW50cl96ZXJvACUIaW50cl9vbmUAJwtpbnRyX2lzWmVybwAmB2ludHJfZXEAKAhpbnRyX2d0ZQApCGludHJfYWRkACoIaW50cl9zdWIAKwhpbnRyX211bAAsC2ludHJfc3F1YXJlAC0OaW50cl9zcXVhcmVPbGQALghpbnRyX2RpdgAvD2ludHJfaW52ZXJzZU1vZAAwCGZybV9jb3B5ACQIZnJtX3plcm8AJQpmcm1faXNaZXJvACYGZnJtX2VxACgHZnJtX2FkZAAyB2ZybV9zdWIAMwdmcm1fbmVnADQOZnJtX2lzTmVnYXRpdmUAOwlmcm1faXNPbmUAMQhmcm1fc2lnbgA8C2ZybV9tUmVkdWN0ADUHZnJtX211bAA2CmZybV9zcXVhcmUANw1mcm1fc3F1YXJlT2xkADgSZnJtX2Zyb21Nb250Z29tZXJ5ADoQZnJtX3RvTW9udGdvbWVyeQA5C2ZybV9pbnZlcnNlAD0HZnJtX29uZQA+CGZybV9sb2FkAD8PZnJtX3RpbWVzU2NhbGFyAEAHZnJtX2V4cABEEGZybV9iYXRjaEludmVyc2UAQQhmcm1fc3FydABFDGZybV9pc1NxdWFyZQBGFWZybV9iYXRjaFRvTW9udGdvbWVyeQBCF2ZybV9iYXRjaEZyb21Nb250Z29tZXJ5AEMGZnJfYWRkADIGZnJfc3ViADMGZnJfbmVnADQGZnJfbXVsAEcJZnJfc3F1YXJlAEgKZnJfaW52ZXJzZQBJDWZyX2lzTmVnYXRpdmUASgdmcl9jb3B5ACQHZnJfemVybwAlBmZyX29uZQA+CWZyX2lzWmVybwAmBWZyX2VxACgMZzFtX211bHRpZXhwAHUSZzFtX211bHRpZXhwX2NodW5rAHQSZzFtX211bHRpZXhwQWZmaW5lAHcYZzFtX211bHRpZXhwQWZmaW5lX2NodW5rAHYKZzFtX2lzWmVybwBMEGcxbV9pc1plcm9BZmZpbmUASwZnMW1fZXEAVAtnMW1fZXFNaXhlZABTDGcxbV9lcUFmZmluZQBSCGcxbV9jb3B5AFAOZzFtX2NvcHlBZmZpbmUATwhnMW1femVybwBODmcxbV96ZXJvQWZmaW5lAE0KZzFtX2RvdWJsZQBWEGcxbV9kb3VibGVBZmZpbmUAVQdnMW1fYWRkAFkMZzFtX2FkZE1peGVkAFgNZzFtX2FkZEFmZmluZQBXB2cxbV9uZWcAWw1nMW1fbmVnQWZmaW5lAFoHZzFtX3N1YgBeDGcxbV9zdWJNaXhlZABdDWcxbV9zdWJBZmZpbmUAXBJnMW1fZnJvbU1vbnRnb21lcnkAYBhnMW1fZnJvbU1vbnRnb21lcnlBZmZpbmUAXxBnMW1fdG9Nb250Z29tZXJ5AGIWZzFtX3RvTW9udGdvbWVyeUFmZmluZQBhD2cxbV90aW1lc1NjYWxhcgB4FWcxbV90aW1lc1NjYWxhckFmZmluZQB5DWcxbV9ub3JtYWxpemUAZwpnMW1fTEVNdG9VAGkKZzFtX0xFTXRvQwBqCmcxbV9VdG9MRU0AawpnMW1fQ3RvTEVNAGwPZzFtX2JhdGNoTEVNdG9VAG0PZzFtX2JhdGNoTEVNdG9DAG4PZzFtX2JhdGNoVXRvTEVNAG8PZzFtX2JhdGNoQ3RvTEVNAHAMZzFtX3RvQWZmaW5lAGMOZzFtX3RvSmFjb2JpYW4AURFnMW1fYmF0Y2hUb0FmZmluZQBmE2cxbV9iYXRjaFRvSmFjb2JpYW4AcQtnMW1faW5DdXJ2ZQBlEWcxbV9pbkN1cnZlQWZmaW5lAGQXZnJtX19yZXZlcnNlUGVybXV0YXRpb24Aegdmcm1fZmZ0AH0IZnJtX2lmZnQAfgpmcm1fcmF3ZmZ0AHsLZnJtX2ZmdEpvaW4Afw5mcm1fZmZ0Sm9pbkV4dACAARFmcm1fZmZ0Sm9pbkV4dEludgCBAQpmcm1fZmZ0TWl4AIIBDGZybV9mZnRGaW5hbACDAR1mcm1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgCEAQhwb2xfemVybwCFAQ9wb2xfY29uc3RydWN0TEMAhgEMcWFwX2J1aWxkQUJDAIcBC3FhcF9qb2luQUJDAIgBDHFhcF9iYXRjaEFkZACJAQpmMm1faXNaZXJvAEsJZjJtX2lzT25lAIoBCGYybV96ZXJvAE0HZjJtX29uZQCLAQhmMm1fY29weQCMAQdmMm1fbXVsAI0BCGYybV9tdWwxAI4BCmYybV9zcXVhcmUAjwEHZjJtX2FkZACQAQdmMm1fc3ViAJEBB2YybV9uZWcAkgEIZjJtX3NpZ24AlQENZjJtX2Nvbmp1Z2F0ZQBaEmYybV9mcm9tTW9udGdvbWVyeQBfEGYybV90b01vbnRnb21lcnkAYQZmMm1fZXEAUgtmMm1faW52ZXJzZQCTAQdmMm1fZXhwAJgBD2YybV90aW1lc1NjYWxhcgCUARBmMm1fYmF0Y2hJbnZlcnNlAJcBCGYybV9zcXJ0AJkBDGYybV9pc1NxdWFyZQCaAQ5mMm1faXNOZWdhdGl2ZQCWAQxnMm1fbXVsdGlleHAAwgESZzJtX211bHRpZXhwX2NodW5rAMEBEmcybV9tdWx0aWV4cEFmZmluZQDEARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsAwwEKZzJtX2lzWmVybwCcARBnMm1faXNaZXJvQWZmaW5lAJsBBmcybV9lcQCkAQtnMm1fZXFNaXhlZACjAQxnMm1fZXFBZmZpbmUAogEIZzJtX2NvcHkAoAEOZzJtX2NvcHlBZmZpbmUAnwEIZzJtX3plcm8AngEOZzJtX3plcm9BZmZpbmUAnQEKZzJtX2RvdWJsZQCmARBnMm1fZG91YmxlQWZmaW5lAKUBB2cybV9hZGQAqQEMZzJtX2FkZE1peGVkAKgBDWcybV9hZGRBZmZpbmUApwEHZzJtX25lZwCrAQ1nMm1fbmVnQWZmaW5lAKoBB2cybV9zdWIArgEMZzJtX3N1Yk1peGVkAK0BDWcybV9zdWJBZmZpbmUArAESZzJtX2Zyb21Nb250Z29tZXJ5ALABGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQCvARBnMm1fdG9Nb250Z29tZXJ5ALIBFmcybV90b01vbnRnb21lcnlBZmZpbmUAsQEPZzJtX3RpbWVzU2NhbGFyAMUBFWcybV90aW1lc1NjYWxhckFmZmluZQDGAQ1nMm1fbm9ybWFsaXplALcBCmcybV9MRU10b1UAuAEKZzJtX0xFTXRvQwC5AQpnMm1fVXRvTEVNALoBCmcybV9DdG9MRU0AuwEPZzJtX2JhdGNoTEVNdG9VALwBD2cybV9iYXRjaExFTXRvQwC9AQ9nMm1fYmF0Y2hVdG9MRU0AvgEPZzJtX2JhdGNoQ3RvTEVNAL8BDGcybV90b0FmZmluZQCzAQ5nMm1fdG9KYWNvYmlhbgChARFnMm1fYmF0Y2hUb0FmZmluZQC2ARNnMm1fYmF0Y2hUb0phY29iaWFuAMABC2cybV9pbkN1cnZlALUBEWcybV9pbkN1cnZlQWZmaW5lALQBC2cxbV90aW1lc0ZyAMcBF2cxbV9fcmV2ZXJzZVBlcm11dGF0aW9uAMgBB2cxbV9mZnQAygEIZzFtX2lmZnQAywEKZzFtX3Jhd2ZmdADJAQtnMW1fZmZ0Sm9pbgDMAQ5nMW1fZmZ0Sm9pbkV4dADNARFnMW1fZmZ0Sm9pbkV4dEludgDOAQpnMW1fZmZ0TWl4AM8BDGcxbV9mZnRGaW5hbADQAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDRAQtnMm1fdGltZXNGcgDSARdnMm1fX3JldmVyc2VQZXJtdXRhdGlvbgDTAQdnMm1fZmZ0ANUBCGcybV9pZmZ0ANYBCmcybV9yYXdmZnQA1AELZzJtX2ZmdEpvaW4A1wEOZzJtX2ZmdEpvaW5FeHQA2AERZzJtX2ZmdEpvaW5FeHRJbnYA2QEKZzJtX2ZmdE1peADaAQxnMm1fZmZ0RmluYWwA2wEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A3AERZzFtX3RpbWVzRnJBZmZpbmUA3QERZzJtX3RpbWVzRnJBZmZpbmUA3gERZnJtX2JhdGNoQXBwbHlLZXkA3wERZzFtX2JhdGNoQXBwbHlLZXkA4AEWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZADhARFnMm1fYmF0Y2hBcHBseUtleQDiARZnMm1fYmF0Y2hBcHBseUtleU1peGVkAOMBCmY2bV9pc1plcm8A5QEJZjZtX2lzT25lAOYBCGY2bV96ZXJvAOcBB2Y2bV9vbmUA6AEIZjZtX2NvcHkA6QEHZjZtX211bADqAQpmNm1fc3F1YXJlAOsBB2Y2bV9hZGQA7AEHZjZtX3N1YgDtAQdmNm1fbmVnAO4BCGY2bV9zaWduAO8BEmY2bV9mcm9tTW9udGdvbWVyeQCwARBmNm1fdG9Nb250Z29tZXJ5ALIBBmY2bV9lcQDwAQtmNm1faW52ZXJzZQDxAQdmNm1fZXhwAPUBD2Y2bV90aW1lc1NjYWxhcgDyARBmNm1fYmF0Y2hJbnZlcnNlAPQBDmY2bV9pc05lZ2F0aXZlAPMBCmZ0bV9pc1plcm8A9wEJZnRtX2lzT25lAPgBCGZ0bV96ZXJvAPkBB2Z0bV9vbmUA+gEIZnRtX2NvcHkA+wEHZnRtX211bAD8AQhmdG1fbXVsMQD9AQpmdG1fc3F1YXJlAP4BB2Z0bV9hZGQA/wEHZnRtX3N1YgCAAgdmdG1fbmVnAIECCGZ0bV9zaWduAIgCDWZ0bV9jb25qdWdhdGUAggISZnRtX2Zyb21Nb250Z29tZXJ5AIQCEGZ0bV90b01vbnRnb21lcnkAgwIGZnRtX2VxAIUCC2Z0bV9pbnZlcnNlAIYCB2Z0bV9leHAAiwIPZnRtX3RpbWVzU2NhbGFyAIcCEGZ0bV9iYXRjaEludmVyc2UAigIIZnRtX3NxcnQAjAIMZnRtX2lzU3F1YXJlAI0CDmZ0bV9pc05lZ2F0aXZlAIkCEWZ0bV9mcm9iZW5pdXNNYXAwAJICEWZ0bV9mcm9iZW5pdXNNYXAxAJMCEWZ0bV9mcm9iZW5pdXNNYXAyAJQCEWZ0bV9mcm9iZW5pdXNNYXAzAJUCEWZ0bV9mcm9iZW5pdXNNYXA0AJYCEWZ0bV9mcm9iZW5pdXNNYXA1AJcCEWZ0bV9mcm9iZW5pdXNNYXA2AJgCEWZ0bV9mcm9iZW5pdXNNYXA3AJkCEWZ0bV9mcm9iZW5pdXNNYXA4AJoCEWZ0bV9mcm9iZW5pdXNNYXA5AJsCE2JsczEyMzgxX3BhaXJpbmdFcTEApwITYmxzMTIzODFfcGFpcmluZ0VxMgCoAhNibHMxMjM4MV9wYWlyaW5nRXEzAKkCE2JsczEyMzgxX3BhaXJpbmdFcTQAqgITYmxzMTIzODFfcGFpcmluZ0VxNQCrAhBibHMxMjM4MV9wYWlyaW5nAKwCEmJsczEyMzgxX3ByZXBhcmVHMQCgAhJibHMxMjM4MV9wcmVwYXJlRzIAoQITYmxzMTIzODFfbWlsbGVyTG9vcACiAhxibHMxMjM4MV9maW5hbEV4cG9uZW50aWF0aW9uAKYCH2JsczEyMzgxX2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAowIaYmxzMTIzODFfX2N5Y2xvdG9taWNTcXVhcmUApAIaYmxzMTIzODFfX2N5Y2xvdG9taWNFeHBfdzAApQIIZjZtX211bDEAjgIJZjZtX211bDAxAI8CCmZ0bV9tdWwwMTQAkAIRZzFtX2luR3JvdXBBZmZpbmUAnAILZzFtX2luR3JvdXAAnQIRZzJtX2luR3JvdXBBZmZpbmUAngILZzJtX2luR3JvdXAAnwIK7dgErQI+ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKAssACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtEACAAKQMoUAR+IAApAyBQBH4gACkDGFAEfiAAKQMQUAR+IAApAwhQBH4gACkDAAVCAQsFQgELBUIBCwVCAQsFQgELUAssACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtiACAAKQMoIAEpAyhRBH8gACkDICABKQMgUQR/IAApAxggASkDGFEEfyAAKQMQIAEpAxBRBH8gACkDCCABKQMIUQR/IAApAwAgASkDAFEFQQALBUEACwVBAAsFQQALBUEACwu3AQAgACkDKCABKQMoVAR/QQAFIAApAyggASkDKFYEf0EBBSAAKQMgIAEpAyBUBH9BAAUgACkDICABKQMgVgR/QQEFIAApAxggASkDGFQEf0EABSAAKQMYIAEpAxhWBH9BAQUgACkDECABKQMQVAR/QQAFIAApAxAgASkDEFYEf0EBBSAAKQMIIAEpAwhUBH9BAAUgACkDCCABKQMIVgR/QQEFIAApAwAgASkDAFoLCwsLCwsLCwsLC6QCAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIAIgADUCICABNQIgfCADQiCIfCIDPgIgIAIgADUCJCABNQIkfCADQiCIfCIDPgIkIAIgADUCKCABNQIofCADQiCIfCIDPgIoIAIgADUCLCABNQIsfCADQiCIfCIDPgIsIANCIIinC/gCAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgAiAANQIgIAE1AiB9IANCIId8IgNC/////w+DPgIgIAIgADUCJCABNQIkfSADQiCHfCIDQv////8Pgz4CJCACIAA1AiggATUCKH0gA0Igh3wiA0L/////D4M+AiggAiAANQIsIAE1Aix9IANCIId8IgNC/////w+DPgIsIANCIIenC84fARl+IAQgADUCACIFIAE1AgAiBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIAIARCIIghAyADIAUgATUCBCIHfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgQiCCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgQgA0IgiCEEIAQgBSABNQIIIgl+IANC/////w+DfCIDQiCIfCEEIAQgByAIfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AggiCiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgggBEIgiCEDIAMgBSABNQIMIgt+IARC/////w+DfCIEQiCIfCEDIAMgCCAJfiAEQv////8Pg3wiBEIgiHwhAyADIAcgCn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIMIgwgBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIMIANCIIghBCAEIAUgATUCECINfiADQv////8Pg3wiA0IgiHwhBCAEIAggC34gA0L/////D4N8IgNCIIh8IQQgBCAJIAp+IANC/////w+DfCIDQiCIfCEEIAQgByAMfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhAiDiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhAgBEIgiCEDIAMgBSABNQIUIg9+IARC/////w+DfCIEQiCIfCEDIAMgCCANfiAEQv////8Pg3wiBEIgiHwhAyADIAogC34gBEL/////D4N8IgRCIIh8IQMgAyAJIAx+IARC/////w+DfCIEQiCIfCEDIAMgByAOfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhQiECAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhQgA0IgiCEEIAQgBSABNQIYIhF+IANC/////w+DfCIDQiCIfCEEIAQgCCAPfiADQv////8Pg3wiA0IgiHwhBCAEIAogDX4gA0L/////D4N8IgNCIIh8IQQgBCALIAx+IANC/////w+DfCIDQiCIfCEEIAQgCSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAcgEH4gA0L/////D4N8IgNCIIh8IQQgBCAANQIYIhIgBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIYIARCIIghAyADIAUgATUCHCITfiAEQv////8Pg3wiBEIgiHwhAyADIAggEX4gBEL/////D4N8IgRCIIh8IQMgAyAKIA9+IARC/////w+DfCIEQiCIfCEDIAMgDCANfiAEQv////8Pg3wiBEIgiHwhAyADIAsgDn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBB+IARC/////w+DfCIEQiCIfCEDIAMgByASfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhwiFCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhwgA0IgiCEEIAQgBSABNQIgIhV+IANC/////w+DfCIDQiCIfCEEIAQgCCATfiADQv////8Pg3wiA0IgiHwhBCAEIAogEX4gA0L/////D4N8IgNCIIh8IQQgBCAMIA9+IANC/////w+DfCIDQiCIfCEEIAQgDSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAsgEH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBJ+IANC/////w+DfCIDQiCIfCEEIAQgByAUfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AiAiFiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiAgBEIgiCEDIAMgBSABNQIkIhd+IARC/////w+DfCIEQiCIfCEDIAMgCCAVfiAEQv////8Pg3wiBEIgiHwhAyADIAogE34gBEL/////D4N8IgRCIIh8IQMgAyAMIBF+IARC/////w+DfCIEQiCIfCEDIAMgDiAPfiAEQv////8Pg3wiBEIgiHwhAyADIA0gEH4gBEL/////D4N8IgRCIIh8IQMgAyALIBJ+IARC/////w+DfCIEQiCIfCEDIAMgCSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAcgFn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIkIhggBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAUgATUCKCIZfiADQv////8Pg3wiA0IgiHwhBCAEIAggF34gA0L/////D4N8IgNCIIh8IQQgBCAKIBV+IANC/////w+DfCIDQiCIfCEEIAQgDCATfiADQv////8Pg3wiA0IgiHwhBCAEIA4gEX4gA0L/////D4N8IgNCIIh8IQQgBCAPIBB+IANC/////w+DfCIDQiCIfCEEIAQgDSASfiADQv////8Pg3wiA0IgiHwhBCAEIAsgFH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBZ+IANC/////w+DfCIDQiCIfCEEIAQgByAYfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AigiGiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiggBEIgiCEDIAMgBSABNQIsIht+IARC/////w+DfCIEQiCIfCEDIAMgCCAZfiAEQv////8Pg3wiBEIgiHwhAyADIAogF34gBEL/////D4N8IgRCIIh8IQMgAyAMIBV+IARC/////w+DfCIEQiCIfCEDIAMgDiATfiAEQv////8Pg3wiBEIgiHwhAyADIBAgEX4gBEL/////D4N8IgRCIIh8IQMgAyAPIBJ+IARC/////w+DfCIEQiCIfCEDIAMgDSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAsgFn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBh+IARC/////w+DfCIEQiCIfCEDIAMgByAafiAEQv////8Pg3wiBEIgiHwhAyADIAA1AiwiBSAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AiwgA0IgiCEEIAQgCCAbfiADQv////8Pg3wiA0IgiHwhBCAEIAogGX4gA0L/////D4N8IgNCIIh8IQQgBCAMIBd+IANC/////w+DfCIDQiCIfCEEIAQgDiAVfiADQv////8Pg3wiA0IgiHwhBCAEIBAgE34gA0L/////D4N8IgNCIIh8IQQgBCARIBJ+IANC/////w+DfCIDQiCIfCEEIAQgDyAUfiADQv////8Pg3wiA0IgiHwhBCAEIA0gFn4gA0L/////D4N8IgNCIIh8IQQgBCALIBh+IANC/////w+DfCIDQiCIfCEEIAQgCSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgB34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIAogG34gBEL/////D4N8IgRCIIh8IQMgAyAMIBl+IARC/////w+DfCIEQiCIfCEDIAMgDiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBAgFX4gBEL/////D4N8IgRCIIh8IQMgAyASIBN+IARC/////w+DfCIEQiCIfCEDIAMgESAUfiAEQv////8Pg3wiBEIgiHwhAyADIA8gFn4gBEL/////D4N8IgRCIIh8IQMgAyANIBh+IARC/////w+DfCIEQiCIfCEDIAMgCyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI0IANCIIghBCAEIAwgG34gA0L/////D4N8IgNCIIh8IQQgBCAOIBl+IANC/////w+DfCIDQiCIfCEEIAQgECAXfiADQv////8Pg3wiA0IgiHwhBCAEIBIgFX4gA0L/////D4N8IgNCIIh8IQQgBCATIBR+IANC/////w+DfCIDQiCIfCEEIAQgESAWfiADQv////8Pg3wiA0IgiHwhBCAEIA8gGH4gA0L/////D4N8IgNCIIh8IQQgBCANIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSALfiADQv////8Pg3wiA0IgiHwhBCACIAM+AjggBEIgiCEDIAMgDiAbfiAEQv////8Pg3wiBEIgiHwhAyADIBAgGX4gBEL/////D4N8IgRCIIh8IQMgAyASIBd+IARC/////w+DfCIEQiCIfCEDIAMgFCAVfiAEQv////8Pg3wiBEIgiHwhAyADIBMgFn4gBEL/////D4N8IgRCIIh8IQMgAyARIBh+IARC/////w+DfCIEQiCIfCEDIAMgDyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgDX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI8IANCIIghBCAEIBAgG34gA0L/////D4N8IgNCIIh8IQQgBCASIBl+IANC/////w+DfCIDQiCIfCEEIAQgFCAXfiADQv////8Pg3wiA0IgiHwhBCAEIBUgFn4gA0L/////D4N8IgNCIIh8IQQgBCATIBh+IANC/////w+DfCIDQiCIfCEEIAQgESAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgJAIARCIIghAyADIBIgG34gBEL/////D4N8IgRCIIh8IQMgAyAUIBl+IARC/////w+DfCIEQiCIfCEDIAMgFiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBUgGH4gBEL/////D4N8IgRCIIh8IQMgAyATIBp+IARC/////w+DfCIEQiCIfCEDIAMgBSARfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AkQgA0IgiCEEIAQgFCAbfiADQv////8Pg3wiA0IgiHwhBCAEIBYgGX4gA0L/////D4N8IgNCIIh8IQQgBCAXIBh+IANC/////w+DfCIDQiCIfCEEIAQgFSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgE34gA0L/////D4N8IgNCIIh8IQQgAiADPgJIIARCIIghAyADIBYgG34gBEL/////D4N8IgRCIIh8IQMgAyAYIBl+IARC/////w+DfCIEQiCIfCEDIAMgFyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgFX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJMIANCIIghBCAEIBggG34gA0L/////D4N8IgNCIIh8IQQgBCAZIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSAXfiADQv////8Pg3wiA0IgiHwhBCACIAM+AlAgBEIgiCEDIAMgGiAbfiAEQv////8Pg3wiBEIgiHwhAyADIAUgGX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJUIANCIIghBCAEIAUgG34gA0L/////D4N8IgNCIIh8IQQgAiADPgJYIAIgBD4CXAu8GQEQfiADIAA1AgAiBiAGfiACQv////8Pg3wiAkIgiHwhAyABIAI+AgAgAyIEQiCIIQUgADUCBCIHIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CBCADIgRCIIghBSAANQIIIgggBn4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgByAHfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CCCADIgRCIIghBSAANQIMIgkgBn4iAkIgiCEDIAMgByAIfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CDCADIgRCIIghBSAANQIQIgogBn4iAkIgiCEDIAMgByAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAggCH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhAgAyIEQiCIIQUgADUCFCILIAZ+IgJCIIghAyADIAcgCn4gAkL/////D4N8IgJCIIh8IQMgAyAIIAl+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIUIAMiBEIgiCEFIAA1AhgiDCAGfiICQiCIIQMgAyAHIAt+IAJC/////w+DfCICQiCIfCEDIAMgCCAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAkgCX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhggAyIEQiCIIQUgADUCHCINIAZ+IgJCIIghAyADIAcgDH4gAkL/////D4N8IgJCIIh8IQMgAyAIIAt+IAJC/////w+DfCICQiCIfCEDIAMgCSAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CHCADIgRCIIghBSAANQIgIg4gBn4iAkIgiCEDIAMgByANfiACQv////8Pg3wiAkIgiHwhAyADIAggDH4gAkL/////D4N8IgJCIIh8IQMgAyAJIAt+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCiAKfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CICADIgRCIIghBSAANQIkIg8gBn4iAkIgiCEDIAMgByAOfiACQv////8Pg3wiAkIgiHwhAyADIAggDX4gAkL/////D4N8IgJCIIh8IQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAANQIoIhAgBn4iAkIgiCEDIAMgByAPfiACQv////8Pg3wiAkIgiHwhAyADIAggDn4gAkL/////D4N8IgJCIIh8IQMgAyAJIA1+IAJC/////w+DfCICQiCIfCEDIAMgCiAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAsgC34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiggAyIEQiCIIQUgADUCLCIRIAZ+IgJCIIghAyADIAcgEH4gAkL/////D4N8IgJCIIh8IQMgAyAIIA9+IAJC/////w+DfCICQiCIfCEDIAMgCSAOfiACQv////8Pg3wiAkIgiHwhAyADIAogDX4gAkL/////D4N8IgJCIIh8IQMgAyALIAx+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIsIAMiBEIgiCEFIAcgEX4iAkIgiCEDIAMgCCAQfiACQv////8Pg3wiAkIgiHwhAyADIAkgD34gAkL/////D4N8IgJCIIh8IQMgAyAKIA5+IAJC/////w+DfCICQiCIfCEDIAMgCyANfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgCCARfiICQiCIIQMgAyAJIBB+IAJC/////w+DfCICQiCIfCEDIAMgCiAPfiACQv////8Pg3wiAkIgiHwhAyADIAsgDn4gAkL/////D4N8IgJCIIh8IQMgAyAMIA1+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI0IAMiBEIgiCEFIAkgEX4iAkIgiCEDIAMgCiAQfiACQv////8Pg3wiAkIgiHwhAyADIAsgD34gAkL/////D4N8IgJCIIh8IQMgAyAMIA5+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDSANfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4COCADIgRCIIghBSAKIBF+IgJCIIghAyADIAsgEH4gAkL/////D4N8IgJCIIh8IQMgAyAMIA9+IAJC/////w+DfCICQiCIfCEDIAMgDSAOfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CPCADIgRCIIghBSALIBF+IgJCIIghAyADIAwgEH4gAkL/////D4N8IgJCIIh8IQMgAyANIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDiAOfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CQCADIgRCIIghBSAMIBF+IgJCIIghAyADIA0gEH4gAkL/////D4N8IgJCIIh8IQMgAyAOIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJEIAMiBEIgiCEFIA0gEX4iAkIgiCEDIAMgDiAQfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIA8gD34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AkggAyIEQiCIIQUgDiARfiICQiCIIQMgAyAPIBB+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJMIAMiBEIgiCEFIA8gEX4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgECAQfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CUCADIgRCIIghBSAQIBF+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CVCADIgRCIIghBUIAIQJCACEDIAMgESARfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CWCABIAM+AlwLCgAgACAAIAEQCAtBACAAIAA1AAAgAXwiAT4AACABQiCIIQEDQCABUEUEQCAAQQRqIgA1AAAgAXwhASAAIAE+AAAgAUIgiCEBDAELCwuEBAIDfgF/IAAgA0GIASADGyIDEAAgAUEoEAAgAkHYACACGyIHEAFBuAEQAUEvIQBBLyEBA0AgAUEoai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBJWo1AABCAXwiBkIBUQRAQgBCAIAaCwNAAkADQCAAIANqLQAAIABBB0ZyRQRAIABBAWshAAwBCwsgACADakEHaykAACAGgCEFIAAgAWtBBGshAgNAIAVCgICAgHCDUCACQQBOcUUEQCAFQgiIIQUgAkEBaiECDAELCyAFUARAIANBKBAFRQ0BQgEhBUEAIQILQegBQSg1AAAgBX4iBD4AAEHsAUEsNQAAIAV+IARCIIh8IgQ+AABB8AFBMDUAACAFfiAEQiCIfCIEPgAAQfQBQTQ1AAAgBX4gBEIgiHwiBD4AAEH4AUE4NQAAIAV+IARCIIh8IgQ+AABB/AFBPDUAACAFfiAEQiCIfCIEPgAAQYACQcAANQAAIAV+IARCIIh8IgQ+AABBhAJBxAA1AAAgBX4gBEIgiHwiBD4AAEGIAkHIADUAACAFfiAEQiCIfCIEPgAAQYwCQcwANQAAIAV+IARCIIh8IgQ+AABBkAJB0AA1AAAgBX4gBEIgiHwiBD4AAEGUAkHUADUAACAFfiAEQiCIfD4AACADQegBIAJrIAMQBxogAiAHaiAFEAsMAQsLC44CAQp/QZgCIQNBmAIQAUHIAiEIIAFByAIQAEH4AiEJQfgCEANBqAMhBiAAQagDEABB2AMhC0GIBCEKQZgFIQQDQCAGEAJFBEAgCCAGIAsgChAMIAsgCUG4BBAIIAcEfyAFBH9BuAQgAxAFBH9BuAQgAyAEEAcaQQAFIANBuAQgBBAHGkEBCwVBuAQgAyAEEAYaQQELBSAFBH9BuAQgAyAEEAYaQQAFIANBuAQQBQR/IANBuAQgBBAHGkEABUG4BCADIAQQBxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACEAcaBSADIAIQAAsLCQAgAEGoBhAECywAIAAgASACEAYEQCACQcgFIAIQBxoFIAJByAUQBQRAIAJByAUgAhAHGgsLCxcAIAAgASACEAcEQCACQcgFIAIQBhoLCwsAQdgGIAAgARAQC8YhAQN+IAAgADUCAEL9//P/DyIEIAA1AgB+Qv////8PgyIDQcgFNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBzAU1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QdAFNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEHUBTUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB2AU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdwFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHgBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB5AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QegFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHsBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB8AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfQFNQIAIAN+fCICPgIsQfgIIAJCIIg+AgAgACAANQIEIAA1AgQgBH5C/////w+DIgNByAU1AgB+fCICPgIEIAAgADUCCCACQiCIfEHMBTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB0AU1AgAgA358IgI+AgwgACAANQIQIAJCIIh8QdQFNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEHYBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB3AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QeAFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHkBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB6AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QewFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHwBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB9AU1AgAgA358IgI+AjBB/AggAkIgiD4CACAAIAA1AgggADUCCCAEfkL/////D4MiA0HIBTUCAH58IgI+AgggACAANQIMIAJCIIh8QcwFNQIAIAN+fCICPgIMIAAgADUCECACQiCIfEHQBTUCACADfnwiAj4CECAAIAA1AhQgAkIgiHxB1AU1AgAgA358IgI+AhQgACAANQIYIAJCIIh8QdgFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHcBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB4AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QeQFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHoBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB7AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QfAFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEH0BTUCACADfnwiAj4CNEGACSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQcgFNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBzAU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdAFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHUBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB2AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QdwFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHgBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB5AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QegFNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEHsBTUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxB8AU1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QfQFNQIAIAN+fCICPgI4QYQJIAJCIIg+AgAgACAANQIQIAA1AhAgBH5C/////w+DIgNByAU1AgB+fCICPgIQIAAgADUCFCACQiCIfEHMBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB0AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QdQFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHYBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB3AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QeAFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHkBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB6AU1AgAgA358IgI+AjAgACAANQI0IAJCIIh8QewFNQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEHwBTUCACADfnwiAj4COCAAIAA1AjwgAkIgiHxB9AU1AgAgA358IgI+AjxBiAkgAkIgiD4CACAAIAA1AhQgADUCFCAEfkL/////D4MiA0HIBTUCAH58IgI+AhQgACAANQIYIAJCIIh8QcwFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHQBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB1AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QdgFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHcBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB4AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QeQFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHoBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB7AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QfAFNQIAIAN+fCICPgI8IAAgADUC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AlRBoAkgAkIgiD4CACAAIAA1AiwgADUCLCAEfkL/////D4MiA0HIBTUCAH58IgI+AiwgACAANQIwIAJCIIh8QcwFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHQBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB1AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QdgFNQIAIAN+fCICPgI8IAAgADUCQCACQiCIfEHcBTUCACADfnwiAj4CQCAAIAA1AkQgAkIgiHxB4AU1AgAgA358IgI+AkQgACAANQJIIAJCIIh8QeQFNQIAIAN+fCICPgJIIAAgADUCTCACQiCIfEHoBTUCACADfnwiAj4CTCAAIAA1AlAgAkIgiHxB7AU1AgAgA358IgI+AlAgACAANQJUIAJCIIh8QfAFNQIAIAN+fCICPgJUIAAgADUCWCACQiCIfEH0BTUCACADfnwiAj4CWEGkCSACQiCIPgIAQfgIIABBMGogARAPC/Q+ARt+IAUgATUCACIEIAA1AgAiEn58IgNC/////w+DIQUgBiAANQIEIhMgBH58IANCIIh8IgNC/////w+DIQYgByAANQIIIhQgBH58IANCIIh8IgNC/////w+DIQcgCCAANQIMIhUgBH58IANCIIh8IgNC/////w+DIQggCSAANQIQIhYgBH58IANCIIh8IgNC/////w+DIQkgCiAANQIUIhcgBH58IANCIIh8IgNC/////w+DIQogCyAANQIYIhggBH58IANCIIh8IgNC/////w+DIQsgDCAANQIcIhkgBH58IANCIIh8IgNC/////w+DIQwgDSAANQIgIhogBH58IANCIIh8IgNC/////w+DIQ0gDiAANQIkIhsgBH58IANCIIh8IgNC/////w+DIQ4gDyAANQIoIhwgBH58IANCIIh8IgNC/////w+DIQ8gECAANQIsIh0gBH58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCBCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AggiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIMIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCECIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AhQiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIYIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCHCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiAiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIkIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCKCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiwiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgAiAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DPgIAIAIgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4M+AgQgAiAIIARC/v+v9QF+fCADQiCIfCIDQv////8Pgz4CCCACIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DPgIMIAIgCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4M+AhAgAiALIARCv6WUnA9+fCADQiCIfCIDQv////8Pgz4CFCACIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DPgIYIAIgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4M+AhwgAiAOIARCts/u2AR+fCADQiCIfCIDQv////8Pgz4CICACIA8gBEKazf/LA358IANCIIh8IgNC/////w+DPgIkIAIgECAEQuqjhNABfnwgA0IgiHwiA0L/////D4M+AiggAiARIANCIIh8PgIsIAJByAUQBQRAIAJByAUgAhAHGgsLiEABG34gCiAANQIAIhEgEX58IgJC/////w+DIQogECAANQIEIhMgEX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIRAgA0IgiEIBhiACQiCIfCAPIAA1AggiFCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIAA1AgwiFSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIAA1AhAiFiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ0gA0IgiEIBhiACQiCIfCAMIAA1AhQiFyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AhgiGCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIAA1AhwiGSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAIIAA1AiAiGiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIAA1AiQiGyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AigiHCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIBEgADUCLCIRfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIBIgAkIgiHwhEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIBAgEyATfnwiAkL/////D4MhECAPIBMgFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIBMgFX4iA0L/////D4NCAYZ8fCICQv////8PgyEOIANCIIhCAYYgAkIgiHwgDSATIBZ+IgNC/////w+DQgGGfHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgEyAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBMgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSATIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggEyAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBMgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiATIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA8gFCAUfnwiAkL/////D4MhDyAOIBQgFX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIBQgFn4iA0L/////D4NCAYZ8fCICQv////8PgyENIANCIIhCAYYgAkIgiHwgDCAUIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhDCADQiCIQgGGIAJCIIh8IAsgFCAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBQgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAUIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFCAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBQgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgDiAVIBV+fCICQv////8PgyEOIA0gFSAWfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgFSAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBUgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAVIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFSAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBUgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAVIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAVfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA0gFiAWfnwiAkL/////D4MhDSAMIBYgF34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBYgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAWIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFiAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBYgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAWIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAWfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAwgFyAXfnwiAkL/////D4MhDCALIBcgGH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBcgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAXIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFyAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBcgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgCyAYIBh+fCICQv////8PgyELIAkgGCAZfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggGCAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBggG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAYIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAkgGSAZfnwiAkL/////D4MhCSAIIBkgGn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBkgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAZIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAZfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAggGiAafnwiAkL/////D4MhCCAHIBogG34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBogHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgByAbIBt+fCICQv////8PgyEHIAYgGyAcfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAYgHCAcfnwiAkL/////D4MhBiAEIBEgHH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAQgESARfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCESIAEgCiAKQv3/8/8PfkL/////D4MiA0Kr1f7/D358QiCIIBAgA0L///vPC358fCICQv////8Pgz4CACABIA8gA0L//8+KC358IAJCIIh8IgJC/////w+DPgIEIAEgDiADQv7/r/UBfnwgAkIgiHwiAkL/////D4M+AgggASANIANCpOzDtQ9+fCACQiCIfCICQv////8Pgz4CDCABIAwgA0KgpcO5Bn58IAJCIIh8IgJC/////w+DPgIQIAEgCyADQr+llJwPfnwgAkIgiHwiAkL/////D4M+AhQgASAJIANChJfdowZ+fCACQiCIfCICQv////8Pgz4CGCABIAggA0LX2a6aBH58IAJCIIh8IgJC/////w+DPgIcIAEgByADQrbP7tgEfnwgAkIgiHwiAkL/////D4M+AiAgASAGIANCms3/ywN+fCACQiCIfCICQv////8Pgz4CJCABIAQgA0Lqo4TQAX58IAJCIIh8IgJC/////w+DPgIoIAEgBSACQiCIfCICQv////8Pgz4CLCASIAJCIIh8pwRAIAFByAUgARAHGgUgAUHIBRAFBEAgAUHIBSABEAcaCwsLCgAgACAAIAEQEwsLACAAQfgFIAEQEwsVACAAQfgREABBqBIQAUH4ESABEBILEQAgAEHYEhAXQdgSQbgHEAULIwAgABACBEBBAA8LIABBiBMQF0GIE0G4BxAFBEBBfw8LQQELFwAgACABEBcgAUHIBSABEA0gASABEBYLCQBBqAYgABAAC7wBAQJ/IAIQAUEwIQMDQCABIANPBEAgA0EwRgRAQbgTEBsFQbgTQfgFQbgTEBMLIABBuBNB6BMQEyACQegTIAIQDyAAQTBqIQAgA0EwaiEDDAELCyABQTBwIgRFBEAPC0HoExABQQAhAQNAIAEgBEZFBEAgASAALQAAOgDoEyAAQQFqIQAgAUEBaiEBDAELCyADQTBGBEBBuBMQGwVBuBNB+AVBuBMQEwtB6BNBuBNB6BMQEyACQegTIAIQDwscACABIAJBmBQQHEGYFEGYFBAWIABBmBQgAxATC+EBAQJ/QQBBACgCACIFIAJBAWpBMGxqNgIAIAUQGyAFQTBqIQUDQCACIAZHBEAgABACBEAgBUEwayAFEAAFIAAgBUEwayAFEBMLIAAgAWohACAFQTBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBMGsiBSAFEBoDQCAGBEAgABACBEAgBSAFQTBrEAAgAhABBSAFQTBrQcgUEAAgBSAAIAVBMGsQEyAFQcgUIAIQEwsgACABayEAIAIgBGshAiAFQTBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEBYgAEEwaiEAIAJBMGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhAXIABBMGohACACQTBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADEBsPCyAAQfgUEAAgAxAbA0AgAkEBayICIAFqLQAAIQAgAyADEBQgAEGAAU8EQCADQfgUIAMQEyAAQYABayEACyADIAMQFCAAQcAATwRAIANB+BQgAxATIABBQGohAAsgAyADEBQgAEEgTwRAIANB+BQgAxATIABBIGshAAsgAyADEBQgAEEQTwRAIANB+BQgAxATIABBEGshAAsgAyADEBQgAEEITwRAIANB+BQgAxATIABBCGshAAsgAyADEBQgAEEETwRAIANB+BQgAxATIABBBGshAAsgAyADEBQgAEECTwRAIANB+BQgAxATIABBAmshAAsgAyADEBQgAARAIANB+BQgAxATCyACDQALC9UBAQF/IAAQAgRAIAEQAQ8LQQEhAkGYCEGoFRAAIABB6AdBMEHYFRAhIABByAhBMEGIFhAhA0BB2BVBqAYQBEUEQEHYFUG4FhAUQQEhAANAQbgWQagGEARFBEBBuBZBuBYQFCAAQQFqIQAMAQsLQagVQegWEAAgAiAAa0EBayECA0AgAgRAQegWQegWEBQgAkEBayECDAELCyAAIQJB6BZBqBUQFEHYFUGoFUHYFRATQYgWQegWQYgWEBMMAQsLQYgWEBgEQEGIFiABEBEFQYgWIAEQAAsLIAAgABACBEBBAQ8LIABBiAdBMEGYFxAhQZgXQagGEAQLKgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYCx4AIABCADcDACAAQgA3AwggAEIANwMQIABCADcDGAssACAAKQMYUAR+IAApAxBQBH4gACkDCFAEfiAAKQMABUIBCwVCAQsFQgELUAseACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxgLQAAgACkDGCABKQMYUQR/IAApAxAgASkDEFEEfyAAKQMIIAEpAwhRBH8gACkDACABKQMAUQVBAAsFQQALBUEACwtzACAAKQMYIAEpAxhUBH9BAAUgACkDGCABKQMYVgR/QQEFIAApAxAgASkDEFQEf0EABSAAKQMQIAEpAxBWBH9BAQUgACkDCCABKQMIVAR/QQAFIAApAwggASkDCFYEf0EBBSAAKQMAIAEpAwBaCwsLCwsLC8QBAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIANCIIinC/wBAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgA0Igh6cL5g4BEX4gBCAANQIAIgUgATUCACIGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgAgBEIgiCEDIAMgBSABNQIEIgd+IARC/////w+DfCIEQiCIfCEDIAMgADUCBCIIIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CBCADQiCIIQQgBCAFIAE1AggiCX4gA0L/////D4N8IgNCIIh8IQQgBCAHIAh+IANC/////w+DfCIDQiCIfCEEIAQgADUCCCIKIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CCCAEQiCIIQMgAyAFIAE1AgwiC34gBEL/////D4N8IgRCIIh8IQMgAyAIIAl+IARC/////w+DfCIEQiCIfCEDIAMgByAKfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgwiDCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgwgA0IgiCEEIAQgBSABNQIQIg1+IANC/////w+DfCIDQiCIfCEEIAQgCCALfiADQv////8Pg3wiA0IgiHwhBCAEIAkgCn4gA0L/////D4N8IgNCIIh8IQQgBCAHIAx+IANC/////w+DfCIDQiCIfCEEIAQgADUCECIOIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CECAEQiCIIQMgAyAFIAE1AhQiD34gBEL/////D4N8IgRCIIh8IQMgAyAIIA1+IARC/////w+DfCIEQiCIfCEDIAMgCiALfiAEQv////8Pg3wiBEIgiHwhAyADIAkgDH4gBEL/////D4N8IgRCIIh8IQMgAyAHIA5+IARC/////w+DfCIEQiCIfCEDIAMgADUCFCIQIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CFCADQiCIIQQgBCAFIAE1AhgiEX4gA0L/////D4N8IgNCIIh8IQQgBCAIIA9+IANC/////w+DfCIDQiCIfCEEIAQgCiANfiADQv////8Pg3wiA0IgiHwhBCAEIAsgDH4gA0L/////D4N8IgNCIIh8IQQgBCAJIA5+IANC/////w+DfCIDQiCIfCEEIAQgByAQfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhgiEiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhggBEIgiCEDIAMgBSABNQIcIhN+IARC/////w+DfCIEQiCIfCEDIAMgCCARfiAEQv////8Pg3wiBEIgiHwhAyADIAogD34gBEL/////D4N8IgRCIIh8IQMgAyAMIA1+IARC/////w+DfCIEQiCIfCEDIAMgCyAOfiAEQv////8Pg3wiBEIgiHwhAyADIAkgEH4gBEL/////D4N8IgRCIIh8IQMgAyAHIBJ+IARC/////w+DfCIEQiCIfCEDIAMgADUCHCIFIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CHCADQiCIIQQgBCAIIBN+IANC/////w+DfCIDQiCIfCEEIAQgCiARfiADQv////8Pg3wiA0IgiHwhBCAEIAwgD34gA0L/////D4N8IgNCIIh8IQQgBCANIA5+IANC/////w+DfCIDQiCIfCEEIAQgCyAQfiADQv////8Pg3wiA0IgiHwhBCAEIAkgEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAd+IANC/////w+DfCIDQiCIfCEEIAIgAz4CICAEQiCIIQMgAyAKIBN+IARC/////w+DfCIEQiCIfCEDIAMgDCARfiAEQv////8Pg3wiBEIgiHwhAyADIA4gD34gBEL/////D4N8IgRCIIh8IQMgAyANIBB+IARC/////w+DfCIEQiCIfCEDIAMgCyASfiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAwgE34gA0L/////D4N8IgNCIIh8IQQgBCAOIBF+IANC/////w+DfCIDQiCIfCEEIAQgDyAQfiADQv////8Pg3wiA0IgiHwhBCAEIA0gEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAt+IANC/////w+DfCIDQiCIfCEEIAIgAz4CKCAEQiCIIQMgAyAOIBN+IARC/////w+DfCIEQiCIfCEDIAMgECARfiAEQv////8Pg3wiBEIgiHwhAyADIA8gEn4gBEL/////D4N8IgRCIIh8IQMgAyAFIA1+IARC/////w+DfCIEQiCIfCEDIAIgBD4CLCADQiCIIQQgBCAQIBN+IANC/////w+DfCIDQiCIfCEEIAQgESASfiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIBIgE34gBEL/////D4N8IgRCIIh8IQMgAyAFIBF+IARC/////w+DfCIEQiCIfCEDIAIgBD4CNCADQiCIIQQgBCAFIBN+IANC/////w+DfCIDQiCIfCEEIAIgAz4COCACIAQ+AjwLzg0BDH4gAyAANQIAIgYgBn4gAkL/////D4N8IgJCIIh8IQMgASACPgIAIAMiBEIgiCEFIAA1AgQiByAGfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgQgAyIEQiCIIQUgADUCCCIIIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAcgB34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgggAyIEQiCIIQUgADUCDCIJIAZ+IgJCIIghAyADIAcgCH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgwgAyIEQiCIIQUgADUCECIKIAZ+IgJCIIghAyADIAcgCX4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAIIAh+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIQIAMiBEIgiCEFIAA1AhQiCyAGfiICQiCIIQMgAyAHIAp+IAJC/////w+DfCICQiCIfCEDIAMgCCAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CFCADIgRCIIghBSAANQIYIgwgBn4iAkIgiCEDIAMgByALfiACQv////8Pg3wiAkIgiHwhAyADIAggCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAJIAl+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIYIAMiBEIgiCEFIAA1AhwiDSAGfiICQiCIIQMgAyAHIAx+IAJC/////w+DfCICQiCIfCEDIAMgCCALfiACQv////8Pg3wiAkIgiHwhAyADIAkgCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhwgAyIEQiCIIQUgByANfiICQiCIIQMgAyAIIAx+IAJC/////w+DfCICQiCIfCEDIAMgCSALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAogCn4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiAgAyIEQiCIIQUgCCANfiICQiCIIQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAJIA1+IgJCIIghAyADIAogDH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyALIAt+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIoIAMiBEIgiCEFIAogDX4iAkIgiCEDIAMgCyAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CLCADIgRCIIghBSALIA1+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgDCANfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjQgAyIEQiCIIQVCACECQgAhAyADIA0gDX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjggASADPgI8CwoAIAAgACABECwLsgMCA34BfyAAIANBiBggAxsiAxAkIAFByBcQJCACQegXIAIbIgcQJUGoGBAlQR8hAEEfIQEDQCABQcgXai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBxRdqNQAAQgF8IgZCAVEEQEIAQgCAGgsDQAJAA0AgACADai0AACAAQQdGckUEQCAAQQFrIQAMAQsLIAAgA2pBB2spAAAgBoAhBCAAIAFrQQRrIQIDQCAEQoCAgIBwg1AgAkEATnFFBEAgBEIIiCEEIAJBAWohAgwBCwsgBFAEQCADQcgXEClFDQFCASEEQQAhAgtByBhByBc1AAAgBH4iBT4AAEHMGEHMFzUAACAEfiAFQiCIfCIFPgAAQdAYQdAXNQAAIAR+IAVCIIh8IgU+AABB1BhB1Bc1AAAgBH4gBUIgiHwiBT4AAEHYGEHYFzUAACAEfiAFQiCIfCIFPgAAQdwYQdwXNQAAIAR+IAVCIIh8IgU+AABB4BhB4Bc1AAAgBH4gBUIgiHwiBT4AAEHkGEHkFzUAACAEfiAFQiCIfD4AACADQcgYIAJrIAMQKxogAiAHaiAEEAsMAQsLC44CAQp/QegYIQNB6BgQJUGIGSEIIAFBiBkQJEGoGSEJQagZECdByBkhBiAAQcgZECRB6BkhC0GIGiEKQegaIQQDQCAGECZFBEAgCCAGIAsgChAvIAsgCUGoGhAsIAcEfyAFBH9BqBogAxApBH9BqBogAyAEECsaQQAFIANBqBogBBArGkEBCwVBqBogAyAEECoaQQELBSAFBH9BqBogAyAEECoaQQAFIANBqBoQKQR/IANBqBogBBArGkEABUGoGiADIAQQKxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACECsaBSADIAIQJAsLCQAgAEHIGxAoCywAIAAgASACECoEQCACQYgbIAIQKxoFIAJBiBsQKQRAIAJBiBsgAhArGgsLCxcAIAAgASACECsEQCACQYgbIAIQKhoLCwsAQegbIAAgARAzC7YPAQN+IAAgADUCAEL/////DyIEIAA1AgB+Qv////8PgyIDQYgbNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBjBs1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QZAbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGUGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBmBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGgGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBpBs1AgAgA358IgI+AhxBqB0gAkIgiD4CACAAIAA1AgQgADUCBCAEfkL/////D4MiA0GIGzUCAH58IgI+AgQgACAANQIIIAJCIIh8QYwbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGQGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBlBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZgbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGcGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBoBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaQbNQIAIAN+fCICPgIgQawdIAJCIIg+AgAgACAANQIIIAA1AgggBH5C/////w+DIgNBiBs1AgB+fCICPgIIIAAgADUCDCACQiCIfEGMGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBkBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZQbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGYGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBnBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGkGzUCACADfnwiAj4CJEGwHSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBjBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZAbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGUGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBmBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGgGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBpBs1AgAgA358IgI+AihBtB0gAkIgiD4CACAAIAA1AhAgADUCECAEfkL/////D4MiA0GIGzUCAH58IgI+AhAgACAANQIUIAJCIIh8QYwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGQGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBlBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZgbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGcGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBoBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaQbNQIAIAN+fCICPgIsQbgdIAJCIIg+AgAgACAANQIUIAA1AhQgBH5C/////w+DIgNBiBs1AgB+fCICPgIUIAAgADUCGCACQiCIfEGMGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBkBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZQbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGYGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBnBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaAbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGkGzUCACADfnwiAj4CMEG8HSACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxBjBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGUGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBmBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZwbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGgGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBpBs1AgAgA358IgI+AjRBwB0gAkIgiD4CACAAIAA1AhwgADUCHCAEfkL/////D4MiA0GIGzUCAH58IgI+AhwgACAANQIgIAJCIIh8QYwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGQGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBlBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZgbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGcGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBoBs1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QaQbNQIAIAN+fCICPgI4QcQdIAJCIIg+AgBBqB0gAEEgaiABEDILiBwBE34gBSABNQIAIgQgADUCACIOfnwiA0L/////D4MhBSAGIAA1AgQiDyAEfnwgA0IgiHwiA0L/////D4MhBiAHIAA1AggiECAEfnwgA0IgiHwiA0L/////D4MhByAIIAA1AgwiESAEfnwgA0IgiHwiA0L/////D4MhCCAJIAA1AhAiEiAEfnwgA0IgiHwiA0L/////D4MhCSAKIAA1AhQiEyAEfnwgA0IgiHwiA0L/////D4MhCiALIAA1AhgiFCAEfnwgA0IgiHwiA0L/////D4MhCyAMIAA1AhwiFSAEfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIEIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIIIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIMIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIQIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIUIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIYIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIcIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gAiAFIAVC/////w9+Qv////8PgyIEfEIgiCAGIARC/////w9+fHwiA0L/////D4M+AgAgAiAHIARC/rf5/w9+fCADQiCIfCIDQv////8Pgz4CBCACIAggBEKCyPadBX58IANCIIh8IgNC/////w+DPgIIIAIgCSAEQoWwh80AfnwgA0IgiHwiA0L/////D4M+AgwgAiAKIARCiLDnmQN+fCADQiCIfCIDQv////8Pgz4CECACIAsgBELI+vXMAn58IANCIIh8IgNC/////w+DPgIUIAIgDCAEQtPOtp8HfnwgA0IgiHwiA0L/////D4M+AhggAiANIANCIIh8PgIcIAJBiBsQKQRAIAJBiBsgAhArGgsLsB0BE34gCCAANQIAIg0gDX58IgJC/////w+DIQggDCAANQIEIg8gDX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AggiECANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIAA1AgwiESANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIAA1AhAiEiANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIAA1AhQiEyANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AhgiFCANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gADUCHCINfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIA4gAkIgiHwhDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAwgDyAPfnwiAkL/////D4MhDCALIA8gEH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIA8gEX4iA0L/////D4NCAYZ8fCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAPIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgDyATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIA8gFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIA9+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgCyAQIBB+fCICQv////8PgyELIAogECARfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgECASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBAgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAQIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAQfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAogESARfnwiAkL/////D4MhCiAJIBEgEn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBEgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAkgEiASfnwiAkL/////D4MhCSAHIBIgE34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBIgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgByATIBN+fCICQv////8PgyEHIAYgEyAUfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAYgFCAUfnwiAkL/////D4MhBiAEIA0gFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAQgDSANfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCEOIAEgCCAIQv////8PfkL/////D4MiA3xCIIggDCADQv////8Pfnx8IgJC/////w+DPgIAIAEgCyADQv63+f8PfnwgAkIgiHwiAkL/////D4M+AgQgASAKIANCgsj2nQV+fCACQiCIfCICQv////8Pgz4CCCABIAkgA0KFsIfNAH58IAJCIIh8IgJC/////w+DPgIMIAEgByADQoiw55kDfnwgAkIgiHwiAkL/////D4M+AhAgASAGIANCyPr1zAJ+fCACQiCIfCICQv////8Pgz4CFCABIAQgA0LTzrafB358IAJCIIh8IgJC/////w+DPgIYIAEgBSACQiCIfCICQv////8Pgz4CHCAOIAJCIIh8pwRAIAFBiBsgARArGgUgAUGIGxApBEAgAUGIGyABECsaCwsLCgAgACAAIAEQNgsLACAAQagbIAEQNgsVACAAQaghECRByCEQJUGoISABEDULEQAgAEHoIRA6QeghQagcECkLIwAgABAmBEBBAA8LIABBiCIQOkGIIkGoHBApBEBBfw8LQQELFwAgACABEDogAUGIGyABEDAgASABEDkLCQBByBsgABAkC7wBAQJ/IAIQJUEgIQMDQCABIANPBEAgA0EgRgRAQagiED4FQagiQagbQagiEDYLIABBqCJByCIQNiACQcgiIAIQMiAAQSBqIQAgA0EgaiEDDAELCyABQR9xIgRFBEAPC0HIIhAlQQAhAQNAIAEgBEZFBEAgASAALQAAOgDIIiAAQQFqIQAgAUEBaiEBDAELCyADQSBGBEBBqCIQPgVBqCJBqBtBqCIQNgtByCJBqCJByCIQNiACQcgiIAIQMgscACABIAJB6CIQP0HoIkHoIhA5IABB6CIgAxA2C+EBAQJ/QQBBACgCACIFIAJBAWpBBXRqNgIAIAUQPiAFQSBqIQUDQCACIAZHBEAgABAmBEAgBUEgayAFECQFIAAgBUEgayAFEDYLIAAgAWohACAFQSBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBIGsiBSAFED0DQCAGBEAgABAmBEAgBSAFQSBrECQgAhAlBSAFQSBrQYgjECQgBSAAIAVBIGsQNiAFQYgjIAIQNgsgACABayEAIAIgBGshAiAFQSBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEDkgAEEgaiEAIAJBIGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhA6IABBIGohACACQSBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADED4PCyAAQagjECQgAxA+A0AgAkEBayICIAFqLQAAIQAgAyADEDcgAEGAAU8EQCADQagjIAMQNiAAQYABayEACyADIAMQNyAAQcAATwRAIANBqCMgAxA2IABBQGohAAsgAyADEDcgAEEgTwRAIANBqCMgAxA2IABBIGshAAsgAyADEDcgAEEQTwRAIANBqCMgAxA2IABBEGshAAsgAyADEDcgAEEITwRAIANBqCMgAxA2IABBCGshAAsgAyADEDcgAEEETwRAIANBqCMgAxA2IABBBGshAAsgAyADEDcgAEECTwRAIANBqCMgAxA2IABBAmshAAsgAyADEDcgAARAIANBqCMgAxA2CyACDQALC9UBAQF/IAAQJgRAIAEQJQ8LQSAhAkHoHEHIIxAkIABByBxBIEHoIxBEIABBiB1BIEGIJBBEA0BB6CNByBsQKEUEQEHoI0GoJBA3QQEhAANAQagkQcgbEChFBEBBqCRBqCQQNyAAQQFqIQAMAQsLQcgjQcgkECQgAiAAa0EBayECA0AgAgRAQcgkQcgkEDcgAkEBayECDAELCyAAIQJByCRByCMQN0HoI0HII0HoIxA2QYgkQcgkQYgkEDYMAQsLQYgkEDsEQEGIJCABEDQFQYgkIAEQJAsLIAAgABAmBEBBAQ8LIABBiBxBIEHoJBBEQegkQcgbECgLFQAgACABQYglEDZBiCVBqBsgAhA2CwoAIAAgACABEEcLCwAgAEGIGyABEDALCQAgAEGoHBApCw4AIAAQAiAAQTBqEAJxCwoAIABB4ABqEAILDQAgABABIABBMGoQAQsVACAAEAEgAEEwahAbIABB4ABqEAELegAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1gLugEAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIAQsoACAAEEsEQCABEE4FIAFB4ABqEBsgAEEwaiABQTBqEAAgACABEAALCxUAIAAgARAEIABBMGogAUEwahAEcQtyAQF/IAAQTARAIAEQSw8LIAEQSwRAQQAPCyAAQeAAaiICEA4EQCAAIAEQUg8LIAJB2CUQFCABQdglQYgmEBMgAkHYJUG4JhATIAFBMGpBuCZB6CYQEyAAQYgmEAQEQCAAQTBqQegmEAQE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AEEwaiABQTBqEBELIgAgACABEAAgAEEwaiABQTBqEBEgAEHgAGogAUHgAGoQAAsSACABQeg+EFogAEHoPiACEFcLEgAgAUH4PxBaIABB+D8gAhBYCxQAIAFBiMEAEFsgAEGIwQAgAhBZCxQAIAAgARAXIABBMGogAUEwahAXCyIAIAAgARAXIABBMGogAUEwahAXIABB4ABqIAFB4ABqEBcLFAAgACABEBYgAEEwaiABQTBqEBYLIgAgACABEBYgAEEwaiABQTBqEBYgAEHgAGogAUHgAGoQFgtTACAAEEwEQCABEAEgAUEwahABBSAAQeAAakGYwgAQGkGYwgBByMIAEBRBmMIAQcjCAEH4wgAQEyAAQcjCACABEBMgAEEwakH4wgAgAUEwahATCws4ACAAQTBqQajDABAUIABB2MMAEBQgAEHYwwBB2MMAEBNB2MMAQaglQdjDABAPQajDAEHYwwAQBAsQACAAQYjEABBjQYjEABBkC5gBAQN/QQBBACgCACIEIAFBMGxqNgIAIABB4ABqQZABIAEgBEEwEB4gBCEDA0AgASAFRwRAIAMQAgRAIAIQASACQTBqEAEFIAMgAEEwakHoxAAQEyADIAMQFCADIAAgAhATIANB6MQAIAJBMGoQEwsgAEGQAWohACACQeAAaiECIANBMGohAyAFQQFqIQUMAQsLQQAgBDYCAAtUACAAEEwEQCABEE4FIABB4ABqQZjFABAaQZjFAEHIxQAQFEGYxQBByMUAQfjFABATIABByMUAIAEQEyAAQTBqQfjFACABQTBqEBMgAUHgAGoQGwsLMgAgASACakEBayEBA0AgASACSEUEQCABIAAtAAA6AAAgAUEBayEBIABBAWohAAwBCwsLLQAgABBLBEAgARBNDwsgAEGoxgAQX0GoxgBBMCABEGhB2MYAQTAgAUEwahBoC0MAIAAQSwRAIAEQASABQcAAOgAADwsgAEGIxwAQF0GIxwBBMCABEGggAEEwahAZQX9GBEAgASABLQAAQYABcjoAAAsLMgAgAC0AAEHAAHEEQCABEE0PCyAAQTBBuMcAEGggAEEwakEwQejHABBoQbjHACABEGELwQEBAn8gAC0AACICQcAAcQRAIAEQTQ8LIAJBgAFxIQMgAEHIyAAQAEHIyAAgAkE/cToAAEHIyABBMEGYyAAQaEGYyAAg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A2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIASABIAApA5ABNwOQASABIAApA5gBNwOYASABIAApA6ABNwOgASABIAApA6gBNwOoASABIAApA7ABNwOwASABIAApA7gBNwO4AQuSAwAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1ggASAAKQNgNwNgIAEgACkDaDcDaCABIAApA3A3A3AgASAAKQN4NwN4IAEgACkDgAE3A4ABIAEgACkDiAE3A4gBIAEgACkDkAE3A5ABIAEgACkDmAE3A5gBIAEgACkDoAE3A6ABIAEgACkDqAE3A6gBIAEgACkDsAE3A7ABIAEgACkDuAE3A7gBIAEgACkDwAE3A8ABIAEgACkDyAE3A8gBIAEgACkD0AE3A9ABIAEgACkD2AE3A9gBIAEgACkD4AE3A+ABIAEgACkD6AE3A+gBIAEgACkD8AE3A/ABIAEgACkD+AE3A/gBIAEgACkDgAI3A4ACIAEgACkDiAI3A4gCIAEgACkDkAI3A5ACIAEgACkDmAI3A5gCCy8AIAAQmwEEQCABEJ4BBSABQcABahCLASAAQeAAaiABQeAAahCMASAAIAEQjAELCxcAIAAgARBSIABB4ABqIAFB4ABqEFJxC4YBAQF/IAAQnAEEQCABEJsBDwsgARCbAQRAQQAPCyAAQcABaiICEIoBBEAgACABEKIBDwsgAkHYhwEQjwEgAUHYhwFBuIgBEI0BIAJB2IcBQZiJARCNASABQeAAakGYiQFB+IkBEI0BIABBuIgBEFIEQCAAQeAAakH4iQEQUgRAQQEPCwtBAAvQAQECfyAAEJwBBEAgARCcAQ8LIAEQnAEEQEEADwsgAEHAAWoiAhCKAQRAIAEgABCjAQ8LIAFBwAFqIgMQigEEQCAAIAEQowEPCyACQdiKARCPASADQbiLARCPASAAQbiLAUGYjAEQjQEgAUHYigFB+IwBEI0BIAJB2IoBQdiNARCNASADQbiLAUG4jgEQjQEgAEHgAGpBuI4BQZiPARCNASABQeAA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AEHgAGoQTSAAQcABahBNCycAIAAgARCMASAAQeAAaiABQeAAahCMASAAQcABaiABQcABahCMAQvlAgAgACABQYjcAhCNASAAQeAAaiABQeAAakHo3AIQjQEgAEHAAWogAUHAAWpByN0CEI0BIAAgAEHgAGpBqN4CEJABIAEgAUHgAGpBiN8CEJABIAAgAEHAAWpB6N8CEJABIAEgAUHAAWpByOACEJABIABB4ABqIABBwAFqQajhAhCQASABQeAAaiABQcABakGI4gIQkAFBiNwCQejcAkHo4gIQkAFBiNwCQcjdAkHI4wIQkAFB6NwCQcjdAkGo5AIQkAFBqOECQYjiAiACEI0BIAJBqOQCIAIQkQEgAiACEOQBQYjcAiACIAIQkAFBqN4CQYjfAiACQeAAahCNASACQeAAakHo4gIgAkHgAGoQkQFByN0CQYjlAhDkASACQeAAakGI5QIgAkHgAGoQkAFB6N8CQcjgAiACQcABahCNASACQcABakHI4wIgAkHAAWoQkQEgAkHAAWpB6NwCIAJBwAFqEJABC4ECACAAQejlAhCPASAAIABB4ABqQcjmAhCNAUHI5gJByOYCQajnAhCQASAAIABB4ABqQYjoAhCRAUGI6AIgAEHAAWpBiOgCEJABQYjoAkGI6AIQjwEgAEHgAGogAEHAAWpB6OgCEI0BQejoAkHo6AJByOkCEJABIABBwAFqQajqAhCPAUHI6QIgARDkAUHo5QIgASABEJABQajqAiABQeAAahDkAUGo5wIgAUHgAGogAUHgAGoQkAFB6OUCQajqAiABQcABahCQAUHI6QIgAUHAAWogAUHAAWoQkQFBiOgCIAFBwAFqIAFBwAFqEJABQajnAiABQcABaiABQcABahCQAQs1ACAAIAEgAhCQASAAQeAAaiABQeAAaiACQeAAahCQASAAQcABaiABQcABaiACQcABahCQAQs1ACAAIAEgAhCRASAAQeAAaiABQeAAaiACQeAAahCRASAAQcABaiABQcABaiACQcABahCRAQsnACAAIAEQkgEgAEHgAGogAUHgAGoQkgEgAEHAAWogAUHAAWoQkgELKwEBfyAAQcABahCVASIBBEAgAQ8LIABB4ABqEJUBIgEEQCABDwsgABCVAQsmACAAIAEQUiAAQeAAaiABQeAAahBScSAAQcABaiABQcAB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QeAAaiABIAJBwAFqEI0BQcjRAyABIAIQjQEgAiACQcABaiACEJEBIAIgAhDkAUHo0AMgASACQeAAahCNASACQeAAaiACQcABaiACQeAAahCRAQvsAQAgACABQajSAxCNASAAQeAAaiACQYjTAxCNASAAIABB4ABqQejTAxCQASAAIABBwAFqQcjUAxCQASAAQeAAaiAAQcABaiADEJABIAMgAiADEI0BIANBiNMDIAMQkQEgAyADEOQBIANBqNIDIAMQkAEgASACIANB4ABqEJABIANB4ABqQejTAyADQeAAahCNASADQeAAakGo0gMgA0HgAGoQkQEgA0HgAGpBiNMDIANB4ABqEJEBQcjUAyABIANBwAFqEI0BIANBwAFqQajSAyADQcABahCRASADQcABakGI0wMgA0HAAWoQkAELkAEAIAAgASACQajVAxCPAiAAQaACaiADQcjXAxCOAiACIANB6NkDEJABIABBoAJqIAAgBEGgAmoQ7AEgBEGgAmogAUHo2QMgBEGgAmoQjwIgBEGgAmpBqNUDIARBoAJqEO0BIARBoAJqQcjXAyAEQaACahDtAUHI1wMgBBDpASAEIAQQ9gEgBEGo1QMgBBDsAQtQACABIABBMGpByNoDEBMgAUEwaiAAQTBqQfjaAxATIAFB4ABqIABBqNsDEBMgAUGQAWogAEHY2wMQEyACIAFBwAFqQajbA0HI2gMgAhCQAgtsACAAQYj+BCABEI0BIABB4ABqQej+BCABQeAAahCNASAAQcABakHI/wQgAUHAAWoQjQEgAEGgAmpBqIAFIAFBoAJqEI0BIABBgANqQYiBBSABQYADahCNASAAQeADakHogQUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByIIFIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaiDBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiIQFIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHohAUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQciFBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqIYFIAFB4ANqEI0BC2wAIABBiIcFIAEQjQEgAEHgAGpB6IcFIAFB4ABqEI0BIABBwAFqQciIBSABQcABahCNASAAQaACakGoiQUgAUGgAmoQjQEgAEGAA2pBiIoFIAFBgANqEI0BIABB4ANqQeiKBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIiwUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqIwFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIjQUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeiNBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByI4FIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGojwUgAUHgA2oQjQELbAAgAEGIkAUgARCNASAAQeAAakHokAUgAUHgAGoQjQEgAEHAAWpByJEFIAFBwAFqEI0BIABBoAJqQaiSBSABQaACahCNASAAQYADakGIkwUgAUGAA2oQjQEgAEHgA2pB6JMFIAFB4ANqEI0BC4oCACAAIAEQACAAQTBqIAFBMGoQESABQciUBSABEI0BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQESABQeAAakGolQUgAUHgAGoQjQEgAEHAAWogAUHAAWoQACAAQfABaiABQfABahARIAFBwAFqQYiWBSABQcABahCNASAAQaACaiABQaACahAAIABB0AJqIAFB0AJqEBEgAUGgAmpB6JYFIAFBoAJqEI0BIABBgANqIAFBgANqEAAgAEGwA2ogAUGwA2oQESABQYADakHIlwUgAUGAA2oQjQEgAEHgA2ogAUHgA2oQACAAQZAEaiABQZAEahARIAFB4ANqQaiYBSABQeADahCNAQtsACAAQYiZBSABEI0BIABB4ABqQeiZBSABQeAAahCNASAAQcABakHImgUgAUHAAWoQjQEgAEGgAmpBqJsFIAFBoAJqEI0BIABBgANqQYicBSABQYADahCNASAAQeADakHonAUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByJ0FIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaieBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiJ8FIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHonwUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQcigBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqKEFIAFB4ANqEI0BC2wAIABBiKIFIAEQjQEgAEHgAGpB6KIFIAFB4ABqEI0BIABBwAFqQcijBSABQcABahCNASAAQaACakGopAUgAUGgAmoQjQEgAEGAA2pBiKUFIAFBgANqEI0BIABB4ANqQeilBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIpgUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqKcFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIqAUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeioBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByKkFIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGoqgUgAUHgA2oQjQELgwEAIAAQSwRAQQEPCyAAEGRFBEBBAA8LIABBiKsFQfirBRATIABBMGpBqKwFEAAgAEG4qwVBiK0FEBMgAEEwakG4rQUQAEH4qwVB+KsFEFVB+KsFIABB+KsFEF1B+KsFQYitBUH4qwUQXUH4qwVB6KsFQRBB+KsFEHhB+KsFQYitBRBTCxEAIABB6K0FEGNB6K0FEJwCC7MCACAAEJsBBEBBAQ8LIAAQtAFFBEBBAA8LIABByK4FQfCwBRCNASAAQeAAakHIrgVB0LEFEI0BQfCwBUGorwVBsLIFEI4BQdCxBUGQswUQkgFB8LAFQfCzBRCSAUHQsQVB2K8FQdC0BRCNAUGwsgVB4LIF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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHongMLoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYi8AwugAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBqNADC0AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAB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"; +const pq = 712; +const pr = 3464; +const pG1gen = 42968; +const pG1zero = 43112; +const pG1b = 4776; +const pG2gen = 43256; +const pG2zero = 43544; +const pG2b = 17272; +const pOneT = 43832; +const prePSize = 288; +const preQSize = 20448; +const q = "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787"; +const r = "52435875175126190479447740508185965837690552500527637822603658699938581184513"; + +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bls12381 = null; async function buildBls12381(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bls12381)) return globalThis.curve_bls12381; - - const moduleBuilder = new wasmbuilder.ModuleBuilder(); - moduleBuilder.setMemory(25); - wasmcurves.buildBls12381(moduleBuilder); - - if (plugins) plugins(moduleBuilder); + if ((!singleThread) && (curve_bls12381)) return curve_bls12381; const bls12381wasm = {}; - bls12381wasm.code = moduleBuilder.build(); - bls12381wasm.pq = moduleBuilder.modules.f1m.pq; - bls12381wasm.pr = moduleBuilder.modules.frm.pq; - bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; - bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; - bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; - bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; - bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; - bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; - bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; - bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; - bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; - bls12381wasm.n8q = 48; - bls12381wasm.n8r = 32; - bls12381wasm.q = moduleBuilder.modules.bls12381.q; - bls12381wasm.r = moduleBuilder.modules.bls12381.r; - + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: static import (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Also avoids recompiling the wasm on every load. + // Regenerate the vendored module with `npm run gen-wasm`. + bls12381wasm.code = base64ToUint8Array(code); + bls12381wasm.pq = pq; + bls12381wasm.pr = pr; + bls12381wasm.pG1gen = pG1gen; + bls12381wasm.pG1zero = pG1zero; + bls12381wasm.pG1b = pG1b; + bls12381wasm.pG2gen = pG2gen; + bls12381wasm.pG2zero = pG2zero; + bls12381wasm.pG2b = pG2b; + bls12381wasm.pOneT = pOneT; + bls12381wasm.prePSize = prePSize; + bls12381wasm.preQSize = preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = q; + bls12381wasm.r = r; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import('wasmbuilder'); + const { buildBls12381: buildBls12381wasm } = await import('wasmcurves'); + + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBls12381wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bls12381wasm.code = moduleBuilder.build(); + bls12381wasm.pq = moduleBuilder.modules.f1m.pq; + bls12381wasm.pr = moduleBuilder.modules.frm.pq; + bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; + bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; + bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; + bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; + bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; + bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; + bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; + bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; + bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = moduleBuilder.modules.bls12381.q; + bls12381wasm.r = moduleBuilder.modules.bls12381.r; + } + + + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bls12381wasm.batchCode = base64ToUint8Array(code$1); + // The batch module's GLV path carries bls12-381 G1 constants too (G2 GLS + // is bn254-only; the wasm falls through internally for bls G2 sizes). + bls12381wasm.glv = true; const params = { name: "bls12381", @@ -5939,13 +6468,13 @@ async function buildBls12381(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bls12381 = null; + curve_bls12381 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bls12381 = curve; + curve_bls12381 = curve; } return curve; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..2df54c9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,34 @@ +import js from "@eslint/js"; +import globals from "globals"; + +export default [ + { ignores: ["build/", "src/wasm/"] }, + js.configs.recommended, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.node, + ...globals.mocha, + }, + }, + rules: { + "indent": ["error", 4], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + }, + }, + { + // `import "ses"` installs these as ambient globals + files: ["test/ses/**"], + languageOptions: { + globals: { + lockdown: "readonly", + harden: "readonly", + Compartment: "readonly", + }, + }, + }, +]; diff --git a/package-lock.json b/package-lock.json index 5880f3d..5a5b00e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,48 +9,83 @@ "version": "0.3.1", "license": "GPL-3.0", "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.2", "web-worker": "1.5.0" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.4", - "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-replace": "^5.0.3", - "chai": "^5.1.1", - "eslint": "^9.12.0", - "mocha": "^10.7.3", - "rollup": "^3.29.4" + "@eslint/js": "^10.0.1", + "@rollup/plugin-commonjs": "^29.0.3", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "binaryen": "^130.0.0", + "chai": "^6.2.2", + "eslint": "^10.6.0", + "globals": "^17.7.0", + "mocha": "^11.7.6", + "rollup": "^4.62.2", + "ses": "^2.2.0" + }, + "optionalDependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "git+https://github.com/iden3/wasmcurves.git#902d89aa1325346674bc2845e73963fa2d88f28c" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "node_modules/@endo/cache-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@endo/cache-map/-/cache-map-1.1.0.tgz", + "integrity": "sha512-owFGshs/97PDw9oguZqU/px8Lv1d0KjAUtDUiPwKHNXRVUE/jyettEbRoTbNJR1OaI8biMn6bHr9kVJsOh6dXw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "Apache-2.0" + }, + "node_modules/@endo/env-options": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@endo/env-options/-/env-options-1.1.11.tgz", + "integrity": "sha512-p9OnAPsdqoX4YJsE98e3NBVhIr2iW9gNZxHhAI2/Ul5TdRfoOViItzHzTqrgUVopw6XxA1u1uS6CykLMDUxarA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@endo/immutable-arraybuffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@endo/immutable-arraybuffer/-/immutable-arraybuffer-1.1.2.tgz", + "integrity": "sha512-u+NaYB2aqEugQ3u7w3c5QNkPogf8q/xGgsPaqdY6pUiGWtYiTiFspKFcha6+oeZhWXWQ23rf0KrUq0kfuzqYyQ==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -58,121 +93,125 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { + "node_modules/@eslint/config-helpers": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@humanfs/types": "^0.15.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18.18.0" } }, - "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.0", - "@humanwhocodes/retry": "^0.3.0" - }, "engines": { "node": ">=18.18.0" } @@ -182,6 +221,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -191,9 +231,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -204,27 +244,58 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.3.tgz", + "integrity": "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^8.0.3", + "fdir": "^6.2.0", "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" @@ -235,16 +306,47 @@ } } }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -261,10 +363,11 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", - "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", + "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" @@ -303,10 +406,406 @@ } } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -324,9 +823,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -347,9 +846,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -363,23 +862,17 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -397,71 +890,51 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": "18 || 20 || >=22" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/binaryen": { + "version": "130.0.0", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-130.0.0.tgz", + "integrity": "sha512-XDrb+zql0RbFPKgj7MuH9zOc78R3Fa/P/VSGnnpdwYsvNZPWjcMYMdAkKCOQEL2A7yqgjSMTDRFp6gfSDW+/QQ==", "dev": true, - "engines": { - "node": ">=8" + "license": "Apache-2.0", + "bin": { + "wasm-as": "bin/wasm-as", + "wasm-ctor-eval": "bin/wasm-ctor-eval", + "wasm-dis": "bin/wasm-dis", + "wasm-merge": "bin/wasm-merge", + "wasm-metadce": "bin/wasm-metadce", + "wasm-opt": "bin/wasm-opt", + "wasm-reduce": "bin/wasm-reduce", + "wasm-shell": "bin/wasm-shell", + "wasm2js": "bin/wasm2js" } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, "node_modules/browser-stdout": { @@ -470,28 +943,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -505,20 +956,13 @@ } }, "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/chalk": { @@ -537,64 +981,98 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 16" + "node": ">=8" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { @@ -621,12 +1099,6 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -672,21 +1144,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -698,26 +1161,35 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -735,33 +1207,33 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz", + "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==", "dev": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", - "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.5", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.1.0", - "eslint-visitor-keys": "^4.1.0", - "espree": "^10.2.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -771,17 +1243,15 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -796,83 +1266,61 @@ } }, "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "eslint-visitor-keys": "^5.0.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -898,6 +1346,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -936,7 +1385,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/file-entry-cache": { "version": "8.0.0", @@ -951,19 +1401,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1004,17 +1441,28 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/fsevents": { "version": "2.3.3", @@ -1044,24 +1492,28 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=12" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1072,6 +1524,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1079,31 +1532,43 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", "dev": true, "license": "MIT", "engines": { @@ -1153,75 +1618,16 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -1248,6 +1654,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1270,14 +1677,14 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=8" } }, "node_modules/is-plain-obj": { @@ -1314,13 +1721,41 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -1346,7 +1781,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", @@ -1363,6 +1799,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1386,12 +1823,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1408,12 +1839,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT" + "license": "ISC" }, "node_modules/magic-string": { "version": "0.30.5", @@ -1428,44 +1859,58 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "debug": "^4.3.5", - "diff": "^5.2.0", + "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", - "glob": "^8.1.0", + "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", + "minimatch": "^9.0.5", "ms": "^2.1.3", + "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { @@ -1473,13 +1918,20 @@ "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -1487,16 +1939,19 @@ } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/mocha/node_modules/supports-color": { @@ -1525,38 +1980,22 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "dependencies": { - "wrappy": "1" - } + "license": "MIT" }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -1592,18 +2031,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module": { + "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "license": "BlueOak-1.0.0" }, "node_modules/path-exists": { "version": "4.0.0", @@ -1619,6 +2052,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1629,21 +2063,36 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">= 14.16" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -1656,6 +2105,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -1670,26 +2120,18 @@ "node": ">=6" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/require-directory": { @@ -1697,6 +2139,7 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1718,62 +2161,71 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.6.tgz", + "integrity": "sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==", "dev": true, "license": "BSD-3-Clause", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/ses": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ses/-/ses-2.2.0.tgz", + "integrity": "sha512-mXZfO9O2bhE9E3INX5Dbqq+eo1Dj6Yeo+r7jas7GYTXRS6fzcZFYf0UbSHcXO7xJuPbhztBskSuSqJLMMoYMVQ==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "randombytes": "^2.1.0" + "@endo/cache-map": "^1.1.0", + "@endo/env-options": "^1.1.11", + "@endo/immutable-arraybuffer": "^1.1.2" } }, "node_modules/shebang-command": { @@ -1781,6 +2233,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1793,15 +2246,49 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1811,11 +2298,59 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1823,6 +2358,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1859,30 +2404,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -1903,12 +2430,15 @@ "node_modules/wasmbuilder": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "optional": true }, "node_modules/wasmcurves": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", - "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "resolved": "git+ssh://git@github.com/iden3/wasmcurves.git#902d89aa1325346674bc2845e73963fa2d88f28c", + "integrity": "sha512-q1dB238OIo/gEnciFCXFl94R/XhNCQKwcU8bqIqnqWb5vYN47MrrAJt6tTsyh/8yPXKuEmIm+Oo7DGsnKZ8U5g==", + "license": "GPL-3.0", + "optional": true, "dependencies": { "wasmbuilder": "0.0.16" } @@ -1924,6 +2454,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -1934,18 +2465,48 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1958,47 +2519,101 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -2016,6 +2631,51 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index a3ad475..a6d4eb1 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,14 @@ "browser": "./build/browser.esm.js" } }, + "browser": { + "os": false, + "crypto": false + }, "scripts": { "test": "mocha", + "test:ses": "node test/ses/lockdown.mjs", + "gen-wasm": "node scripts/gen-wasm.js", "build:node": "rollup -c rollup.cjs.config.js", "build:browser": "rollup -c rollup.browser.esm.config.js", "build": "npm run build:node && npm run build:browser" @@ -39,17 +45,27 @@ }, "homepage": "https://github.com/iden3/ffjavascript", "dependencies": { - "wasmbuilder": "0.0.16", - "wasmcurves": "0.2.2", "web-worker": "1.5.0" }, + "optionalDependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "git+https://github.com/iden3/wasmcurves.git#902d89aa1325346674bc2845e73963fa2d88f28c" + }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.4", - "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-replace": "^5.0.3", - "chai": "^5.1.1", - "eslint": "^9.12.0", - "mocha": "^10.7.3", - "rollup": "^3.29.4" + "@eslint/js": "^10.0.1", + "@rollup/plugin-commonjs": "^29.0.3", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "binaryen": "^130.0.0", + "chai": "^6.2.2", + "eslint": "^10.6.0", + "globals": "^17.7.0", + "mocha": "^11.7.6", + "rollup": "^4.62.2", + "ses": "^2.2.0" + }, + "overrides": { + "serialize-javascript": "^7.0.5", + "diff": "^8.0.3" } } diff --git a/rollup.browser.esm.config.js b/rollup.browser.esm.config.js index 104a1e1..33a4f67 100644 --- a/rollup.browser.esm.config.js +++ b/rollup.browser.esm.config.js @@ -10,8 +10,16 @@ export default [ { format: "es", file: "build/browser.esm.js", + inlineDynamicImports: true, }, ], + // Runtime wasm codegen toolchain. Only reachable through the custom + // `plugins` curve-build path (never taken when the prebuilt vendored + // wasm is used). Keeping it external preserves the lazy + // `import("wasmbuilder")`, so consumers' bundlers split it into an + // async chunk that never loads unless plugins are actually passed, + // instead of inlining the whole toolchain into every browser bundle. + external: ["wasmbuilder", "wasmcurves"], plugins: [ replace({ preventAssignment: true, diff --git a/scripts/gen-wasm.js b/scripts/gen-wasm.js new file mode 100644 index 0000000..72acc2f --- /dev/null +++ b/scripts/gen-wasm.js @@ -0,0 +1,75 @@ +// Dev-only: regenerate the vendored prebuilt wasm modules from wasmcurves. +// Run: npm run gen-wasm (wasmcurves + binaryen are devDependencies) +// +// We vendor the UNCOMPRESSED prebuilt (base64 of the raw wasm). wasmcurves emits +// an unoptimized, hand-assembled module; we run `wasm-opt -O2` over it before +// vendoring -- this shrinks the binary (dead-local removal, inlining, internal +// DCE) with no behaviour change. NOTE: -O2 on purpose, not -Oz/-O3 -- both of +// those pessimize the hot CIOS Montgomery mul by ~15% (measured 61.5-61.8ns vs +// 53.4ns per mul; their aggressive local restructuring fights V8's register +// allocator), while -O2 is the fastest of all levels. `code` is base64 of the +// OPTIMIZED wasm; the rest are pointer offsets / moduli (unchanged -- wasm-opt +// preserves the data layout those pointers reference). +import { createRequire } from "module"; +import { writeFileSync, mkdirSync, readFileSync, rmSync } from "fs"; +import { fileURLToPath } from "url"; +import { dirname, join } from "path"; +import { execFileSync } from "child_process"; +import { tmpdir } from "os"; + +const require = createRequire(import.meta.url); +const here = dirname(fileURLToPath(import.meta.url)); +const outDir = join(here, "..", "src", "wasm"); +mkdirSync(outDir, { recursive: true }); + +// Resolve the wasm-opt binary shipped by the `binaryen` devDependency. +const wasmOpt = join(dirname(require.resolve("binaryen/package.json")), "bin", "wasm-opt"); + +// base64 wasm -> `wasm-opt -O2` -> base64 wasm. Uses temp files so we invoke the +// exact CLI optimizer (deterministic, matches the -Oz pipeline 1:1). +function optimize(b64, name) { + const raw = Buffer.from(b64, "base64"); + const inFile = join(tmpdir(), `ffjs-genwasm-${name}-in.wasm`); + const outFile = join(tmpdir(), `ffjs-genwasm-${name}-out.wasm`); + try { + writeFileSync(inFile, raw); + execFileSync(wasmOpt, ["-O2", inFile, "-o", outFile], { stdio: ["ignore", "ignore", "inherit"] }); + const opt = readFileSync(outFile); + return { b64: opt.toString("base64"), before: raw.length, after: opt.length }; + } finally { + rmSync(inFile, { force: true }); + rmSync(outFile, { force: true }); + } +} + +// Batch-affine MSM helper module (AssemblyScript). Curve-independent: it +// imports the field/group ops and shares the main module's memory, so one +// binary serves bn128 and bls12381. +{ + const raw = readFileSync(require.resolve("wasmcurves/build/msm_batch.wasm")); + const { b64, before, after } = optimize(raw.toString("base64"), "msm_batch"); + const header = + "// AUTO-GENERATED from wasmcurves/build/msm_batch.wasm — do not edit.\n" + + "// Regenerate with: npm run gen-wasm\n" + + "// Batch-affine MSM module; links against the main curve module at runtime.\n"; + writeFileSync(join(outDir, "msm_batch_wasm.js"), header + `export const code = ${JSON.stringify(b64)};\n`); + console.log(`wrote src/wasm/msm_batch_wasm.js (wasm ${before} -> ${after} bytes)`); +} + +for (const name of ["bn128", "bls12381"]) { + const m = require(`wasmcurves/build/${name}_wasm.js`); // uncompressed prebuilt (CJS) + const { b64, before, after } = optimize(m.code, name); + const out = { ...m, code: b64 }; + const keys = Object.keys(out); + const body = keys.map((k) => `export const ${k} = ${JSON.stringify(out[k])};`).join("\n"); + const header = + `// AUTO-GENERATED from wasmcurves/build/${name}_wasm.js — do not edit.\n` + + `// Regenerate with: npm run gen-wasm\n` + + `// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are\n` + + `// pointer offsets / field moduli.\n`; + writeFileSync(join(outDir, `${name}_wasm.js`), header + body + "\n"); + const pct = Math.round((1 - after / before) * 100); + console.log( + `wrote src/wasm/${name}_wasm.js (${keys.length} exports, wasm ${before} -> ${after} bytes, -${pct}%)` + ); +} diff --git a/src/bigbuffer.js b/src/bigbuffer.js index 1064a02..66a1fa7 100644 --- a/src/bigbuffer.js +++ b/src/bigbuffer.js @@ -1,5 +1,8 @@ -const PAGE_SIZE = 1<<30; +// 1 GiB page size: a deliberately conservative, fragmentation-friendly page -- not +// the engine's max single-buffer length (~8 GiB+), which would defeat paging and +// risk OOM on the multi-GiB G1/G2 buffers large circuits produce. +const PAGE_SIZE = 1 << 30; export default class BigBuffer { diff --git a/src/bls12381.js b/src/bls12381.js index ce012b8..fbb3036 100644 --- a/src/bls12381.js +++ b/src/bls12381.js @@ -1,38 +1,78 @@ -import { buildBls12381 as buildBls12381wasm } from "wasmcurves"; import buildEngine from "./engine.js"; import * as Scalar from "./scalar.js"; -import { ModuleBuilder } from "wasmbuilder"; +import * as bls12381wasmPrebuilt from "./wasm/bls12381_wasm.js"; +import * as msmBatchPrebuilt from "./wasm/msm_batch_wasm.js"; +import { base64ToUint8Array } from "./wasm/base64.js"; -globalThis.curve_bls12381 = null; +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bls12381 = null; export default async function buildBls12381(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bls12381)) return globalThis.curve_bls12381; + if ((!singleThread) && (curve_bls12381)) return curve_bls12381; - const moduleBuilder = new ModuleBuilder(); - moduleBuilder.setMemory(25); - buildBls12381wasm(moduleBuilder); + const bls12381wasm = {}; - if (plugins) plugins(moduleBuilder); + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: static import (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Also avoids recompiling the wasm on every load. + // Regenerate the vendored module with `npm run gen-wasm`. + bls12381wasm.code = base64ToUint8Array(bls12381wasmPrebuilt.code); + bls12381wasm.pq = bls12381wasmPrebuilt.pq; + bls12381wasm.pr = bls12381wasmPrebuilt.pr; + bls12381wasm.pG1gen = bls12381wasmPrebuilt.pG1gen; + bls12381wasm.pG1zero = bls12381wasmPrebuilt.pG1zero; + bls12381wasm.pG1b = bls12381wasmPrebuilt.pG1b; + bls12381wasm.pG2gen = bls12381wasmPrebuilt.pG2gen; + bls12381wasm.pG2zero = bls12381wasmPrebuilt.pG2zero; + bls12381wasm.pG2b = bls12381wasmPrebuilt.pG2b; + bls12381wasm.pOneT = bls12381wasmPrebuilt.pOneT; + bls12381wasm.prePSize = bls12381wasmPrebuilt.prePSize; + bls12381wasm.preQSize = bls12381wasmPrebuilt.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = bls12381wasmPrebuilt.q; + bls12381wasm.r = bls12381wasmPrebuilt.r; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBls12381: buildBls12381wasm } = await import("wasmcurves"); - const bls12381wasm = {}; + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBls12381wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bls12381wasm.code = moduleBuilder.build(); + bls12381wasm.pq = moduleBuilder.modules.f1m.pq; + bls12381wasm.pr = moduleBuilder.modules.frm.pq; + bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; + bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; + bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; + bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; + bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; + bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; + bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; + bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; + bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = moduleBuilder.modules.bls12381.q; + bls12381wasm.r = moduleBuilder.modules.bls12381.r; + } - bls12381wasm.code = moduleBuilder.build(); - bls12381wasm.pq = moduleBuilder.modules.f1m.pq; - bls12381wasm.pr = moduleBuilder.modules.frm.pq; - bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; - bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; - bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; - bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; - bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; - bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; - bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; - bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; - bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; - bls12381wasm.n8q = 48; - bls12381wasm.n8r = 32; - bls12381wasm.q = moduleBuilder.modules.bls12381.q; - bls12381wasm.r = moduleBuilder.modules.bls12381.r; + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bls12381wasm.batchCode = base64ToUint8Array(msmBatchPrebuilt.code); + // The batch module's GLV path carries bls12-381 G1 constants too (G2 GLS + // is bn254-only; the wasm falls through internally for bls G2 sizes). + bls12381wasm.glv = true; const params = { name: "bls12381", @@ -49,13 +89,13 @@ export default async function buildBls12381(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bls12381 = null; + curve_bls12381 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bls12381 = curve; + curve_bls12381 = curve; } return curve; diff --git a/src/bn128.js b/src/bn128.js index 7a421c1..f744ea7 100644 --- a/src/bn128.js +++ b/src/bn128.js @@ -1,37 +1,75 @@ -import { buildBn128 as buildBn128wasm } from "wasmcurves"; import buildEngine from "./engine.js"; import * as Scalar from "./scalar.js"; -import { ModuleBuilder } from "wasmbuilder"; +import * as bn128wasmPrebuilt from "./wasm/bn128_wasm.js"; +import * as msmBatchPrebuilt from "./wasm/msm_batch_wasm.js"; +import { base64ToUint8Array } from "./wasm/base64.js"; -globalThis.curve_bn128 = null; +// Module-local singleton cache. Must NOT be on globalThis: assigning to a frozen +// globalThis (e.g. a SES hardened-profile realm) throws at module load. +let curve_bn128 = null; export default async function buildBn128(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bn128)) return globalThis.curve_bn128; - - const moduleBuilder = new ModuleBuilder(); - moduleBuilder.setMemory(25); - buildBn128wasm(moduleBuilder); - - if (plugins) plugins(moduleBuilder); - - const bn128wasm = {}; - - bn128wasm.code = moduleBuilder.build(); - bn128wasm.pq = moduleBuilder.modules.f1m.pq; - bn128wasm.pr = moduleBuilder.modules.frm.pq; - bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; - bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; - bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; - bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; - bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; - bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; - bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; - bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; - bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; - bn128wasm.n8q = 32; - bn128wasm.n8r = 32; - bn128wasm.q = moduleBuilder.modules.bn128.q; - bn128wasm.r = moduleBuilder.modules.bn128.r; + if ((!singleThread) && (curve_bn128)) return curve_bn128; + + let bn128wasm = {}; + + if (!plugins) { + // Vendored, uncompressed prebuilt wasm: statically imported (no runtime + // wasmcurves dependency, no dynamic import) and base64-decoded without + // atob/DecompressionStream, so it loads in Node, browsers and SES + // hardened realms alike. Regenerate the vendored module with `npm run gen-wasm`. + bn128wasm.code = base64ToUint8Array(bn128wasmPrebuilt.code); + bn128wasm.pq = bn128wasmPrebuilt.pq; + bn128wasm.pr = bn128wasmPrebuilt.pq; + bn128wasm.pG1gen = bn128wasmPrebuilt.pG1gen; + bn128wasm.pG1zero = bn128wasmPrebuilt.pG1zero; + bn128wasm.pG1b = bn128wasmPrebuilt.pG1b; + bn128wasm.pG2gen = bn128wasmPrebuilt.pG2gen; + bn128wasm.pG2zero = bn128wasmPrebuilt.pG2zero; + bn128wasm.pG2b = bn128wasmPrebuilt.pG2b; + bn128wasm.pOneT = bn128wasmPrebuilt.pOneT; + bn128wasm.prePSize = bn128wasmPrebuilt.prePSize; + bn128wasm.preQSize = bn128wasmPrebuilt.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = bn128wasmPrebuilt.q; + bn128wasm.r = bn128wasmPrebuilt.r; + } else { + // Custom-plugin build path: builds the wasm at runtime, so it needs the + // wasm toolchain. Kept as a dynamic import so wasmbuilder/wasmcurves stay + // OPTIONAL dependencies (only required when a caller passes `plugins`). + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBn128: buildBn128wasm } = await import("wasmcurves"); + + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBn128wasm(moduleBuilder); + + if (plugins) plugins(moduleBuilder); + + bn128wasm.code = moduleBuilder.build(); + bn128wasm.pq = moduleBuilder.modules.f1m.pq; + bn128wasm.pr = moduleBuilder.modules.frm.pq; + bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; + bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; + bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; + bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; + bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; + bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; + bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; + bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; + bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = moduleBuilder.modules.bn128.q; + bn128wasm.r = moduleBuilder.modules.bn128.r; + } + + // Batch-affine MSM helper module (curve-independent; links against the + // main module's exports + memory at runtime in each worker). + bn128wasm.batchCode = base64ToUint8Array(msmBatchPrebuilt.code); + // The batch module's GLV path hardcodes the bn254 endomorphism constants. + bn128wasm.glv = true; const params = { name: "bn128", @@ -47,13 +85,13 @@ export default async function buildBn128(singleThread, plugins) { const curve = await buildEngine(params); curve.terminate = async function () { if (!params.singleThread) { - globalThis.curve_bn128 = null; + curve_bn128 = null; await this.tm.terminate(); } }; if (!singleThread) { - globalThis.curve_bn128 = curve; + curve_bn128 = curve; } return curve; diff --git a/src/engine_applykey.js b/src/engine_applykey.js index 5857d8c..294c9ff 100644 --- a/src/engine_applykey.js +++ b/src/engine_applykey.js @@ -64,10 +64,12 @@ export default function buildBatchApplyKey(curve, groupName) { const task = []; + const b = buff.slice(i*pointsPerChunk*sGin, i*pointsPerChunk*sGin + n*sGin); + task.push({ cmd: "ALLOCSET", var: 0, - buff: buff.slice(i*pointsPerChunk*sGin, i*pointsPerChunk*sGin + n*sGin) + buff: b }); task.push({cmd: "ALLOCSET", var: 1, buff: t}); task.push({cmd: "ALLOCSET", var: 2, buff: inc}); @@ -96,7 +98,7 @@ export default function buildBatchApplyKey(curve, groupName) { } task.push({cmd: "GET", out: 0, var: 3, len: n*sGout}); - opPromises.push(tm.queueAction(task)); + opPromises.push(tm.queueAction(task, [b.buffer])); t = Fr.mul(t, Fr.exp(inc, n)); } diff --git a/src/engine_batchconvert.js b/src/engine_batchconvert.js index 0acf524..1adb3bf 100644 --- a/src/engine_batchconvert.js +++ b/src/engine_batchconvert.js @@ -29,7 +29,7 @@ export default function buildBatchConvert(tm, fnName, sIn, sOut) { {cmd: "GET", out: 0, var: 1, len:sOut * n}, ]; opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [buffChunk.buffer]) ); } diff --git a/src/engine_fft.js b/src/engine_fft.js index 5ae955b..27b932c 100644 --- a/src/engine_fft.js +++ b/src/engine_fft.js @@ -1,4 +1,4 @@ -import {log2, buffReverseBits, array2buffer, buffer2array} from "./utils.js"; +import {log2, array2buffer, buffer2array} from "./utils.js"; import BigBuffer from "./bigbuffer.js"; @@ -6,7 +6,28 @@ export default function buildFFT(curve, groupName) { const G = curve[groupName]; const Fr = curve.Fr; const tm = G.tm; - async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { + + // In-place bit-reversal permutation in a worker. The buffer is transferred + // in, reversed where it lies via plain typed-array lane swaps (no WASM + // linear memory grown, nothing allocated), and transferred back. Both + // transfers are pointer moves, so this is zero-copy. The swap is + // memory-bandwidth bound, so a single worker is as fast as splitting across + // many — which is why no SharedArrayBuffer is needed (only concurrent + // multi-worker access to one buffer would require that). + async function _reversePermutation(buff, sIn, bits) { + const res = await tm.queueAction( + [{cmd: "REVERSE", src: buff, sIn, bits}], + [buff.buffer] // transfer in; reversed in place and transferred back + ); + return res[0]; + } + + // `consume`: when true the caller cedes ownership of `buff` -- we skip the + // defensive full-copy below and reverse/transfer the caller's buffer in place + // (its backing ArrayBuffer is detached as a result). Only pass it when the + // input is discarded right after the call (e.g. the groth16 IFFT->applyKey->FFT + // pipeline). Default false preserves the input. + async function _fft(buff, inverse, inType, outType, logger, loggerTxt, consume) { inType = inType || "affine"; outType = outType || "affine"; @@ -69,7 +90,11 @@ export default function buildFFT(curve, groupName) { if (Array.isArray(buff)) { buff = array2buffer(buff, sIn); returnArray = true; - } else { + } else if (!consume || !ArrayBuffer.isView(buff)) { + // Defensive copy: the bit-reversal runs in place and chunks are + // transferred, so without consume we must not touch the caller's buffer. + // It also flattens a BigBuffer (no single .buffer to transfer) to a + // Uint8Array, so consume can only be honoured for an ArrayBuffer view. buff = buff.slice(0, buff.byteLength); } @@ -103,7 +128,14 @@ export default function buildFFT(curve, groupName) { let buffOut; - buffReverseBits(buff, sIn); + // Bit-reversal permutation. Like the old pure-JS buffReverseBits, this is + // just a permutation of fixed-size (sIn-byte) elements and works for any + // element size, so it covers Fr, G1 and G2 alike. Reversed in place in a + // worker via typed-array swaps — no WASM linear memory grown, nothing + // allocated. (The previous WASM __reversePermutation swapped n8g-sized + // elements rather than sIn-sized ones, which was wrong whenever + // sIn != n8g, e.g. affine-input G1/G2 FFTs.) + buff = await _reversePermutation(buff, sIn, bits); let chunks; let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); @@ -117,8 +149,8 @@ export default function buildFFT(curve, groupName) { const l2Chunk = log2(pointsInChunk); const promises = []; + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`); for (let i = 0; i< nChunks; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${i}/${nChunks}`); const task = []; task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); @@ -146,17 +178,15 @@ export default function buildFFT(curve, groupName) { } else { task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); } - promises.push(tm.queueAction(task).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${i}/${nChunks}`); - return r; - })); + promises.push(tm.queueAction(task, [buffChunk.buffer])); } chunks = await Promise.all(promises); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`); for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; for (let i = l2Chunk+1; i<=bits; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); const nGroups = 1 << (bits - i); const nChunksPerGroup = nChunks / nGroups; const opPromises = []; @@ -203,10 +233,7 @@ export default function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sMid}); task.push({cmd: "GET", out: 1, var: 1, len: pointsInChunk*sMid}); } - opPromises.push(tm.queueAction(task).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join ${i}/${bits} ${j+1}/${nGroups} ${k}/${nChunksPerGroup/2}`); - return r; - })); + opPromises.push(tm.queueAction(task, [chunks[o1].buffer, chunks[o2].buffer, first.buffer ])); } } @@ -402,7 +429,7 @@ export default function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: n*sOut}); task.push({cmd: "GET", out: 1, var: 1, len: n*sOut}); opPromises.push( - tm.queueAction(task).then( (r) => { + tm.queueAction(task, [b1.buffer, b2.buffer, firstChunk.buffer]).then((r) => { if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); return r; }) @@ -432,12 +459,12 @@ export default function buildFFT(curve, groupName) { } - G.fft = async function(buff, inType, outType, logger, loggerTxt) { - return await _fft(buff, false, inType, outType, logger, loggerTxt); + G.fft = async function(buff, inType, outType, logger, loggerTxt, consume) { + return await _fft(buff, false, inType, outType, logger, loggerTxt, consume); }; - G.ifft = async function(buff, inType, outType, logger, loggerTxt) { - return await _fft(buff, true, inType, outType, logger, loggerTxt); + G.ifft = async function(buff, inType, outType, logger, loggerTxt, consume) { + return await _fft(buff, true, inType, outType, logger, loggerTxt, consume); }; G.lagrangeEvaluations = async function (buff, inType, outType, logger, loggerTxt) { @@ -550,7 +577,7 @@ export default function buildFFT(curve, groupName) { } task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b.buffer]) ); } @@ -585,7 +612,7 @@ export default function buildFFT(curve, groupName) { ]}); task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); task.push({cmd: "GET", out: 1, var: 1, len: pointsPerChunk*sG}); - opPromises.push(tm.queueAction(task)); + opPromises.push(tm.queueAction(task, [chunks[o1].buffer, chunks[o2].buffer, first.buffer])); } } @@ -664,7 +691,7 @@ export default function buildFFT(curve, groupName) { task.push({cmd: "GET", out: 0, var: 0, len: pointsPerChunk*sG}); task.push({cmd: "GET", out: 1, var: 1, len: pointsPerChunk*sG}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b1.buffer, b2.buffer, firstChunk.buffer]) ); } @@ -740,7 +767,7 @@ export default function buildFFT(curve, groupName) { ]}); task.push({cmd: "GET", out: 0, var: 0, len: n*sGout}); opPromises.push( - tm.queueAction(task) + tm.queueAction(task, [b.buffer]) ); } diff --git a/src/engine_multiexp.js b/src/engine_multiexp.js index 38d813f..8afa4e1 100644 --- a/src/engine_multiexp.js +++ b/src/engine_multiexp.js @@ -10,146 +10,169 @@ const pTSizes = [ export default function buildMultiexp(curve, groupName) { const G = curve[groupName]; const tm = G.tm; - async function _multiExpChunk(buffBases, buffScalars, inType, logger, logText) { - if ( ! (buffBases instanceof Uint8Array) ) { - if (logger) logger.error(`${logText} _multiExpChunk buffBases is not Uint8Array`); - throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); - } - if ( ! (buffScalars instanceof Uint8Array) ) { - if (logger) logger.error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); - throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); - } - inType = inType || "affine"; - - let sGIn; - let fnName; - if (groupName == "G1") { - if (inType == "affine") { - fnName = "g1m_multiexpAffine_chunk"; - sGIn = G.F.n8*2; - } else { - fnName = "g1m_multiexp_chunk"; - sGIn = G.F.n8*3; - } - } else if (groupName == "G2") { - if (inType == "affine") { - fnName = "g2m_multiexpAffine_chunk"; - sGIn = G.F.n8*2; - } else { - fnName = "g2m_multiexp_chunk"; - sGIn = G.F.n8*3; - } - } else { - throw new Error("Invalid group"); - } - const nPoints = Math.floor(buffBases.byteLength / sGIn); - if (nPoints == 0) return G.zero; - const sScalar = Math.floor(buffScalars.byteLength / nPoints); - if( sScalar * nPoints != buffScalars.byteLength) { - throw new Error("Scalar size does not match"); - } + const MAX_CHUNK_SIZE = 1 << 22; + const MIN_CHUNK_SIZE = 1 << 12; - const bitChunkSize = pTSizes[log2(nPoints)]; - const nChunks = Math.floor((sScalar*8 - 1) / bitChunkSize) +1; - - const opPromises = []; - for (let i=0; i=0; i--) { - if (!G.isZero(res)) { - for (let j=0; j MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + return chunkSize; + } + // Run the multiexp of one chunk on a worker; returns the partial point. + async function _multiExpChunk(buffBases, buffScalars, inType, batchMode, endoMode, logText) { + if (!(buffBases instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + if (!(buffScalars instanceof Uint8Array)) throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + const sGIn = pointSize(inType); const nPoints = Math.floor(buffBases.byteLength / sGIn); - if (nPoints == 0) return G.zero; + if (nPoints === 0) return G.zero; const sScalar = Math.floor(buffScalars.byteLength / nPoints); - if( sScalar * nPoints != buffScalars.byteLength) { - throw new Error("Scalar size does not match"); - } + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error(`${logText} Scalar size does not match`); + + const task = [ + {cmd: "ALLOCSET", var: 0, buff: buffBases}, + {cmd: "ALLOCSET", var: 1, buff: buffScalars}, + {cmd: "ALLOC", var: 2, len: G.F.n8*3}, + {cmd: "CALL", fnName: fnNameFor(inType, buffBases.byteLength, batchMode, endoMode), params: [ + {var: 0}, {var: 1}, {val: sScalar}, {val: nPoints}, {var: 2} + ]}, + {cmd: "GET", out: 0, var: 2, len: G.F.n8*3}, + ]; + // transfer the chunk buffers to the worker (zero-copy); one GET -> one point + const out = await tm.queueAction(task, [buffBases.buffer, buffScalars.buffer]); + return out[0]; + } - const bitChunkSize = pTSizes[log2(nPoints)]; - const nChunks = Math.floor((sScalar*8 - 1) / bitChunkSize) +1; - - let chunkSize; - chunkSize = Math.floor(nPoints / (tm.concurrency /nChunks)); - if (chunkSize>MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize { - if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); + // Shared driver. `getChunk(byteOffset, byteLength)` supplies each bases chunk -- + // a synchronous slice of an in-memory buffer, or an async sub-range read. At most + // `maxInFlight` chunks are sourced at once (Infinity = dispatch them all). The + // point set is partitioned across chunks, so the full multiexp is the sum of the + // per-chunk multiexps. + async function _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, maxInFlight, batchMode, endoMode, logger, logText) { + if (nPoints === 0) return G.zero; + const chunkSize = chunkSizeFor(nPoints, sScalar); + const inFlight = new Set(); + const partials = []; + + for (let off = 0; off < nPoints; off += chunkSize) { + const n = Math.min(nPoints - off, chunkSize); + const at = off; + // Backpressure: block until a slot frees (Promise.race also surfaces a + // failed chunk promptly). With maxInFlight = Infinity this never blocks. + while (inFlight.size >= maxInFlight) await Promise.race(inFlight); + if (logger) logger.debug(`Multiexp start: ${logText}: ${at}/${nPoints}`); + const op = (async () => { + const basesChunk = await getChunk(at*sGIn, n*sGIn); + const scalarsChunk = buffScalars.slice(at*sScalar, (at+n)*sScalar); + const r = await _multiExpChunk(basesChunk, scalarsChunk, inType, batchMode, endoMode, logText); + if (logger) logger.debug(`Multiexp end: ${logText}: ${at}/${nPoints}`); return r; - })); + })(); + // settle-either-way cleanup so a rejected chunk can't wedge the set + const slot = op.finally(() => inFlight.delete(slot)); + inFlight.add(slot); + partials.push(slot); } - const result = await Promise.all(opPromises); - + const result = await Promise.all(partials); let res = G.zero; - for (let i=result.length-1; i>=0; i--) { - res = G.add(res, result[i]); + for (let i = result.length-1; i >= 0; i--) res = G.add(res, result[i]); + return res; + } + + // Derive nPoints/sScalar and validate before dispatching. + function geometry(totalBasesBytes, buffScalars, inType) { + const sGIn = pointSize(inType); + const nPoints = Math.floor(totalBasesBytes / sGIn); + let sScalar = 0; + if (nPoints > 0) { + sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); } + return { sGIn, nPoints, sScalar }; + } - return res; + // multiexp over an in-memory bases buffer (sliced per chunk, all dispatched at once). + async function _multiExp(buffBases, buffScalars, inType, batchMode, endoMode, logger, logText) { + const { sGIn, nPoints, sScalar } = geometry(buffBases.byteLength, buffScalars, inType); + const getChunk = (off, len) => buffBases.slice(off, off + len); + return _multiExpDispatch(getChunk, buffScalars, nPoints, sGIn, sScalar, inType, Infinity, batchMode, endoMode, logger, logText); } - G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "jacobian", logger, logText); + G.multiExp = async function multiExp(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "jacobian", "disabled", "auto", logger, logText); }; - G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "affine", logger, logText); + // options.batch: "auto" (default) | "enabled" | "disabled" -- see batchModeOf. + // options.glv / options.gls: "auto" (default) | "disabled" -- see endoOf. + G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText, options) { + return _multiExp(buffBases, buffScalars, "affine", batchModeOf(options), endoOf(options), logger, logText); + }; + + // Streaming affine multiexp: bases are produced chunk-by-chunk by `basesReader` + // (e.g. a direct sub-range file read) instead of being read whole and sliced -- + // no main-thread slice copy, and the full section never sits in RAM (reads are + // bounded to a few in-flight chunks). Result is identical to multiExpAffine. + G.multiExpAffineChunked = async function multiExpAffineChunked(basesReader, totalBasesBytes, buffScalars, logger, logText, options) { + if (typeof basesReader !== "function") { + throw new Error(`${logText || "multiExpAffineChunked"}: basesReader must be a function (byteOffset, byteLength) => Promise`); + } + const { sGIn, nPoints, sScalar } = geometry(totalBasesBytes, buffScalars, "affine"); + return _multiExpDispatch(basesReader, buffScalars, nPoints, sGIn, sScalar, "affine", tm.concurrency + 2, batchModeOf(options), endoOf(options), logger, logText); }; } diff --git a/src/engine_pairing.js b/src/engine_pairing.js index 5a802ce..8e642af 100644 --- a/src/engine_pairing.js +++ b/src/engine_pairing.js @@ -59,6 +59,11 @@ export default function buildPairing(curve) { task.push({cmd: "GET", out: 0, var: 4, len: curve.Gt.n8}); + // Do NOT transfer g1Buff/g2Buff: toJacobian() returns its argument + // unchanged when the point is already in jacobian form, so these may + // alias caller-owned buffers (e.g. curve.G1.g / curve.G2.g). + // Transferring would detach them on the main thread. They are single + // points, so the structured-clone copy is negligible. opPromises.push( tm.queueAction(task) ); diff --git a/src/f1field.js b/src/f1field.js index 5a93b4e..7f17aff 100644 --- a/src/f1field.js +++ b/src/f1field.js @@ -1,4 +1,3 @@ -/* global BigInt */ import * as Scalar from "./scalar.js"; import * as futils from "./futils.js"; import buildSqrt from "./fsqrt.js"; diff --git a/src/polfield.js b/src/polfield.js index 467645f..a27756c 100644 --- a/src/polfield.js +++ b/src/polfield.js @@ -47,7 +47,7 @@ export default class PolField { this.roots = []; -/* for (let i=0; i<16; i++) { + /* for (let i=0; i<16; i++) { let r = this.F.one; n = 1 << i; const rootsi = new Array(n); diff --git a/src/random.js b/src/random.js index 4637b61..f63ebba 100644 --- a/src/random.js +++ b/src/random.js @@ -3,17 +3,19 @@ import crypto from "crypto"; export function getRandomBytes(n) { let array = new Uint8Array(n); - if (process.browser) { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } - } - } - else { // NodeJS + // Feature-detect rather than rely on `process.browser` (undefined under + // Vite/esbuild/SES -> ReferenceError). Prefer Node crypto (no per-call size + // limit); fall back to Web Crypto chunked to its 65536-byte cap. + if (crypto && crypto.randomFillSync) { // Node crypto.randomFillSync(array); + } else if (typeof globalThis.crypto !== "undefined" && globalThis.crypto.getRandomValues) { + for (let i = 0; i < n; i += 65536) { + globalThis.crypto.getRandomValues(array.subarray(i, Math.min(i + 65536, n))); + } + } else { // insecure last resort + for (let i=0; i>>0; + } } return array; } diff --git a/src/scalar.js b/src/scalar.js index 8f3a3c3..f07bf83 100644 --- a/src/scalar.js +++ b/src/scalar.js @@ -1,5 +1,4 @@ -/* global BigInt */ const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; export function fromString(s, radix) { diff --git a/src/threadman.js b/src/threadman.js index f80901b..444d04a 100644 --- a/src/threadman.js +++ b/src/threadman.js @@ -25,6 +25,10 @@ import thread from "./threadman_thread.js"; import os from "os"; import Worker from "web-worker"; +// Robust Node detection that never throws (unlike `process.browser`, which is a +// webpack-ism and is undefined under Vite/esbuild/SES). +const isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null; + class Deferred { constructor() { this.promise = new Promise((resolve, reject)=> { @@ -34,23 +38,40 @@ class Deferred { } } -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); +// WorkerSlot holds the native Worker and all per-worker state. +// Each call to startWorker() creates a fresh WorkerSlot instance. +// Message handlers close over the slot reference so that stale messages +// from a replaced worker are detected by a simple identity check +// (tm.pool[i] !== slot). +class WorkerSlot { + constructor(worker) { + this.worker = worker; // native Worker thread + this.initialized = false; + this.initializing= false; + this.working = false; + this.pendingDeferred = null; + this.onMsg = null; // stored so removeEventListener can be called on termination + this.onError = null; + } } +// Computed lazily on first worker creation, NOT at module load: a SES +// hardened realm (which runs single-threaded) has no Blob/btoa/URL.createObjectURL, and +// touching them at import time would throw before a curve could even be built. let workerSource; - -const threadStr = `(${thread.toString()})(self)`; -if(process.browser) { - if(globalThis?.Blob) { - const threadBytes= new TextEncoder().encode(threadStr); - const workerBlob = new Blob([threadBytes], { type: "application/javascript" }) ; +function getWorkerSource() { + if (workerSource !== undefined) return workerSource; + const threadStr = `(${thread.toString()})(self)`; + if (isNode) { + workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); + } else if (globalThis?.Blob && globalThis.URL && globalThis.URL.createObjectURL) { + const threadBytes = new TextEncoder().encode(threadStr); + const workerBlob = new Blob([threadBytes], { type: "application/javascript" }); workerSource = URL.createObjectURL(workerBlob); } else { workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); } -} else { - workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); + return workerSource; } @@ -69,11 +90,16 @@ export default async function buildThreadManager(wasm, singleThread) { "memory": tm.memory } }); - - if(process.browser && !globalThis?.Worker) { + + // Force single-thread when no Worker is available. Covers SES hardened realms + // (no Worker, frozen globals) and old/limited browsers, regardless of what + // the caller requested -- the worker path (and getWorkerSource's + // Blob/btoa) would otherwise fail. Node uses the web-worker import, so it + // keeps multi-threading. + if(!isNode && !globalThis?.Worker) { singleThread = true; } - + tm.singleThread = singleThread; tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. tm.pq = wasm.pq; @@ -84,120 +110,227 @@ export default async function buildThreadManager(wasm, singleThread) { tm.pG2zero = wasm.pG2zero; tm.pOneT = wasm.pOneT; - // tm.pTmp0 = tm.alloc(curve.G2.F.n8*3); - // tm.pTmp1 = tm.alloc(curve.G2.F.n8*3); + tm.code = wasm.code; + tm.wasmModule = wasmModule; + // Batch-affine MSM helper module (optional): compiled once, shipped to every + // worker alongside the main module. n8f = base-field element size in bytes. + tm.batchCode = wasm.batchCode; + tm.batchWasmModule = wasm.batchCode ? await WebAssembly.compile(wasm.batchCode) : undefined; + tm.n8f = wasm.n8q; + tm.glv = !!wasm.glv; if (singleThread) { - tm.code = wasm.code; tm.taskManager = thread(); await tm.taskManager([{ cmd: "INIT", init: MEM_SIZE, - code: tm.code.slice() + code: tm.code.slice(), + batchCode: tm.batchCode ? tm.batchCode.slice() : undefined, + n8f: tm.n8f, + glv: tm.glv }]); tm.concurrency = 1; } else { - tm.workers = []; - tm.pendingDeferreds = []; - tm.working = []; + // pool[i] is the active WorkerSlot at slot i, or null if the slot is empty. + tm.pool = []; let concurrency = 2; - if (process.browser) { - if (typeof navigator === "object" && navigator.hardwareConcurrency) { - concurrency = navigator.hardwareConcurrency; - } - } else { + if (typeof navigator === "object" && navigator.hardwareConcurrency) { + concurrency = navigator.hardwareConcurrency; + } else if (os && os.cpus) { concurrency = os.cpus().length; } - if(concurrency == 0){ + if(concurrency === 0){ concurrency = 2; } // Limit to 64 threads for memory reasons. if (concurrency>64) concurrency=64; tm.concurrency = concurrency; + } + return tm; +} - for (let i = 0; i { + slot.initialized = true; + }); } startSyncOp() { - if (this.oldPFree != 0) throw new Error("Sync operation in progress"); + if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); this.oldPFree = this.u32[0]; } endSyncOp() { - if (this.oldPFree == 0) throw new Error("No sync operation in progress"); + if (this.oldPFree === 0) throw new Error("No sync operation in progress"); this.u32[0] = this.oldPFree; this.oldPFree = 0; } - postAction(workerId, e, transfers, _deferred) { - if (this.working[workerId]) { - throw new Error("Posting a job t a working worker"); + async postAction(slotIndex, e, transfers, _deferred) { + const slot = this.pool[slotIndex]; + if (!slot || slot.working) { + throw new Error("Posting a job to a working worker"); } - this.working[workerId] = true; - - this.pendingDeferreds[workerId] = _deferred ? _deferred : new Deferred(); - this.workers[workerId].postMessage(e, transfers); - - return this.pendingDeferreds[workerId].promise; + slot.working = true; + slot.pendingDeferred = _deferred ? _deferred : new Deferred(); + await slot.worker.postMessage(e, transfers); + return slot.pendingDeferred.promise; } - processWorks() { - for (let i=0; (i 0); i++) { - if (this.working[i] == false) { + async processWorks() { + // Dispatch queued tasks to ready workers. + for (let i = 0; i < this.concurrency && this.actionQueue.length > 0; i++) { + const slot = this.pool[i]; + if (slot && slot.initialized && !slot.working) { const work = this.actionQueue.shift(); - this.postAction(i, work.data, work.transfers, work.deferred); + await this.postAction(i, work.data, work.transfers, work.deferred); + } + } + + // Start new workers for slots that need them. + if (this.actionQueue.length > 0) { + let initializingCount = 0; + for (let i = 0; i < this.concurrency; i++) { + const slot = this.pool[i]; + if (slot) { + if (slot.initializing) initializingCount++; + // slot exists: skip whether initialized, initializing, or working + continue; + } + // slot is null: this slot is available to host a new worker + if (initializingCount >= this.actionQueue.length) break; + initializingCount++; + this.startWorker(i); } } } - queueAction(actionData, transfers) { + async queueAction(actionData, transfers) { const d = new Deferred(); if (this.singleThread) { @@ -205,11 +338,11 @@ export class ThreadManager { d.resolve(res); } else { this.actionQueue.push({ - data: actionData, + data: actionData, transfers: transfers, - deferred: d + deferred: d }); - this.processWorks(); + await this.processWorks(); } return d.promise; } @@ -225,7 +358,7 @@ export class ThreadManager { } getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); + return this.u8.slice(pointer, pointer + length); } setBuff(pointer, buffer) { @@ -240,10 +373,11 @@ export class ThreadManager { } async terminate() { - for (let i=0; i (await WebAssembly.instantiate(batchModule, { + env: { "memory": memory }, + curve: { + f_mul: ex[f + "_mul"], f_square: ex[f + "_square"], f_add: ex[f + "_add"], + f_sub: ex[f + "_sub"], f_neg: ex[f + "_neg"], f_inverse: ex[f + "_inverse"], + f_isZero: ex[f + "_isZero"], f_conj: ex[conj], + g_add: ex[g + "_add"], g_addMixed: ex[g + "_addMixed"], + g_double: ex[g + "_double"], g_zero: ex[g + "_zero"], g_isZero: ex[g + "_isZero"], + }, + })).exports; + const n8f = data.n8f; + batchFns = {}; + if (ex.f1m_mul && ex.g1m_addMixed) { + // f_conj is only used by the G2 GLS path; wire a harmless copy for G1 + const b = await mkBatch("f1m", "g1m", "f1m_copy"); + // GLV path (bn254 G1 endomorphism) when the curve advertises it; + // the wasm falls back internally for unexpected sizes. + const useGlv = data.glv && b.multiexpAffineGLV; + const fn = useGlv ? b.multiexpAffineGLV : b.multiexpAffine; + batchFns["g1m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn(pB, pS, sS, n, pr, n8f); + // NoGlv variant, selectable per call ({glv: "disabled"} option) + batchFns["g1m_multiexpAffineBatchNoGlv"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f); + } + if (ex.f2m_mul && ex.g2m_addMixed) { + const b = await mkBatch("f2m", "g2m", "f2m_conjugate"); + // GLS (bn254 G2 endomorphism) when the curve advertises it; the + // wasm gates internally on chunk size and falls back to batch. + // The NoGls variant is selectable per call ({gls:false} option). + const useGls = data.glv && b.multiexpAffineGLS; + const fn2 = useGls ? b.multiexpAffineGLS : b.multiexpAffine; + batchFns["g2m_multiexpAffineBatch"] = (pB, pS, sS, n, pr) => fn2(pB, pS, sS, n, pr, n8f * 2); + batchFns["g2m_multiexpAffineBatchNoGls"] = (pB, pS, sS, n, pr) => b.multiexpAffine(pB, pS, sS, n, pr, n8f * 2); + } + } + + if (data.terminationTimeout) { + terminationTimeout = data.terminationTimeout; + } } + // Reverse the low `bits` of a 32-bit integer (O(1) bit-twiddle). + function rev32(x) { + x = ((x & 0x55555555) << 1) | ((x >>> 1) & 0x55555555); + x = ((x & 0x33333333) << 2) | ((x >>> 2) & 0x33333333); + x = ((x & 0x0f0f0f0f) << 4) | ((x >>> 4) & 0x0f0f0f0f); + x = ((x & 0x00ff00ff) << 8) | ((x >>> 8) & 0x00ff00ff); + x = (x << 16) | (x >>> 16); + return x >>> 0; + } + + // In-place bit-reversal permutation of fixed-size (sIn-byte) elements. + // Works for any element size, like the old pure-JS buffReverseBits. When + // the elements are 4-byte aligned it swaps Uint32Array lanes (no BigInt + // boxing, no allocation); otherwise it falls back to a byte-wise swap with + // a single reused temp buffer. Either way it touches no WASM linear memory. + function reverseInPlace(u8, sIn, bits) { + const n = u8.byteLength / sIn; + const shift = 32 - bits; + if (((sIn & 3) === 0) && ((u8.byteOffset & 3) === 0)) { + const lanes = sIn >>> 2; + const u32 = new Uint32Array(u8.buffer, u8.byteOffset, u8.byteLength >>> 2); + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + let a = i * lanes; + let b = ri * lanes; + for (let l = 0; l < lanes; l++) { + const t = u32[a + l]; + u32[a + l] = u32[b + l]; + u32[b + l] = t; + } + } + } + } else { + const tmp = new Uint8Array(sIn); // one reused temp, not one per swap + for (let i = 0; i < n; i++) { + const ri = rev32(i) >>> shift; + if (i < ri) { + const ao = i * sIn; + const bo = ri * sIn; + tmp.set(u8.subarray(ao, ao + sIn)); + u8.copyWithin(ao, bo, bo + sIn); + u8.set(tmp, bo); + } + } + } + } + function alloc(length) { const u32 = new Uint32Array(memory.buffer, 0, 1); while (u32[0] & 3) u32[0]++; // Return always aligned pointers @@ -62,8 +192,7 @@ export default function thread(self) { } function getBuffer(pointer, length) { - const u8 = new Uint8Array(memory.buffer); - return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); + return new Uint8Array(memory.buffer, pointer, length); } function setBuffer(pointer, buffer) { @@ -72,7 +201,8 @@ export default function thread(self) { } function runTask(task) { - if (task[0].cmd == "INIT") { + clearTimeout(terminationTimer); + if (task[0].cmd === "INIT") { return init(task[0]); } const ctx = { @@ -83,6 +213,15 @@ export default function thread(self) { const oldAlloc = u32a[0]; for (let i=0; i plain + // in-module variant when the batch module is unavailable + // (same 5-arg signature) + if (!fn) { + const base = fname.replace(/Batch(NoGls|NoGlv)?$/, ""); + fn = instance.exports[base]; + } + } + fn(...params); + } break; } case "GET": @@ -114,9 +267,29 @@ export default function thread(self) { } const u32b = new Uint32Array(memory.buffer, 0, 1); u32b[0] = oldAlloc; + return ctx.out; } + function scheduleTermination() { + clearTimeout(terminationTimer); + if (terminationTimeout > 0) { + terminationTimer = setTimeout(() => { + // 2-phase termination: notify main thread first; close only after + // it acks with TERMINATE. This prevents the race where the main + // thread dispatches a task to a worker that has already closed. + if (self) self.postMessage({status: "want_to_terminate"}); + }, terminationTimeout); + } + } + + function terminate() { + clearTimeout(terminationTimer); + if (self) { + self.postMessage({status: "terminated"}); + self.close(); + } + } return runTask; } diff --git a/src/utils.js b/src/utils.js index f1eb893..8e69bd0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,3 @@ -/* global BigInt */ import * as Scalar from "./scalar.js"; export function stringifyBigInts(o) { diff --git a/src/wasm/base64.js b/src/wasm/base64.js new file mode 100644 index 0000000..0a3481f --- /dev/null +++ b/src/wasm/base64.js @@ -0,0 +1,49 @@ +// base64 -> Uint8Array, used once at curve load to decode the vendored wasm. +// +// Prefer the platform decoder (Buffer in Node, atob in browsers/extensions) for +// speed, and fall back to a pure-JS implementation only where neither exists -- +// e.g. a SES hardened realm that has not endowed atob/Buffer. The fallback keeps the +// curve loadable everywhere without depending on any host base64 primitive. + +const CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +let LOOKUP; + +function decodePureJs(b64) { + if (!LOOKUP) { + LOOKUP = new Uint8Array(256); + for (let i = 0; i < CHARS.length; i++) LOOKUP[CHARS.charCodeAt(i)] = i; + } + const len = b64.length; + let pad = 0; + if (len > 0 && b64[len - 1] === "=") pad++; + if (len > 1 && b64[len - 2] === "=") pad++; + const outLen = ((len * 3) >> 2) - pad; + const out = new Uint8Array(outLen); + let o = 0; + for (let i = 0; i < len; i += 4) { + const a = LOOKUP[b64.charCodeAt(i)]; + const b = LOOKUP[b64.charCodeAt(i + 1)]; + const c = LOOKUP[b64.charCodeAt(i + 2)]; + const d = LOOKUP[b64.charCodeAt(i + 3)]; + if (o < outLen) out[o++] = (a << 2) | (b >> 4); + if (o < outLen) out[o++] = ((b & 15) << 4) | (c >> 2); + if (o < outLen) out[o++] = ((c & 3) << 6) | d; + } + return out; +} + +export function base64ToUint8Array(b64) { + if (typeof Buffer !== "undefined" && typeof Buffer.from === "function") { + // Node (and Node-compatible runtimes) — fastest. + return new Uint8Array(Buffer.from(b64, "base64")); + } + if (typeof atob === "function") { + // Browsers, extensions, modern Node, Deno. + const bin = atob(b64); + const out = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i); + return out; + } + // SES hardened realm or any host without a base64 primitive. + return decodePureJs(b64); +} diff --git a/src/wasm/bls12381_wasm.js b/src/wasm/bls12381_wasm.js new file mode 100644 index 0000000..960b759 --- /dev/null +++ b/src/wasm/bls12381_wasm.js @@ -0,0 +1,20 @@ +// AUTO-GENERATED from wasmcurves/build/bls12381_wasm.js — do not edit. +// Regenerate with: npm run gen-wasm +// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are +// pointer offsets / field moduli. +export const code = "AGFzbQEAAAABjwERYAJ/fwBgA39/fwBgAX8Bf2AEf39/fwBgBX9/f39/AGABfwBgAn9/AX9gBn9/f39/fwBgA39/fwF/YAh/f39/f39/fwBgAn9+AGAEf39/fwF/YAp/f39/f39/f39/AGAFf39/f38Bf2AHf39/f39/fwF/YAl/f39/f39/f38Bf2ALf39/f39/f39/f38BfwIPAQNlbnYGbWVtb3J5AgAZA68CrQIABQIFBgYICAEAAAoDAQIBAQAAAQAAAAACAgAFAQMEAQEDAAIABQIFBgYICAEAAAMBAgEBAAABAAAAAAICAAUBAwQBAQMAAgEAAAICAgUFAAAABgYGAAABAQEAAAEBAQAAAAAAAgIBAAEAAAAAAQEBAQELBwkECQQDAwADAgAABAcHAQEHAAMMBAMCBQABAQABAQAAAwICBAMAAgICBQUAAAAGBgYAAAEBAQAAAQEBAAAAAAACAgEAAAAAAAEBAQEBCQQJBAMDAQADAAAEBwcBAQcBAAMAAAQHBwEBBwEBBAQEBAQAAgIFBQABAAEBAAIGAAMCBAMAAgIFBQABAQABAQAAAAAGAAMCAgQDAAIBAwQBAAAAAAAAAAAAAAICAgIAAAEAAAAACA0ODxABB74nvQIJaW50cV9jb3B5AAAJaW50cV96ZXJvAAEIaW50cV9vbmUAAwtpbnRxX2lzWmVybwACB2ludHFfZXEABAhpbnRxX2d0ZQAFCGludHFfYWRkAAYIaW50cV9zdWIABwhpbnRxX211bAAIC2ludHFfc3F1YXJlAAkOaW50cV9zcXVhcmVPbGQACghpbnRxX2RpdgAMD2ludHFfaW52ZXJzZU1vZAANCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAPB2YxbV9zdWIAEAdmMW1fbmVnABEOZjFtX2lzTmVnYXRpdmUAGAlmMW1faXNPbmUADghmMW1fc2lnbgAZC2YxbV9tUmVkdWN0ABIHZjFtX211bAATCmYxbV9zcXVhcmUAFA1mMW1fc3F1YXJlT2xkABUSZjFtX2Zyb21Nb250Z29tZXJ5ABcQZjFtX3RvTW9udGdvbWVyeQAWC2YxbV9pbnZlcnNlABoHZjFtX29uZQAbCGYxbV9sb2FkABwPZjFtX3RpbWVzU2NhbGFyAB0HZjFtX2V4cAAhEGYxbV9iYXRjaEludmVyc2UAHghmMW1fc3FydAAiDGYxbV9pc1NxdWFyZQAjFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAfF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5ACAJaW50cl9jb3B5ACQJaW50cl96ZXJvACUIaW50cl9vbmUAJwtpbnRyX2lzWmVybwAmB2ludHJfZXEAKAhpbnRyX2d0ZQApCGludHJfYWRkACoIaW50cl9zdWIAKwhpbnRyX211bAAsC2ludHJfc3F1YXJlAC0OaW50cl9zcXVhcmVPbGQALghpbnRyX2RpdgAvD2ludHJfaW52ZXJzZU1vZAAwCGZybV9jb3B5ACQIZnJtX3plcm8AJQpmcm1faXNaZXJvACYGZnJtX2VxACgHZnJtX2FkZAAyB2ZybV9zdWIAMwdmcm1fbmVnADQOZnJtX2lzTmVnYXRpdmUAOwlmcm1faXNPbmUAMQhmcm1fc2lnbgA8C2ZybV9tUmVkdWN0ADUHZnJtX211bAA2CmZybV9zcXVhcmUANw1mcm1fc3F1YXJlT2xkADgSZnJtX2Zyb21Nb250Z29tZXJ5ADoQZnJtX3RvTW9udGdvbWVyeQA5C2ZybV9pbnZlcnNlAD0HZnJtX29uZQA+CGZybV9sb2FkAD8PZnJtX3RpbWVzU2NhbGFyAEAHZnJtX2V4cABEEGZybV9iYXRjaEludmVyc2UAQQhmcm1fc3FydABFDGZybV9pc1NxdWFyZQBGFWZybV9iYXRjaFRvTW9udGdvbWVyeQBCF2ZybV9iYXRjaEZyb21Nb250Z29tZXJ5AEMGZnJfYWRkADIGZnJfc3ViADMGZnJfbmVnADQGZnJfbXVsAEcJZnJfc3F1YXJlAEgKZnJfaW52ZXJzZQBJDWZyX2lzTmVnYXRpdmUASgdmcl9jb3B5ACQHZnJfemVybwAlBmZyX29uZQA+CWZyX2lzWmVybwAmBWZyX2VxACgMZzFtX211bHRpZXhwAHUSZzFtX211bHRpZXhwX2NodW5rAHQSZzFtX211bHRpZXhwQWZmaW5lAHcYZzFtX211bHRpZXhwQWZmaW5lX2NodW5rAHYKZzFtX2lzWmVybwBMEGcxbV9pc1plcm9BZmZpbmUASwZnMW1fZXEAVAtnMW1fZXFNaXhlZABTDGcxbV9lcUFmZmluZQBSCGcxbV9jb3B5AFAOZzFtX2NvcHlBZmZpbmUATwhnMW1femVybwBODmcxbV96ZXJvQWZmaW5lAE0KZzFtX2RvdWJsZQBWEGcxbV9kb3VibGVBZmZpbmUAVQdnMW1fYWRkAFkMZzFtX2FkZE1peGVkAFgNZzFtX2FkZEFmZmluZQBXB2cxbV9uZWcAWw1nMW1fbmVnQWZmaW5lAFoHZzFtX3N1YgBeDGcxbV9zdWJNaXhlZABdDWcxbV9zdWJBZmZpbmUAXBJnMW1fZnJvbU1vbnRnb21lcnkAYBhnMW1fZnJvbU1vbnRnb21lcnlBZmZpbmUAXxBnMW1fdG9Nb250Z29tZXJ5AGIWZzFtX3RvTW9udGdvbWVyeUFmZmluZQBhD2cxbV90aW1lc1NjYWxhcgB4FWcxbV90aW1lc1NjYWxhckFmZmluZQB5DWcxbV9ub3JtYWxpemUAZwpnMW1fTEVNdG9VAGkKZzFtX0xFTXRvQwBqCmcxbV9VdG9MRU0AawpnMW1fQ3RvTEVNAGwPZzFtX2JhdGNoTEVNdG9VAG0PZzFtX2JhdGNoTEVNdG9DAG4PZzFtX2JhdGNoVXRvTEVNAG8PZzFtX2JhdGNoQ3RvTEVNAHAMZzFtX3RvQWZmaW5lAGMOZzFtX3RvSmFjb2JpYW4AURFnMW1fYmF0Y2hUb0FmZmluZQBmE2cxbV9iYXRjaFRvSmFjb2JpYW4AcQtnMW1faW5DdXJ2ZQBlEWcxbV9pbkN1cnZlQWZmaW5lAGQXZnJtX19yZXZlcnNlUGVybXV0YXRpb24Aegdmcm1fZmZ0AH0IZnJtX2lmZnQAfgpmcm1fcmF3ZmZ0AHsLZnJtX2ZmdEpvaW4Afw5mcm1fZmZ0Sm9pbkV4dACAARFmcm1fZmZ0Sm9pbkV4dEludgCBAQpmcm1fZmZ0TWl4AIIBDGZybV9mZnRGaW5hbACDAR1mcm1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgCEAQhwb2xfemVybwCFAQ9wb2xfY29uc3RydWN0TEMAhgEMcWFwX2J1aWxkQUJDAIcBC3FhcF9qb2luQUJDAIgBDHFhcF9iYXRjaEFkZACJAQpmMm1faXNaZXJvAEsJZjJtX2lzT25lAIoBCGYybV96ZXJvAE0HZjJtX29uZQCLAQhmMm1fY29weQCMAQdmMm1fbXVsAI0BCGYybV9tdWwxAI4BCmYybV9zcXVhcmUAjwEHZjJtX2FkZACQAQdmMm1fc3ViAJEBB2YybV9uZWcAkgEIZjJtX3NpZ24AlQENZjJtX2Nvbmp1Z2F0ZQBaEmYybV9mcm9tTW9udGdvbWVyeQBfEGYybV90b01vbnRnb21lcnkAYQZmMm1fZXEAUgtmMm1faW52ZXJzZQCTAQdmMm1fZXhwAJgBD2YybV90aW1lc1NjYWxhcgCUARBmMm1fYmF0Y2hJbnZlcnNlAJcBCGYybV9zcXJ0AJkBDGYybV9pc1NxdWFyZQCaAQ5mMm1faXNOZWdhdGl2ZQCWAQxnMm1fbXVsdGlleHAAwgESZzJtX211bHRpZXhwX2NodW5rAMEBEmcybV9tdWx0aWV4cEFmZmluZQDEARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsAwwEKZzJtX2lzWmVybwCcARBnMm1faXNaZXJvQWZmaW5lAJsBBmcybV9lcQCkAQtnMm1fZXFNaXhlZACjAQxnMm1fZXFBZmZpbmUAogEIZzJtX2NvcHkAoAEOZzJtX2NvcHlBZmZpbmUAnwEIZzJtX3plcm8AngEOZzJtX3plcm9BZmZpbmUAnQEKZzJtX2RvdWJsZQCmARBnMm1fZG91YmxlQWZmaW5lAKUBB2cybV9hZGQAqQEMZzJtX2FkZE1peGVkAKgBDWcybV9hZGRBZmZpbmUApwEHZzJtX25lZwCrAQ1nMm1fbmVnQWZmaW5lAKoBB2cybV9zdWIArgEMZzJtX3N1Yk1peGVkAK0BDWcybV9zdWJBZmZpbmUArAESZzJtX2Zyb21Nb250Z29tZXJ5ALABGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQCvARBnMm1fdG9Nb250Z29tZXJ5ALIBFmcybV90b01vbnRnb21lcnlBZmZpbmUAsQEPZzJtX3RpbWVzU2NhbGFyAMUBFWcybV90aW1lc1NjYWxhckFmZmluZQDGAQ1nMm1fbm9ybWFsaXplALcBCmcybV9MRU10b1UAuAEKZzJtX0xFTXRvQwC5AQpnMm1fVXRvTEVNALoBCmcybV9DdG9MRU0AuwEPZzJtX2JhdGNoTEVNdG9VALwBD2cybV9iYXRjaExFTXRvQwC9AQ9nMm1fYmF0Y2hVdG9MRU0AvgEPZzJtX2JhdGNoQ3RvTEVNAL8BDGcybV90b0FmZmluZQCzAQ5nMm1fdG9KYWNvYmlhbgChARFnMm1fYmF0Y2hUb0FmZmluZQC2ARNnMm1fYmF0Y2hUb0phY29iaWFuAMABC2cybV9pbkN1cnZlALUBEWcybV9pbkN1cnZlQWZmaW5lALQBC2cxbV90aW1lc0ZyAMcBF2cxbV9fcmV2ZXJzZVBlcm11dGF0aW9uAMgBB2cxbV9mZnQAygEIZzFtX2lmZnQAywEKZzFtX3Jhd2ZmdADJAQtnMW1fZmZ0Sm9pbgDMAQ5nMW1fZmZ0Sm9pbkV4dADNARFnMW1fZmZ0Sm9pbkV4dEludgDOAQpnMW1fZmZ0TWl4AM8BDGcxbV9mZnRGaW5hbADQAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDRAQtnMm1fdGltZXNGcgDSARdnMm1fX3JldmVyc2VQZXJtdXRhdGlvbgDTAQdnMm1fZmZ0ANUBCGcybV9pZmZ0ANYBCmcybV9yYXdmZnQA1AELZzJtX2ZmdEpvaW4A1wEOZzJtX2ZmdEpvaW5FeHQA2AERZzJtX2ZmdEpvaW5FeHRJbnYA2QEKZzJtX2ZmdE1peADaAQxnMm1fZmZ0RmluYWwA2wEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24A3AERZzFtX3RpbWVzRnJBZmZpbmUA3QERZzJtX3RpbWVzRnJBZmZpbmUA3gERZnJtX2JhdGNoQXBwbHlLZXkA3wERZzFtX2JhdGNoQXBwbHlLZXkA4AEWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZADhARFnMm1fYmF0Y2hBcHBseUtleQDiARZnMm1fYmF0Y2hBcHBseUtleU1peGVkAOMBCmY2bV9pc1plcm8A5QEJZjZtX2lzT25lAOYBCGY2bV96ZXJvAOcBB2Y2bV9vbmUA6AEIZjZtX2NvcHkA6QEHZjZtX211bADqAQpmNm1fc3F1YXJlAOsBB2Y2bV9hZGQA7AEHZjZtX3N1YgDtAQdmNm1fbmVnAO4BCGY2bV9zaWduAO8BEmY2bV9mcm9tTW9udGdvbWVyeQCwARBmNm1fdG9Nb250Z29tZXJ5ALIBBmY2bV9lcQDwAQtmNm1faW52ZXJzZQDxAQdmNm1fZXhwAPUBD2Y2bV90aW1lc1NjYWxhcgDyARBmNm1fYmF0Y2hJbnZlcnNlAPQBDmY2bV9pc05lZ2F0aXZlAPMBCmZ0bV9pc1plcm8A9wEJZnRtX2lzT25lAPgBCGZ0bV96ZXJvAPkBB2Z0bV9vbmUA+gEIZnRtX2NvcHkA+wEHZnRtX211bAD8AQhmdG1fbXVsMQD9AQpmdG1fc3F1YXJlAP4BB2Z0bV9hZGQA/wEHZnRtX3N1YgCAAgdmdG1fbmVnAIECCGZ0bV9zaWduAIgCDWZ0bV9jb25qdWdhdGUAggISZnRtX2Zyb21Nb250Z29tZXJ5AIQCEGZ0bV90b01vbnRnb21lcnkAgwIGZnRtX2VxAIUCC2Z0bV9pbnZlcnNlAIYCB2Z0bV9leHAAiwIPZnRtX3RpbWVzU2NhbGFyAIcCEGZ0bV9iYXRjaEludmVyc2UAigIIZnRtX3NxcnQAjAIMZnRtX2lzU3F1YXJlAI0CDmZ0bV9pc05lZ2F0aXZlAIkCEWZ0bV9mcm9iZW5pdXNNYXAwAJICEWZ0bV9mcm9iZW5pdXNNYXAxAJMCEWZ0bV9mcm9iZW5pdXNNYXAyAJQCEWZ0bV9mcm9iZW5pdXNNYXAzAJUCEWZ0bV9mcm9iZW5pdXNNYXA0AJYCEWZ0bV9mcm9iZW5pdXNNYXA1AJcCEWZ0bV9mcm9iZW5pdXNNYXA2AJgCEWZ0bV9mcm9iZW5pdXNNYXA3AJkCEWZ0bV9mcm9iZW5pdXNNYXA4AJoCEWZ0bV9mcm9iZW5pdXNNYXA5AJsCE2JsczEyMzgxX3BhaXJpbmdFcTEApwITYmxzMTIzODFfcGFpcmluZ0VxMgCoAhNibHMxMjM4MV9wYWlyaW5nRXEzAKkCE2JsczEyMzgxX3BhaXJpbmdFcTQAqgITYmxzMTIzODFfcGFpcmluZ0VxNQCrAhBibHMxMjM4MV9wYWlyaW5nAKwCEmJsczEyMzgxX3ByZXBhcmVHMQCgAhJibHMxMjM4MV9wcmVwYXJlRzIAoQITYmxzMTIzODFfbWlsbGVyTG9vcACiAhxibHMxMjM4MV9maW5hbEV4cG9uZW50aWF0aW9uAKYCH2JsczEyMzgxX2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAowIaYmxzMTIzODFfX2N5Y2xvdG9taWNTcXVhcmUApAIaYmxzMTIzODFfX2N5Y2xvdG9taWNFeHBfdzAApQIIZjZtX211bDEAjgIJZjZtX211bDAxAI8CCmZ0bV9tdWwwMTQAkAIRZzFtX2luR3JvdXBBZmZpbmUAnAILZzFtX2luR3JvdXAAnQIRZzJtX2luR3JvdXBBZmZpbmUAngILZzJtX2luR3JvdXAAnwIK7dgErQI+ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKAssACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtEACAAKQMoUAR+IAApAyBQBH4gACkDGFAEfiAAKQMQUAR+IAApAwhQBH4gACkDAAVCAQsFQgELBUIBCwVCAQsFQgELUAssACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxggAEIANwMgIABCADcDKAtiACAAKQMoIAEpAyhRBH8gACkDICABKQMgUQR/IAApAxggASkDGFEEfyAAKQMQIAEpAxBRBH8gACkDCCABKQMIUQR/IAApAwAgASkDAFEFQQALBUEACwVBAAsFQQALBUEACwu3AQAgACkDKCABKQMoVAR/QQAFIAApAyggASkDKFYEf0EBBSAAKQMgIAEpAyBUBH9BAAUgACkDICABKQMgVgR/QQEFIAApAxggASkDGFQEf0EABSAAKQMYIAEpAxhWBH9BAQUgACkDECABKQMQVAR/QQAFIAApAxAgASkDEFYEf0EBBSAAKQMIIAEpAwhUBH9BAAUgACkDCCABKQMIVgR/QQEFIAApAwAgASkDAFoLCwsLCwsLCwsLC6QCAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIAIgADUCICABNQIgfCADQiCIfCIDPgIgIAIgADUCJCABNQIkfCADQiCIfCIDPgIkIAIgADUCKCABNQIofCADQiCIfCIDPgIoIAIgADUCLCABNQIsfCADQiCIfCIDPgIsIANCIIinC/gCAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgAiAANQIgIAE1AiB9IANCIId8IgNC/////w+DPgIgIAIgADUCJCABNQIkfSADQiCHfCIDQv////8Pgz4CJCACIAA1AiggATUCKH0gA0Igh3wiA0L/////D4M+AiggAiAANQIsIAE1Aix9IANCIId8IgNC/////w+DPgIsIANCIIenC84fARl+IAQgADUCACIFIAE1AgAiBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIAIARCIIghAyADIAUgATUCBCIHfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgQiCCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgQgA0IgiCEEIAQgBSABNQIIIgl+IANC/////w+DfCIDQiCIfCEEIAQgByAIfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AggiCiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgggBEIgiCEDIAMgBSABNQIMIgt+IARC/////w+DfCIEQiCIfCEDIAMgCCAJfiAEQv////8Pg3wiBEIgiHwhAyADIAcgCn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIMIgwgBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIMIANCIIghBCAEIAUgATUCECINfiADQv////8Pg3wiA0IgiHwhBCAEIAggC34gA0L/////D4N8IgNCIIh8IQQgBCAJIAp+IANC/////w+DfCIDQiCIfCEEIAQgByAMfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhAiDiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhAgBEIgiCEDIAMgBSABNQIUIg9+IARC/////w+DfCIEQiCIfCEDIAMgCCANfiAEQv////8Pg3wiBEIgiHwhAyADIAogC34gBEL/////D4N8IgRCIIh8IQMgAyAJIAx+IARC/////w+DfCIEQiCIfCEDIAMgByAOfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhQiECAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhQgA0IgiCEEIAQgBSABNQIYIhF+IANC/////w+DfCIDQiCIfCEEIAQgCCAPfiADQv////8Pg3wiA0IgiHwhBCAEIAogDX4gA0L/////D4N8IgNCIIh8IQQgBCALIAx+IANC/////w+DfCIDQiCIfCEEIAQgCSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAcgEH4gA0L/////D4N8IgNCIIh8IQQgBCAANQIYIhIgBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIYIARCIIghAyADIAUgATUCHCITfiAEQv////8Pg3wiBEIgiHwhAyADIAggEX4gBEL/////D4N8IgRCIIh8IQMgAyAKIA9+IARC/////w+DfCIEQiCIfCEDIAMgDCANfiAEQv////8Pg3wiBEIgiHwhAyADIAsgDn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBB+IARC/////w+DfCIEQiCIfCEDIAMgByASfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhwiFCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhwgA0IgiCEEIAQgBSABNQIgIhV+IANC/////w+DfCIDQiCIfCEEIAQgCCATfiADQv////8Pg3wiA0IgiHwhBCAEIAogEX4gA0L/////D4N8IgNCIIh8IQQgBCAMIA9+IANC/////w+DfCIDQiCIfCEEIAQgDSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAsgEH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBJ+IANC/////w+DfCIDQiCIfCEEIAQgByAUfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AiAiFiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiAgBEIgiCEDIAMgBSABNQIkIhd+IARC/////w+DfCIEQiCIfCEDIAMgCCAVfiAEQv////8Pg3wiBEIgiHwhAyADIAogE34gBEL/////D4N8IgRCIIh8IQMgAyAMIBF+IARC/////w+DfCIEQiCIfCEDIAMgDiAPfiAEQv////8Pg3wiBEIgiHwhAyADIA0gEH4gBEL/////D4N8IgRCIIh8IQMgAyALIBJ+IARC/////w+DfCIEQiCIfCEDIAMgCSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAcgFn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIkIhggBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAUgATUCKCIZfiADQv////8Pg3wiA0IgiHwhBCAEIAggF34gA0L/////D4N8IgNCIIh8IQQgBCAKIBV+IANC/////w+DfCIDQiCIfCEEIAQgDCATfiADQv////8Pg3wiA0IgiHwhBCAEIA4gEX4gA0L/////D4N8IgNCIIh8IQQgBCAPIBB+IANC/////w+DfCIDQiCIfCEEIAQgDSASfiADQv////8Pg3wiA0IgiHwhBCAEIAsgFH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBZ+IANC/////w+DfCIDQiCIfCEEIAQgByAYfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AigiGiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiggBEIgiCEDIAMgBSABNQIsIht+IARC/////w+DfCIEQiCIfCEDIAMgCCAZfiAEQv////8Pg3wiBEIgiHwhAyADIAogF34gBEL/////D4N8IgRCIIh8IQMgAyAMIBV+IARC/////w+DfCIEQiCIfCEDIAMgDiATfiAEQv////8Pg3wiBEIgiHwhAyADIBAgEX4gBEL/////D4N8IgRCIIh8IQMgAyAPIBJ+IARC/////w+DfCIEQiCIfCEDIAMgDSAUfiAEQv////8Pg3wiBEIgiHwhAyADIAsgFn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBh+IARC/////w+DfCIEQiCIfCEDIAMgByAafiAEQv////8Pg3wiBEIgiHwhAyADIAA1AiwiBSAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AiwgA0IgiCEEIAQgCCAbfiADQv////8Pg3wiA0IgiHwhBCAEIAogGX4gA0L/////D4N8IgNCIIh8IQQgBCAMIBd+IANC/////w+DfCIDQiCIfCEEIAQgDiAVfiADQv////8Pg3wiA0IgiHwhBCAEIBAgE34gA0L/////D4N8IgNCIIh8IQQgBCARIBJ+IANC/////w+DfCIDQiCIfCEEIAQgDyAUfiADQv////8Pg3wiA0IgiHwhBCAEIA0gFn4gA0L/////D4N8IgNCIIh8IQQgBCALIBh+IANC/////w+DfCIDQiCIfCEEIAQgCSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgB34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIAogG34gBEL/////D4N8IgRCIIh8IQMgAyAMIBl+IARC/////w+DfCIEQiCIfCEDIAMgDiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBAgFX4gBEL/////D4N8IgRCIIh8IQMgAyASIBN+IARC/////w+DfCIEQiCIfCEDIAMgESAUfiAEQv////8Pg3wiBEIgiHwhAyADIA8gFn4gBEL/////D4N8IgRCIIh8IQMgAyANIBh+IARC/////w+DfCIEQiCIfCEDIAMgCyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI0IANCIIghBCAEIAwgG34gA0L/////D4N8IgNCIIh8IQQgBCAOIBl+IANC/////w+DfCIDQiCIfCEEIAQgECAXfiADQv////8Pg3wiA0IgiHwhBCAEIBIgFX4gA0L/////D4N8IgNCIIh8IQQgBCATIBR+IANC/////w+DfCIDQiCIfCEEIAQgESAWfiADQv////8Pg3wiA0IgiHwhBCAEIA8gGH4gA0L/////D4N8IgNCIIh8IQQgBCANIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSALfiADQv////8Pg3wiA0IgiHwhBCACIAM+AjggBEIgiCEDIAMgDiAbfiAEQv////8Pg3wiBEIgiHwhAyADIBAgGX4gBEL/////D4N8IgRCIIh8IQMgAyASIBd+IARC/////w+DfCIEQiCIfCEDIAMgFCAVfiAEQv////8Pg3wiBEIgiHwhAyADIBMgFn4gBEL/////D4N8IgRCIIh8IQMgAyARIBh+IARC/////w+DfCIEQiCIfCEDIAMgDyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgDX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgI8IANCIIghBCAEIBAgG34gA0L/////D4N8IgNCIIh8IQQgBCASIBl+IANC/////w+DfCIDQiCIfCEEIAQgFCAXfiADQv////8Pg3wiA0IgiHwhBCAEIBUgFn4gA0L/////D4N8IgNCIIh8IQQgBCATIBh+IANC/////w+DfCIDQiCIfCEEIAQgESAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgJAIARCIIghAyADIBIgG34gBEL/////D4N8IgRCIIh8IQMgAyAUIBl+IARC/////w+DfCIEQiCIfCEDIAMgFiAXfiAEQv////8Pg3wiBEIgiHwhAyADIBUgGH4gBEL/////D4N8IgRCIIh8IQMgAyATIBp+IARC/////w+DfCIEQiCIfCEDIAMgBSARfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AkQgA0IgiCEEIAQgFCAbfiADQv////8Pg3wiA0IgiHwhBCAEIBYgGX4gA0L/////D4N8IgNCIIh8IQQgBCAXIBh+IANC/////w+DfCIDQiCIfCEEIAQgFSAafiADQv////8Pg3wiA0IgiHwhBCAEIAUgE34gA0L/////D4N8IgNCIIh8IQQgAiADPgJIIARCIIghAyADIBYgG34gBEL/////D4N8IgRCIIh8IQMgAyAYIBl+IARC/////w+DfCIEQiCIfCEDIAMgFyAafiAEQv////8Pg3wiBEIgiHwhAyADIAUgFX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJMIANCIIghBCAEIBggG34gA0L/////D4N8IgNCIIh8IQQgBCAZIBp+IANC/////w+DfCIDQiCIfCEEIAQgBSAXfiADQv////8Pg3wiA0IgiHwhBCACIAM+AlAgBEIgiCEDIAMgGiAbfiAEQv////8Pg3wiBEIgiHwhAyADIAUgGX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgJUIANCIIghBCAEIAUgG34gA0L/////D4N8IgNCIIh8IQQgAiADPgJYIAIgBD4CXAu8GQEQfiADIAA1AgAiBiAGfiACQv////8Pg3wiAkIgiHwhAyABIAI+AgAgAyIEQiCIIQUgADUCBCIHIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CBCADIgRCIIghBSAANQIIIgggBn4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgByAHfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CCCADIgRCIIghBSAANQIMIgkgBn4iAkIgiCEDIAMgByAIfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CDCADIgRCIIghBSAANQIQIgogBn4iAkIgiCEDIAMgByAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAggCH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhAgAyIEQiCIIQUgADUCFCILIAZ+IgJCIIghAyADIAcgCn4gAkL/////D4N8IgJCIIh8IQMgAyAIIAl+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIUIAMiBEIgiCEFIAA1AhgiDCAGfiICQiCIIQMgAyAHIAt+IAJC/////w+DfCICQiCIfCEDIAMgCCAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAkgCX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhggAyIEQiCIIQUgADUCHCINIAZ+IgJCIIghAyADIAcgDH4gAkL/////D4N8IgJCIIh8IQMgAyAIIAt+IAJC/////w+DfCICQiCIfCEDIAMgCSAKfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CHCADIgRCIIghBSAANQIgIg4gBn4iAkIgiCEDIAMgByANfiACQv////8Pg3wiAkIgiHwhAyADIAggDH4gAkL/////D4N8IgJCIIh8IQMgAyAJIAt+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCiAKfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CICADIgRCIIghBSAANQIkIg8gBn4iAkIgiCEDIAMgByAOfiACQv////8Pg3wiAkIgiHwhAyADIAggDX4gAkL/////D4N8IgJCIIh8IQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAANQIoIhAgBn4iAkIgiCEDIAMgByAPfiACQv////8Pg3wiAkIgiHwhAyADIAggDn4gAkL/////D4N8IgJCIIh8IQMgAyAJIA1+IAJC/////w+DfCICQiCIfCEDIAMgCiAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAsgC34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiggAyIEQiCIIQUgADUCLCIRIAZ+IgJCIIghAyADIAcgEH4gAkL/////D4N8IgJCIIh8IQMgAyAIIA9+IAJC/////w+DfCICQiCIfCEDIAMgCSAOfiACQv////8Pg3wiAkIgiHwhAyADIAogDX4gAkL/////D4N8IgJCIIh8IQMgAyALIAx+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIsIAMiBEIgiCEFIAcgEX4iAkIgiCEDIAMgCCAQfiACQv////8Pg3wiAkIgiHwhAyADIAkgD34gAkL/////D4N8IgJCIIh8IQMgAyAKIA5+IAJC/////w+DfCICQiCIfCEDIAMgCyANfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgCCARfiICQiCIIQMgAyAJIBB+IAJC/////w+DfCICQiCIfCEDIAMgCiAPfiACQv////8Pg3wiAkIgiHwhAyADIAsgDn4gAkL/////D4N8IgJCIIh8IQMgAyAMIA1+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI0IAMiBEIgiCEFIAkgEX4iAkIgiCEDIAMgCiAQfiACQv////8Pg3wiAkIgiHwhAyADIAsgD34gAkL/////D4N8IgJCIIh8IQMgAyAMIA5+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDSANfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4COCADIgRCIIghBSAKIBF+IgJCIIghAyADIAsgEH4gAkL/////D4N8IgJCIIh8IQMgAyAMIA9+IAJC/////w+DfCICQiCIfCEDIAMgDSAOfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CPCADIgRCIIghBSALIBF+IgJCIIghAyADIAwgEH4gAkL/////D4N8IgJCIIh8IQMgAyANIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgDiAOfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CQCADIgRCIIghBSAMIBF+IgJCIIghAyADIA0gEH4gAkL/////D4N8IgJCIIh8IQMgAyAOIA9+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJEIAMiBEIgiCEFIA0gEX4iAkIgiCEDIAMgDiAQfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIA8gD34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AkggAyIEQiCIIQUgDiARfiICQiCIIQMgAyAPIBB+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgJMIAMiBEIgiCEFIA8gEX4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgECAQfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CUCADIgRCIIghBSAQIBF+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CVCADIgRCIIghBUIAIQJCACEDIAMgESARfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CWCABIAM+AlwLCgAgACAAIAEQCAtBACAAIAA1AAAgAXwiAT4AACABQiCIIQEDQCABUEUEQCAAQQRqIgA1AAAgAXwhASAAIAE+AAAgAUIgiCEBDAELCwuEBAIDfgF/IAAgA0GIASADGyIDEAAgAUEoEAAgAkHYACACGyIHEAFBuAEQAUEvIQBBLyEBA0AgAUEoai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBJWo1AABCAXwiBkIBUQRAQgBCAIAaCwNAAkADQCAAIANqLQAAIABBB0ZyRQRAIABBAWshAAwBCwsgACADakEHaykAACAGgCEFIAAgAWtBBGshAgNAIAVCgICAgHCDUCACQQBOcUUEQCAFQgiIIQUgAkEBaiECDAELCyAFUARAIANBKBAFRQ0BQgEhBUEAIQILQegBQSg1AAAgBX4iBD4AAEHsAUEsNQAAIAV+IARCIIh8IgQ+AABB8AFBMDUAACAFfiAEQiCIfCIEPgAAQfQBQTQ1AAAgBX4gBEIgiHwiBD4AAEH4AUE4NQAAIAV+IARCIIh8IgQ+AABB/AFBPDUAACAFfiAEQiCIfCIEPgAAQYACQcAANQAAIAV+IARCIIh8IgQ+AABBhAJBxAA1AAAgBX4gBEIgiHwiBD4AAEGIAkHIADUAACAFfiAEQiCIfCIEPgAAQYwCQcwANQAAIAV+IARCIIh8IgQ+AABBkAJB0AA1AAAgBX4gBEIgiHwiBD4AAEGUAkHUADUAACAFfiAEQiCIfD4AACADQegBIAJrIAMQBxogAiAHaiAFEAsMAQsLC44CAQp/QZgCIQNBmAIQAUHIAiEIIAFByAIQAEH4AiEJQfgCEANBqAMhBiAAQagDEABB2AMhC0GIBCEKQZgFIQQDQCAGEAJFBEAgCCAGIAsgChAMIAsgCUG4BBAIIAcEfyAFBH9BuAQgAxAFBH9BuAQgAyAEEAcaQQAFIANBuAQgBBAHGkEBCwVBuAQgAyAEEAYaQQELBSAFBH9BuAQgAyAEEAYaQQAFIANBuAQQBQR/IANBuAQgBBAHGkEABUG4BCADIAQQBxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACEAcaBSADIAIQAAsLCQAgAEGoBhAECywAIAAgASACEAYEQCACQcgFIAIQBxoFIAJByAUQBQRAIAJByAUgAhAHGgsLCxcAIAAgASACEAcEQCACQcgFIAIQBhoLCwsAQdgGIAAgARAQC8YhAQN+IAAgADUCAEL9//P/DyIEIAA1AgB+Qv////8PgyIDQcgFNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBzAU1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QdAFNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEHUBTUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB2AU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdwFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHgBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB5AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QegFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHsBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB8AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfQFNQIAIAN+fCICPgIsQfgIIAJCIIg+AgAgACAANQIEIAA1AgQgBH5C/////w+DIgNByAU1AgB+fCICPgIEIAAgADUCCCACQiCIfEHMBTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB0AU1AgAgA358IgI+AgwgACAANQIQIAJCIIh8QdQFNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEHYBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB3AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QeAFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHkBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB6AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QewFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHwBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB9AU1AgAgA358IgI+AjBB/AggAkIgiD4CACAAIAA1AgggADUCCCAEfkL/////D4MiA0HIBTUCAH58IgI+AgggACAANQIMIAJCIIh8QcwFNQIAIAN+fCICPgIMIAAgADUCECACQiCIfEHQBTUCACADfnwiAj4CECAAIAA1AhQgAkIgiHxB1AU1AgAgA358IgI+AhQgACAANQIYIAJCIIh8QdgFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHcBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB4AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QeQFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHoBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB7AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QfAFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEH0BTUCACADfnwiAj4CNEGACSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQcgFNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBzAU1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QdAFNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHUBTUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB2AU1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QdwFNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHgBTUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB5AU1AgAgA358IgI+AiggACAANQIsIAJCIIh8QegFNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEHsBTUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxB8AU1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QfQFNQIAIAN+fCICPgI4QYQJIAJCIIg+AgAgACAANQIQIAA1AhAgBH5C/////w+DIgNByAU1AgB+fCICPgIQIAAgADUCFCACQiCIfEHMBTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB0AU1AgAgA358IgI+AhggACAANQIcIAJCIIh8QdQFNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHYBTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB3AU1AgAgA358IgI+AiQgACAANQIoIAJCIIh8QeAFNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEHkBTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB6AU1AgAgA358IgI+AjAgACAANQI0IAJCIIh8QewFNQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEHwBTUCACADfnwiAj4COCAAIAA1AjwgAkIgiHxB9AU1AgAgA358IgI+AjxBiAkgAkIgiD4CACAAIAA1AhQgADUCFCAEfkL/////D4MiA0HIBTUCAH58IgI+AhQgACAANQIYIAJCIIh8QcwFNQIAIAN+fCICPgIYIAAgADUCHCACQiCIfEHQBTUCACADfnwiAj4CHCAAIAA1AiAgAkIgiHxB1AU1AgAgA358IgI+AiAgACAANQIkIAJCIIh8QdgFNQIAIAN+fCICPgIkIAAgADUCKCACQiCIfEHcBTUCACADfnwiAj4CKCAAIAA1AiwgAkIgiHxB4AU1AgAgA358IgI+AiwgACAANQIwIAJCIIh8QeQFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHoBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB7AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QfAFNQIAIAN+fCICPgI8IAAgADUC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AlRBoAkgAkIgiD4CACAAIAA1AiwgADUCLCAEfkL/////D4MiA0HIBTUCAH58IgI+AiwgACAANQIwIAJCIIh8QcwFNQIAIAN+fCICPgIwIAAgADUCNCACQiCIfEHQBTUCACADfnwiAj4CNCAAIAA1AjggAkIgiHxB1AU1AgAgA358IgI+AjggACAANQI8IAJCIIh8QdgFNQIAIAN+fCICPgI8IAAgADUCQCACQiCIfEHcBTUCACADfnwiAj4CQCAAIAA1AkQgAkIgiHxB4AU1AgAgA358IgI+AkQgACAANQJIIAJCIIh8QeQFNQIAIAN+fCICPgJIIAAgADUCTCACQiCIfEHoBTUCACADfnwiAj4CTCAAIAA1AlAgAkIgiHxB7AU1AgAgA358IgI+AlAgACAANQJUIAJCIIh8QfAFNQIAIAN+fCICPgJUIAAgADUCWCACQiCIfEH0BTUCACADfnwiAj4CWEGkCSACQiCIPgIAQfgIIABBMGogARAPC/Q+ARt+IAUgATUCACIEIAA1AgAiEn58IgNC/////w+DIQUgBiAANQIEIhMgBH58IANCIIh8IgNC/////w+DIQYgByAANQIIIhQgBH58IANCIIh8IgNC/////w+DIQcgCCAANQIMIhUgBH58IANCIIh8IgNC/////w+DIQggCSAANQIQIhYgBH58IANCIIh8IgNC/////w+DIQkgCiAANQIUIhcgBH58IANCIIh8IgNC/////w+DIQogCyAANQIYIhggBH58IANCIIh8IgNC/////w+DIQsgDCAANQIcIhkgBH58IANCIIh8IgNC/////w+DIQwgDSAANQIgIhogBH58IANCIIh8IgNC/////w+DIQ0gDiAANQIkIhsgBH58IANCIIh8IgNC/////w+DIQ4gDyAANQIoIhwgBH58IANCIIh8IgNC/////w+DIQ8gECAANQIsIh0gBH58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCBCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AggiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIMIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCECIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AhQiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIYIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCHCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiAiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgBSAFQv3/8/8PfkL/////D4MiBEKr1f7/D358QiCIIAYgBEL///vPC358fCIDQv////8PgyEFIAcgBEL//8+KC358IANCIIh8IgNC/////w+DIQYgCCAEQv7/r/UBfnwgA0IgiHwiA0L/////D4MhByAJIARCpOzDtQ9+fCADQiCIfCIDQv////8PgyEIIAogBEKgpcO5Bn58IANCIIh8IgNC/////w+DIQkgCyAEQr+llJwPfnwgA0IgiHwiA0L/////D4MhCiAMIARChJfdowZ+fCADQiCIfCIDQv////8PgyELIA0gBELX2a6aBH58IANCIIh8IgNC/////w+DIQwgDiAEQrbP7tgEfnwgA0IgiHwiA0L/////D4MhDSAPIARCms3/ywN+fCADQiCIfCIDQv////8PgyEOIBAgBELqo4TQAX58IANCIIh8IgNC/////w+DIQ8gESADQiCIfCEQIAUgEiABNQIkIgR+fCIDQv////8PgyEFIAYgBCATfnwgA0IgiHwiA0L/////D4MhBiAHIAQgFH58IANCIIh8IgNC/////w+DIQcgCCAEIBV+fCADQiCIfCIDQv////8PgyEIIAkgBCAWfnwgA0IgiHwiA0L/////D4MhCSAKIAQgF358IANCIIh8IgNC/////w+DIQogCyAEIBh+fCADQiCIfCIDQv////8PgyELIAwgBCAZfnwgA0IgiHwiA0L/////D4MhDCANIAQgGn58IANCIIh8IgNC/////w+DIQ0gDiAEIBt+fCADQiCIfCIDQv////8PgyEOIA8gBCAcfnwgA0IgiHwiA0L/////D4MhDyAQIAQgHX58IANCIIh8IgNC/////w+DIRAgA0IgiCERIAUgBUL9//P/D35C/////w+DIgRCq9X+/w9+fEIgiCAGIARC///7zwt+fHwiA0L/////D4MhBSAHIARC///Pigt+fCADQiCIfCIDQv////8PgyEGIAggBEL+/6/1AX58IANCIIh8IgNC/////w+DIQcgCSAEQqTsw7UPfnwgA0IgiHwiA0L/////D4MhCCAKIARCoKXDuQZ+fCADQiCIfCIDQv////8PgyEJIAsgBEK/pZScD358IANCIIh8IgNC/////w+DIQogDCAEQoSX3aMGfnwgA0IgiHwiA0L/////D4MhCyANIARC19mumgR+fCADQiCIfCIDQv////8PgyEMIA4gBEK2z+7YBH58IANCIIh8IgNC/////w+DIQ0gDyAEQprN/8sDfnwgA0IgiHwiA0L/////D4MhDiAQIARC6qOE0AF+fCADQiCIfCIDQv////8PgyEPIBEgA0IgiHwhECAFIBIgATUCKCIEfnwiA0L/////D4MhBSAGIAQgE358IANCIIh8IgNC/////w+DIQYgByAEIBR+fCADQiCIfCIDQv////8PgyEHIAggBCAVfnwgA0IgiHwiA0L/////D4MhCCAJIAQgFn58IANCIIh8IgNC/////w+DIQkgCiAEIBd+fCADQiCIfCIDQv////8PgyEKIAsgBCAYfnwgA0IgiHwiA0L/////D4MhCyAMIAQgGX58IANCIIh8IgNC/////w+DIQwgDSAEIBp+fCADQiCIfCIDQv////8PgyENIA4gBCAbfnwgA0IgiHwiA0L/////D4MhDiAPIAQgHH58IANCIIh8IgNC/////w+DIQ8gECAEIB1+fCADQiCIfCIDQv////8PgyEQIANCIIghESAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DIQUgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4MhBiAIIARC/v+v9QF+fCADQiCIfCIDQv////8PgyEHIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DIQggCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4MhCSALIARCv6WUnA9+fCADQiCIfCIDQv////8PgyEKIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DIQsgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4MhDCAOIARCts/u2AR+fCADQiCIfCIDQv////8PgyENIA8gBEKazf/LA358IANCIIh8IgNC/////w+DIQ4gECAEQuqjhNABfnwgA0IgiHwiA0L/////D4MhDyARIANCIIh8IRAgBSASIAE1AiwiBH58IgNC/////w+DIQUgBiAEIBN+fCADQiCIfCIDQv////8PgyEGIAcgBCAUfnwgA0IgiHwiA0L/////D4MhByAIIAQgFX58IANCIIh8IgNC/////w+DIQggCSAEIBZ+fCADQiCIfCIDQv////8PgyEJIAogBCAXfnwgA0IgiHwiA0L/////D4MhCiALIAQgGH58IANCIIh8IgNC/////w+DIQsgDCAEIBl+fCADQiCIfCIDQv////8PgyEMIA0gBCAafnwgA0IgiHwiA0L/////D4MhDSAOIAQgG358IANCIIh8IgNC/////w+DIQ4gDyAEIBx+fCADQiCIfCIDQv////8PgyEPIBAgBCAdfnwgA0IgiHwiA0L/////D4MhECADQiCIIREgAiAFIAVC/f/z/w9+Qv////8PgyIEQqvV/v8PfnxCIIggBiAEQv//+88Lfnx8IgNC/////w+DPgIAIAIgByAEQv//z4oLfnwgA0IgiHwiA0L/////D4M+AgQgAiAIIARC/v+v9QF+fCADQiCIfCIDQv////8Pgz4CCCACIAkgBEKk7MO1D358IANCIIh8IgNC/////w+DPgIMIAIgCiAEQqClw7kGfnwgA0IgiHwiA0L/////D4M+AhAgAiALIARCv6WUnA9+fCADQiCIfCIDQv////8Pgz4CFCACIAwgBEKEl92jBn58IANCIIh8IgNC/////w+DPgIYIAIgDSAEQtfZrpoEfnwgA0IgiHwiA0L/////D4M+AhwgAiAOIARCts/u2AR+fCADQiCIfCIDQv////8Pgz4CICACIA8gBEKazf/LA358IANCIIh8IgNC/////w+DPgIkIAIgECAEQuqjhNABfnwgA0IgiHwiA0L/////D4M+AiggAiARIANCIIh8PgIsIAJByAUQBQRAIAJByAUgAhAHGgsLiEABG34gCiAANQIAIhEgEX58IgJC/////w+DIQogECAANQIEIhMgEX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIRAgA0IgiEIBhiACQiCIfCAPIAA1AggiFCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIAA1AgwiFSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIAA1AhAiFiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQ0gA0IgiEIBhiACQiCIfCAMIAA1AhQiFyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AhgiGCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIAA1AhwiGSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAIIAA1AiAiGiARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIAA1AiQiGyARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AigiHCARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIBEgADUCLCIRfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIBIgAkIgiHwhEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIBAgEyATfnwiAkL/////D4MhECAPIBMgFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ8gA0IgiEIBhiACQiCIfCAOIBMgFX4iA0L/////D4NCAYZ8fCICQv////8PgyEOIANCIIhCAYYgAkIgiHwgDSATIBZ+IgNC/////w+DQgGGfHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgEyAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBMgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSATIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggEyAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBMgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiATIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA8gFCAUfnwiAkL/////D4MhDyAOIBQgFX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQ4gA0IgiEIBhiACQiCIfCANIBQgFn4iA0L/////D4NCAYZ8fCICQv////8PgyENIANCIIhCAYYgAkIgiHwgDCAUIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhDCADQiCIQgGGIAJCIIh8IAsgFCAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBQgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAUIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFCAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBQgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgDiAVIBV+fCICQv////8PgyEOIA0gFSAWfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhDSADQiCIQgGGIAJCIIh8IAwgFSAXfiIDQv////8Pg0IBhnx8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBUgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAVIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFSAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBUgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAVIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAVfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIA0gFiAWfnwiAkL/////D4MhDSAMIBYgF34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIBYgGH4iA0L/////D4NCAYZ8fCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCSAWIBl+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggFiAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBYgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAWIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAWfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAwgFyAXfnwiAkL/////D4MhDCALIBcgGH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAJIBcgGX4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgCCAXIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhCCADQiCIQgGGIAJCIIh8IAcgFyAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBcgHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBd+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgCyAYIBh+fCICQv////8PgyELIAkgGCAZfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAggGCAafiIDQv////8Pg0IBhnx8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBggG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAYIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAYfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAkgGSAZfnwiAkL/////D4MhCSAIIBkgGn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQggA0IgiEIBhiACQiCIfCAHIBkgG34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAZIBx+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAZfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAggGiAafnwiAkL/////D4MhCCAHIBogG34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBogHH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCARIBp+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCESIAogCkL9//P/D35C/////w+DIgNCq9X+/w9+fEIgiCAQIANC///7zwt+fHwiAkL/////D4MhCiAPIANC///Pigt+fCACQiCIfCICQv////8PgyEQIA4gA0L+/6/1AX58IAJCIIh8IgJC/////w+DIQ8gDSADQqTsw7UPfnwgAkIgiHwiAkL/////D4MhDiAMIANCoKXDuQZ+fCACQiCIfCICQv////8PgyENIAsgA0K/pZScD358IAJCIIh8IgJC/////w+DIQwgCSADQoSX3aMGfnwgAkIgiHwiAkL/////D4MhCyAIIANC19mumgR+fCACQiCIfCICQv////8PgyEJIAcgA0K2z+7YBH58IAJCIIh8IgJC/////w+DIQggBiADQprN/8sDfnwgAkIgiHwiAkL/////D4MhByAEIANC6qOE0AF+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCASIAJCIIh8IQUgByAbIBt+fCICQv////8PgyEHIAYgGyAcfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgESAbfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAYgHCAcfnwiAkL/////D4MhBiAEIBEgHH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghEiAKIApC/f/z/w9+Qv////8PgyIDQqvV/v8PfnxCIIggECADQv//+88Lfnx8IgJC/////w+DIQogDyADQv//z4oLfnwgAkIgiHwiAkL/////D4MhECAOIANC/v+v9QF+fCACQiCIfCICQv////8PgyEPIA0gA0Kk7MO1D358IAJCIIh8IgJC/////w+DIQ4gDCADQqClw7kGfnwgAkIgiHwiAkL/////D4MhDSALIANCv6WUnA9+fCACQiCIfCICQv////8PgyEMIAkgA0KEl92jBn58IAJCIIh8IgJC/////w+DIQsgCCADQtfZrpoEfnwgAkIgiHwiAkL/////D4MhCSAHIANCts/u2AR+fCACQiCIfCICQv////8PgyEIIAYgA0Kazf/LA358IAJCIIh8IgJC/////w+DIQcgBCADQuqjhNABfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgEiACQiCIfCEFIAQgESARfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCESIAEgCiAKQv3/8/8PfkL/////D4MiA0Kr1f7/D358QiCIIBAgA0L///vPC358fCICQv////8Pgz4CACABIA8gA0L//8+KC358IAJCIIh8IgJC/////w+DPgIEIAEgDiADQv7/r/UBfnwgAkIgiHwiAkL/////D4M+AgggASANIANCpOzDtQ9+fCACQiCIfCICQv////8Pgz4CDCABIAwgA0KgpcO5Bn58IAJCIIh8IgJC/////w+DPgIQIAEgCyADQr+llJwPfnwgAkIgiHwiAkL/////D4M+AhQgASAJIANChJfdowZ+fCACQiCIfCICQv////8Pgz4CGCABIAggA0LX2a6aBH58IAJCIIh8IgJC/////w+DPgIcIAEgByADQrbP7tgEfnwgAkIgiHwiAkL/////D4M+AiAgASAGIANCms3/ywN+fCACQiCIfCICQv////8Pgz4CJCABIAQgA0Lqo4TQAX58IAJCIIh8IgJC/////w+DPgIoIAEgBSACQiCIfCICQv////8Pgz4CLCASIAJCIIh8pwRAIAFByAUgARAHGgUgAUHIBRAFBEAgAUHIBSABEAcaCwsLCgAgACAAIAEQEwsLACAAQfgFIAEQEwsVACAAQfgREABBqBIQAUH4ESABEBILEQAgAEHYEhAXQdgSQbgHEAULIwAgABACBEBBAA8LIABBiBMQF0GIE0G4BxAFBEBBfw8LQQELFwAgACABEBcgAUHIBSABEA0gASABEBYLCQBBqAYgABAAC7wBAQJ/IAIQAUEwIQMDQCABIANPBEAgA0EwRgRAQbgTEBsFQbgTQfgFQbgTEBMLIABBuBNB6BMQEyACQegTIAIQDyAAQTBqIQAgA0EwaiEDDAELCyABQTBwIgRFBEAPC0HoExABQQAhAQNAIAEgBEZFBEAgASAALQAAOgDoEyAAQQFqIQAgAUEBaiEBDAELCyADQTBGBEBBuBMQGwVBuBNB+AVBuBMQEwtB6BNBuBNB6BMQEyACQegTIAIQDwscACABIAJBmBQQHEGYFEGYFBAWIABBmBQgAxATC+EBAQJ/QQBBACgCACIFIAJBAWpBMGxqNgIAIAUQGyAFQTBqIQUDQCACIAZHBEAgABACBEAgBUEwayAFEAAFIAAgBUEwayAFEBMLIAAgAWohACAFQTBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBMGsiBSAFEBoDQCAGBEAgABACBEAgBSAFQTBrEAAgAhABBSAFQTBrQcgUEAAgBSAAIAVBMGsQEyAFQcgUIAIQEwsgACABayEAIAIgBGshAiAFQTBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEBYgAEEwaiEAIAJBMGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhAXIABBMGohACACQTBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADEBsPCyAAQfgUEAAgAxAbA0AgAkEBayICIAFqLQAAIQAgAyADEBQgAEGAAU8EQCADQfgUIAMQEyAAQYABayEACyADIAMQFCAAQcAATwRAIANB+BQgAxATIABBQGohAAsgAyADEBQgAEEgTwRAIANB+BQgAxATIABBIGshAAsgAyADEBQgAEEQTwRAIANB+BQgAxATIABBEGshAAsgAyADEBQgAEEITwRAIANB+BQgAxATIABBCGshAAsgAyADEBQgAEEETwRAIANB+BQgAxATIABBBGshAAsgAyADEBQgAEECTwRAIANB+BQgAxATIABBAmshAAsgAyADEBQgAARAIANB+BQgAxATCyACDQALC9UBAQF/IAAQAgRAIAEQAQ8LQQEhAkGYCEGoFRAAIABB6AdBMEHYFRAhIABByAhBMEGIFhAhA0BB2BVBqAYQBEUEQEHYFUG4FhAUQQEhAANAQbgWQagGEARFBEBBuBZBuBYQFCAAQQFqIQAMAQsLQagVQegWEAAgAiAAa0EBayECA0AgAgRAQegWQegWEBQgAkEBayECDAELCyAAIQJB6BZBqBUQFEHYFUGoFUHYFRATQYgWQegWQYgWEBMMAQsLQYgWEBgEQEGIFiABEBEFQYgWIAEQAAsLIAAgABACBEBBAQ8LIABBiAdBMEGYFxAhQZgXQagGEAQLKgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYCx4AIABCADcDACAAQgA3AwggAEIANwMQIABCADcDGAssACAAKQMYUAR+IAApAxBQBH4gACkDCFAEfiAAKQMABUIBCwVCAQsFQgELUAseACAAQgE3AwAgAEIANwMIIABCADcDECAAQgA3AxgLQAAgACkDGCABKQMYUQR/IAApAxAgASkDEFEEfyAAKQMIIAEpAwhRBH8gACkDACABKQMAUQVBAAsFQQALBUEACwtzACAAKQMYIAEpAxhUBH9BAAUgACkDGCABKQMYVgR/QQEFIAApAxAgASkDEFQEf0EABSAAKQMQIAEpAxBWBH9BAQUgACkDCCABKQMIVAR/QQAFIAApAwggASkDCFYEf0EBBSAAKQMAIAEpAwBaCwsLCwsLC8QBAQF+IAIgADUCACABNQIAfCIDPgIAIAIgADUCBCABNQIEfCADQiCIfCIDPgIEIAIgADUCCCABNQIIfCADQiCIfCIDPgIIIAIgADUCDCABNQIMfCADQiCIfCIDPgIMIAIgADUCECABNQIQfCADQiCIfCIDPgIQIAIgADUCFCABNQIUfCADQiCIfCIDPgIUIAIgADUCGCABNQIYfCADQiCIfCIDPgIYIAIgADUCHCABNQIcfCADQiCIfCIDPgIcIANCIIinC/wBAQF+IAIgADUCACABNQIAfSIDQv////8Pgz4CACACIAA1AgQgATUCBH0gA0Igh3wiA0L/////D4M+AgQgAiAANQIIIAE1Agh9IANCIId8IgNC/////w+DPgIIIAIgADUCDCABNQIMfSADQiCHfCIDQv////8Pgz4CDCACIAA1AhAgATUCEH0gA0Igh3wiA0L/////D4M+AhAgAiAANQIUIAE1AhR9IANCIId8IgNC/////w+DPgIUIAIgADUCGCABNQIYfSADQiCHfCIDQv////8Pgz4CGCACIAA1AhwgATUCHH0gA0Igh3wiA0L/////D4M+AhwgA0Igh6cL5g4BEX4gBCAANQIAIgUgATUCACIGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgAgBEIgiCEDIAMgBSABNQIEIgd+IARC/////w+DfCIEQiCIfCEDIAMgADUCBCIIIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CBCADQiCIIQQgBCAFIAE1AggiCX4gA0L/////D4N8IgNCIIh8IQQgBCAHIAh+IANC/////w+DfCIDQiCIfCEEIAQgADUCCCIKIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CCCAEQiCIIQMgAyAFIAE1AgwiC34gBEL/////D4N8IgRCIIh8IQMgAyAIIAl+IARC/////w+DfCIEQiCIfCEDIAMgByAKfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgwiDCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgwgA0IgiCEEIAQgBSABNQIQIg1+IANC/////w+DfCIDQiCIfCEEIAQgCCALfiADQv////8Pg3wiA0IgiHwhBCAEIAkgCn4gA0L/////D4N8IgNCIIh8IQQgBCAHIAx+IANC/////w+DfCIDQiCIfCEEIAQgADUCECIOIAZ+IANC/////w+DfCIDQiCIfCEEIAIgAz4CECAEQiCIIQMgAyAFIAE1AhQiD34gBEL/////D4N8IgRCIIh8IQMgAyAIIA1+IARC/////w+DfCIEQiCIfCEDIAMgCiALfiAEQv////8Pg3wiBEIgiHwhAyADIAkgDH4gBEL/////D4N8IgRCIIh8IQMgAyAHIA5+IARC/////w+DfCIEQiCIfCEDIAMgADUCFCIQIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CFCADQiCIIQQgBCAFIAE1AhgiEX4gA0L/////D4N8IgNCIIh8IQQgBCAIIA9+IANC/////w+DfCIDQiCIfCEEIAQgCiANfiADQv////8Pg3wiA0IgiHwhBCAEIAsgDH4gA0L/////D4N8IgNCIIh8IQQgBCAJIA5+IANC/////w+DfCIDQiCIfCEEIAQgByAQfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhgiEiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhggBEIgiCEDIAMgBSABNQIcIhN+IARC/////w+DfCIEQiCIfCEDIAMgCCARfiAEQv////8Pg3wiBEIgiHwhAyADIAogD34gBEL/////D4N8IgRCIIh8IQMgAyAMIA1+IARC/////w+DfCIEQiCIfCEDIAMgCyAOfiAEQv////8Pg3wiBEIgiHwhAyADIAkgEH4gBEL/////D4N8IgRCIIh8IQMgAyAHIBJ+IARC/////w+DfCIEQiCIfCEDIAMgADUCHCIFIAZ+IARC/////w+DfCIEQiCIfCEDIAIgBD4CHCADQiCIIQQgBCAIIBN+IANC/////w+DfCIDQiCIfCEEIAQgCiARfiADQv////8Pg3wiA0IgiHwhBCAEIAwgD34gA0L/////D4N8IgNCIIh8IQQgBCANIA5+IANC/////w+DfCIDQiCIfCEEIAQgCyAQfiADQv////8Pg3wiA0IgiHwhBCAEIAkgEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAd+IANC/////w+DfCIDQiCIfCEEIAIgAz4CICAEQiCIIQMgAyAKIBN+IARC/////w+DfCIEQiCIfCEDIAMgDCARfiAEQv////8Pg3wiBEIgiHwhAyADIA4gD34gBEL/////D4N8IgRCIIh8IQMgAyANIBB+IARC/////w+DfCIEQiCIfCEDIAMgCyASfiAEQv////8Pg3wiBEIgiHwhAyADIAUgCX4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIkIANCIIghBCAEIAwgE34gA0L/////D4N8IgNCIIh8IQQgBCAOIBF+IANC/////w+DfCIDQiCIfCEEIAQgDyAQfiADQv////8Pg3wiA0IgiHwhBCAEIA0gEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIAt+IANC/////w+DfCIDQiCIfCEEIAIgAz4CKCAEQiCIIQMgAyAOIBN+IARC/////w+DfCIEQiCIfCEDIAMgECARfiAEQv////8Pg3wiBEIgiHwhAyADIA8gEn4gBEL/////D4N8IgRCIIh8IQMgAyAFIA1+IARC/////w+DfCIEQiCIfCEDIAIgBD4CLCADQiCIIQQgBCAQIBN+IANC/////w+DfCIDQiCIfCEEIAQgESASfiADQv////8Pg3wiA0IgiHwhBCAEIAUgD34gA0L/////D4N8IgNCIIh8IQQgAiADPgIwIARCIIghAyADIBIgE34gBEL/////D4N8IgRCIIh8IQMgAyAFIBF+IARC/////w+DfCIEQiCIfCEDIAIgBD4CNCADQiCIIQQgBCAFIBN+IANC/////w+DfCIDQiCIfCEEIAIgAz4COCACIAQ+AjwLzg0BDH4gAyAANQIAIgYgBn4gAkL/////D4N8IgJCIIh8IQMgASACPgIAIAMiBEIgiCEFIAA1AgQiByAGfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgQgAyIEQiCIIQUgADUCCCIIIAZ+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAcgB34gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgggAyIEQiCIIQUgADUCDCIJIAZ+IgJCIIghAyADIAcgCH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AgwgAyIEQiCIIQUgADUCECIKIAZ+IgJCIIghAyADIAcgCX4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAIIAh+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIQIAMiBEIgiCEFIAA1AhQiCyAGfiICQiCIIQMgAyAHIAp+IAJC/////w+DfCICQiCIfCEDIAMgCCAJfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CFCADIgRCIIghBSAANQIYIgwgBn4iAkIgiCEDIAMgByALfiACQv////8Pg3wiAkIgiHwhAyADIAggCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAJIAl+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIYIAMiBEIgiCEFIAA1AhwiDSAGfiICQiCIIQMgAyAHIAx+IAJC/////w+DfCICQiCIfCEDIAMgCCALfiACQv////8Pg3wiAkIgiHwhAyADIAkgCn4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhwgAyIEQiCIIQUgByANfiICQiCIIQMgAyAIIAx+IAJC/////w+DfCICQiCIfCEDIAMgCSALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAogCn4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiAgAyIEQiCIIQUgCCANfiICQiCIIQMgAyAJIAx+IAJC/////w+DfCICQiCIfCEDIAMgCiALfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CJCADIgRCIIghBSAJIA1+IgJCIIghAyADIAogDH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyALIAt+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIoIAMiBEIgiCEFIAogDX4iAkIgiCEDIAMgCyAMfiACQv////8Pg3wiAkIgiHxCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CLCADIgRCIIghBSALIA1+IgJCIIhCAYYgAkL/////D4NCAYYiAkIgiHwhAyADIAwgDH4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjAgAyIEQiCIIQUgDCANfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjQgAyIEQiCIIQVCACECQgAhAyADIA0gDX4gAkL/////D4N8IgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AjggASADPgI8CwoAIAAgACABECwLsgMCA34BfyAAIANBiBggAxsiAxAkIAFByBcQJCACQegXIAIbIgcQJUGoGBAlQR8hAEEfIQEDQCABQcgXai0AACABQQNGckUEQCABQQFrIQEMAQsLIAFBxRdqNQAAQgF8IgZCAVEEQEIAQgCAGgsDQAJAA0AgACADai0AACAAQQdGckUEQCAAQQFrIQAMAQsLIAAgA2pBB2spAAAgBoAhBCAAIAFrQQRrIQIDQCAEQoCAgIBwg1AgAkEATnFFBEAgBEIIiCEEIAJBAWohAgwBCwsgBFAEQCADQcgXEClFDQFCASEEQQAhAgtByBhByBc1AAAgBH4iBT4AAEHMGEHMFzUAACAEfiAFQiCIfCIFPgAAQdAYQdAXNQAAIAR+IAVCIIh8IgU+AABB1BhB1Bc1AAAgBH4gBUIgiHwiBT4AAEHYGEHYFzUAACAEfiAFQiCIfCIFPgAAQdwYQdwXNQAAIAR+IAVCIIh8IgU+AABB4BhB4Bc1AAAgBH4gBUIgiHwiBT4AAEHkGEHkFzUAACAEfiAFQiCIfD4AACADQcgYIAJrIAMQKxogAiAHaiAEEAsMAQsLC44CAQp/QegYIQNB6BgQJUGIGSEIIAFBiBkQJEGoGSEJQagZECdByBkhBiAAQcgZECRB6BkhC0GIGiEKQegaIQQDQCAGECZFBEAgCCAGIAsgChAvIAsgCUGoGhAsIAcEfyAFBH9BqBogAxApBH9BqBogAyAEECsaQQAFIANBqBogBBArGkEBCwVBqBogAyAEECoaQQELBSAFBH9BqBogAyAEECoaQQAFIANBqBoQKQR/IANBqBogBBArGkEABUGoGiADIAQQKxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACECsaBSADIAIQJAsLCQAgAEHIGxAoCywAIAAgASACECoEQCACQYgbIAIQKxoFIAJBiBsQKQRAIAJBiBsgAhArGgsLCxcAIAAgASACECsEQCACQYgbIAIQKhoLCwsAQegbIAAgARAzC7YPAQN+IAAgADUCAEL/////DyIEIAA1AgB+Qv////8PgyIDQYgbNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxBjBs1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QZAbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGUGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBmBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGgGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBpBs1AgAgA358IgI+AhxBqB0gAkIgiD4CACAAIAA1AgQgADUCBCAEfkL/////D4MiA0GIGzUCAH58IgI+AgQgACAANQIIIAJCIIh8QYwbNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEGQGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBlBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZgbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGcGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBoBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaQbNQIAIAN+fCICPgIgQawdIAJCIIg+AgAgACAANQIIIAA1AgggBH5C/////w+DIgNBiBs1AgB+fCICPgIIIAAgADUCDCACQiCIfEGMGzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxBkBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZQbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGYGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBnBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QaAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGkGzUCACADfnwiAj4CJEGwHSACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxBjBs1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QZAbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGUGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBmBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGgGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBpBs1AgAgA358IgI+AihBtB0gAkIgiD4CACAAIAA1AhAgADUCECAEfkL/////D4MiA0GIGzUCAH58IgI+AhAgACAANQIUIAJCIIh8QYwbNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGQGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBlBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZgbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGcGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBoBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaQbNQIAIAN+fCICPgIsQbgdIAJCIIg+AgAgACAANQIUIAA1AhQgBH5C/////w+DIgNBiBs1AgB+fCICPgIUIAAgADUCGCACQiCIfEGMGzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBkBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZQbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGYGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBnBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QaAbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGkGzUCACADfnwiAj4CMEG8HSACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQYgbNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxBjBs1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QZAbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGUGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBmBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZwbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGgGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBpBs1AgAgA358IgI+AjRBwB0gAkIgiD4CACAAIAA1AhwgADUCHCAEfkL/////D4MiA0GIGzUCAH58IgI+AhwgACAANQIgIAJCIIh8QYwbNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGQGzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBlBs1AgAgA358IgI+AiggACAANQIsIAJCIIh8QZgbNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGcGzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBoBs1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QaQbNQIAIAN+fCICPgI4QcQdIAJCIIg+AgBBqB0gAEEgaiABEDILiBwBE34gBSABNQIAIgQgADUCACIOfnwiA0L/////D4MhBSAGIAA1AgQiDyAEfnwgA0IgiHwiA0L/////D4MhBiAHIAA1AggiECAEfnwgA0IgiHwiA0L/////D4MhByAIIAA1AgwiESAEfnwgA0IgiHwiA0L/////D4MhCCAJIAA1AhAiEiAEfnwgA0IgiHwiA0L/////D4MhCSAKIAA1AhQiEyAEfnwgA0IgiHwiA0L/////D4MhCiALIAA1AhgiFCAEfnwgA0IgiHwiA0L/////D4MhCyAMIAA1AhwiFSAEfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIEIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIIIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIMIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIQIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIUIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIYIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8PfkL/////D4MiBHxCIIggBiAEQv////8Pfnx8IgNC/////w+DIQUgByAEQv63+f8PfnwgA0IgiHwiA0L/////D4MhBiAIIARCgsj2nQV+fCADQiCIfCIDQv////8PgyEHIAkgBEKFsIfNAH58IANCIIh8IgNC/////w+DIQggCiAEQoiw55kDfnwgA0IgiHwiA0L/////D4MhCSALIARCyPr1zAJ+fCADQiCIfCIDQv////8PgyEKIAwgBELTzrafB358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIcIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gAiAFIAVC/////w9+Qv////8PgyIEfEIgiCAGIARC/////w9+fHwiA0L/////D4M+AgAgAiAHIARC/rf5/w9+fCADQiCIfCIDQv////8Pgz4CBCACIAggBEKCyPadBX58IANCIIh8IgNC/////w+DPgIIIAIgCSAEQoWwh80AfnwgA0IgiHwiA0L/////D4M+AgwgAiAKIARCiLDnmQN+fCADQiCIfCIDQv////8Pgz4CECACIAsgBELI+vXMAn58IANCIIh8IgNC/////w+DPgIUIAIgDCAEQtPOtp8HfnwgA0IgiHwiA0L/////D4M+AhggAiANIANCIIh8PgIcIAJBiBsQKQRAIAJBiBsgAhArGgsLsB0BE34gCCAANQIAIg0gDX58IgJC/////w+DIQggDCAANQIEIg8gDX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AggiECANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIAA1AgwiESANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIAA1AhAiEiANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIAA1AhQiEyANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AhgiFCANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gADUCHCINfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIA4gAkIgiHwhDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAwgDyAPfnwiAkL/////D4MhDCALIA8gEH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIA8gEX4iA0L/////D4NCAYZ8fCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAPIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgDyATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIA8gFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIA9+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgCyAQIBB+fCICQv////8PgyELIAogECARfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgECASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBAgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAQIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAQfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAogESARfnwiAkL/////D4MhCiAJIBEgEn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBEgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAkgEiASfnwiAkL/////D4MhCSAHIBIgE34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBIgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////D35C/////w+DIgN8QiCIIAwgA0L/////D358fCICQv////8PgyEIIAsgA0L+t/n/D358IAJCIIh8IgJC/////w+DIQwgCiADQoLI9p0FfnwgAkIgiHwiAkL/////D4MhCyAJIANChbCHzQB+fCACQiCIfCICQv////8PgyEKIAcgA0KIsOeZA358IAJCIIh8IgJC/////w+DIQkgBiADQsj69cwCfnwgAkIgiHwiAkL/////D4MhByAEIANC0862nwd+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgByATIBN+fCICQv////8PgyEHIAYgEyAUfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAYgFCAUfnwiAkL/////D4MhBiAEIA0gFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w9+Qv////8PgyIDfEIgiCAMIANC/////w9+fHwiAkL/////D4MhCCALIANC/rf5/w9+fCACQiCIfCICQv////8PgyEMIAogA0KCyPadBX58IAJCIIh8IgJC/////w+DIQsgCSADQoWwh80AfnwgAkIgiHwiAkL/////D4MhCiAHIANCiLDnmQN+fCACQiCIfCICQv////8PgyEJIAYgA0LI+vXMAn58IAJCIIh8IgJC/////w+DIQcgBCADQtPOtp8HfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAQgDSANfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCEOIAEgCCAIQv////8PfkL/////D4MiA3xCIIggDCADQv////8Pfnx8IgJC/////w+DPgIAIAEgCyADQv63+f8PfnwgAkIgiHwiAkL/////D4M+AgQgASAKIANCgsj2nQV+fCACQiCIfCICQv////8Pgz4CCCABIAkgA0KFsIfNAH58IAJCIIh8IgJC/////w+DPgIMIAEgByADQoiw55kDfnwgAkIgiHwiAkL/////D4M+AhAgASAGIANCyPr1zAJ+fCACQiCIfCICQv////8Pgz4CFCABIAQgA0LTzrafB358IAJCIIh8IgJC/////w+DPgIYIAEgBSACQiCIfCICQv////8Pgz4CHCAOIAJCIIh8pwRAIAFBiBsgARArGgUgAUGIGxApBEAgAUGIGyABECsaCwsLCgAgACAAIAEQNgsLACAAQagbIAEQNgsVACAAQaghECRByCEQJUGoISABEDULEQAgAEHoIRA6QeghQagcECkLIwAgABAmBEBBAA8LIABBiCIQOkGIIkGoHBApBEBBfw8LQQELFwAgACABEDogAUGIGyABEDAgASABEDkLCQBByBsgABAkC7wBAQJ/IAIQJUEgIQMDQCABIANPBEAgA0EgRgRAQagiED4FQagiQagbQagiEDYLIABBqCJByCIQNiACQcgiIAIQMiAAQSBqIQAgA0EgaiEDDAELCyABQR9xIgRFBEAPC0HIIhAlQQAhAQNAIAEgBEZFBEAgASAALQAAOgDIIiAAQQFqIQAgAUEBaiEBDAELCyADQSBGBEBBqCIQPgVBqCJBqBtBqCIQNgtByCJBqCJByCIQNiACQcgiIAIQMgscACABIAJB6CIQP0HoIkHoIhA5IABB6CIgAxA2C+EBAQJ/QQBBACgCACIFIAJBAWpBBXRqNgIAIAUQPiAFQSBqIQUDQCACIAZHBEAgABAmBEAgBUEgayAFECQFIAAgBUEgayAFEDYLIAAgAWohACAFQSBqIQUgBkEBaiEGDAELCyAAIAFrIQAgAyACQQFrIARsaiECIAVBIGsiBSAFED0DQCAGBEAgABAmBEAgBSAFQSBrECQgAhAlBSAFQSBrQYgjECQgBSAAIAVBIGsQNiAFQYgjIAIQNgsgACABayEAIAIgBGshAiAFQSBrIQUgBkEBayEGDAELC0EAIAU2AgALLQEBfwNAIAEgA0ZFBEAgACACEDkgAEEgaiEAIAJBIGohAiADQQFqIQMMAQsLCy0BAX8DQCABIANGRQRAIAAgAhA6IABBIGohACACQSBqIQIgA0EBaiEDDAELCwuXAgAgAkUEQCADED4PCyAAQagjECQgAxA+A0AgAkEBayICIAFqLQAAIQAgAyADEDcgAEGAAU8EQCADQagjIAMQNiAAQYABayEACyADIAMQNyAAQcAATwRAIANBqCMgAxA2IABBQGohAAsgAyADEDcgAEEgTwRAIANBqCMgAxA2IABBIGshAAsgAyADEDcgAEEQTwRAIANBqCMgAxA2IABBEGshAAsgAyADEDcgAEEITwRAIANBqCMgAxA2IABBCGshAAsgAyADEDcgAEEETwRAIANBqCMgAxA2IABBBGshAAsgAyADEDcgAEECTwRAIANBqCMgAxA2IABBAmshAAsgAyADEDcgAARAIANBqCMgAxA2CyACDQALC9UBAQF/IAAQJgRAIAEQJQ8LQSAhAkHoHEHIIxAkIABByBxBIEHoIxBEIABBiB1BIEGIJBBEA0BB6CNByBsQKEUEQEHoI0GoJBA3QQEhAANAQagkQcgbEChFBEBBqCRBqCQQNyAAQQFqIQAMAQsLQcgjQcgkECQgAiAAa0EBayECA0AgAgRAQcgkQcgkEDcgAkEBayECDAELCyAAIQJByCRByCMQN0HoI0HII0HoIxA2QYgkQcgkQYgkEDYMAQsLQYgkEDsEQEGIJCABEDQFQYgkIAEQJAsLIAAgABAmBEBBAQ8LIABBiBxBIEHoJBBEQegkQcgbECgLFQAgACABQYglEDZBiCVBqBsgAhA2CwoAIAAgACABEEcLCwAgAEGIGyABEDALCQAgAEGoHBApCw4AIAAQAiAAQTBqEAJxCwoAIABB4ABqEAILDQAgABABIABBMGoQAQsVACAAEAEgAEEwahAbIABB4ABqEAELegAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1gLugEAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGCABIAApAyA3AyAgASAAKQMoNwMoIAEgACkDMDcDMCABIAApAzg3AzggASAAKQNANwNAIAEgACkDSDcDSCABIAApA1A3A1AgASAAKQNYNwNYIAEgACkDYDcDYCABIAApA2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIAQsoACAAEEsEQCABEE4FIAFB4ABqEBsgAEEwaiABQTBqEAAgACABEAALCxUAIAAgARAEIABBMGogAUEwahAEcQtyAQF/IAAQTARAIAEQSw8LIAEQSwRAQQAPCyAAQeAAaiICEA4EQCAAIAEQUg8LIAJB2CUQFCABQdglQYgmEBMgAkHYJUG4JhATIAFBMGpBuCZB6CYQEyAAQYgmEAQEQCAAQTBqQegmEAQE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AEEwaiABQTBqEBELIgAgACABEAAgAEEwaiABQTBqEBEgAEHgAGogAUHgAGoQAAsSACABQeg+EFogAEHoPiACEFcLEgAgAUH4PxBaIABB+D8gAhBYCxQAIAFBiMEAEFsgAEGIwQAgAhBZCxQAIAAgARAXIABBMGogAUEwahAXCyIAIAAgARAXIABBMGogAUEwahAXIABB4ABqIAFB4ABqEBcLFAAgACABEBYgAEEwaiABQTBqEBYLIgAgACABEBYgAEEwaiABQTBqEBYgAEHgAGogAUHgAGoQFgtTACAAEEwEQCABEAEgAUEwahABBSAAQeAAakGYwgAQGkGYwgBByMIAEBRBmMIAQcjCAEH4wgAQEyAAQcjCACABEBMgAEEwakH4wgAgAUEwahATCws4ACAAQTBqQajDABAUIABB2MMAEBQgAEHYwwBB2MMAEBNB2MMAQaglQdjDABAPQajDAEHYwwAQBAsQACAAQYjEABBjQYjEABBkC5gBAQN/QQBBACgCACIEIAFBMGxqNgIAIABB4ABqQZABIAEgBEEwEB4gBCEDA0AgASAFRwRAIAMQAgRAIAIQASACQTBqEAEFIAMgAEEwakHoxAAQEyADIAMQFCADIAAgAhATIANB6MQAIAJBMGoQEwsgAEGQAWohACACQeAAaiECIANBMGohAyAFQQFqIQUMAQsLQQAgBDYCAAtUACAAEEwEQCABEE4FIABB4ABqQZjFABAaQZjFAEHIxQAQFEGYxQBByMUAQfjFABATIABByMUAIAEQEyAAQTBqQfjFACABQTBqEBMgAUHgAGoQGwsLMgAgASACakEBayEBA0AgASACSEUEQCABIAAtAAA6AAAgAUEBayEBIABBAWohAAwBCwsLLQAgABBLBEAgARBNDwsgAEGoxgAQX0GoxgBBMCABEGhB2MYAQTAgAUEwahBoC0MAIAAQSwRAIAEQASABQcAAOgAADwsgAEGIxwAQF0GIxwBBMCABEGggAEEwahAZQX9GBEAgASABLQAAQYABcjoAAAsLMgAgAC0AAEHAAHEEQCABEE0PCyAAQTBBuMcAEGggAEEwakEwQejHABBoQbjHACABEGELwQEBAn8gAC0AACICQcAAcQRAIAEQTQ8LIAJBgAFxIQMgAEHIyAAQAEHIyAAgAkE/cToAAEHIyABBMEGYyAAQaEGYyAAg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A2g3A2ggASAAKQNwNwNwIAEgACkDeDcDeCABIAApA4ABNwOAASABIAApA4gBNwOIASABIAApA5ABNwOQASABIAApA5gBNwOYASABIAApA6ABNwOgASABIAApA6gBNwOoASABIAApA7ABNwOwASABIAApA7gBNwO4AQuSAwAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1ggASAAKQNgNwNgIAEgACkDaDcDaCABIAApA3A3A3AgASAAKQN4NwN4IAEgACkDgAE3A4ABIAEgACkDiAE3A4gBIAEgACkDkAE3A5ABIAEgACkDmAE3A5gBIAEgACkDoAE3A6ABIAEgACkDqAE3A6gBIAEgACkDsAE3A7ABIAEgACkDuAE3A7gBIAEgACkDwAE3A8ABIAEgACkDyAE3A8gBIAEgACkD0AE3A9ABIAEgACkD2AE3A9gBIAEgACkD4AE3A+ABIAEgACkD6AE3A+gBIAEgACkD8AE3A/ABIAEgACkD+AE3A/gBIAEgACkDgAI3A4ACIAEgACkDiAI3A4gCIAEgACkDkAI3A5ACIAEgACkDmAI3A5gCCy8AIAAQmwEEQCABEJ4BBSABQcABahCLASAAQeAAaiABQeAAahCMASAAIAEQjAELCxcAIAAgARBSIABB4ABqIAFB4ABqEFJxC4YBAQF/IAAQnAEEQCABEJsBDwsgARCbAQRAQQAPCyAAQcABaiICEIoBBEAgACABEKIBDwsgAkHYhwEQjwEgAUHYhwFBuIgBEI0BIAJB2IcBQZiJARCNASABQeAAakGYiQFB+IkBEI0BIABBuIgBEFIEQCAAQeAAakH4iQEQUgRAQQEPCwtBAAvQAQECfyAAEJwBBEAgARCcAQ8LIAEQnAEEQEEADwsgAEHAAWoiAhCKAQRAIAEgABCjAQ8LIAFBwAFqIgMQigEEQCAAIAEQowEPCyACQdiKARCPASADQbiLARCPASAAQbiLAUGYjAEQjQEgAUHYigFB+IwBEI0BIAJB2IoBQdiNARCNASADQbiLAUG4jgEQjQEgAEHgAGpBuI4BQZiPARCNASABQeAA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AEHgAGoQTSAAQcABahBNCycAIAAgARCMASAAQeAAaiABQeAAahCMASAAQcABaiABQcABahCMAQvlAgAgACABQYjcAhCNASAAQeAAaiABQeAAakHo3AIQjQEgAEHAAWogAUHAAWpByN0CEI0BIAAgAEHgAGpBqN4CEJABIAEgAUHgAGpBiN8CEJABIAAgAEHAAWpB6N8CEJABIAEgAUHAAWpByOACEJABIABB4ABqIABBwAFqQajhAhCQASABQeAAaiABQcABakGI4gIQkAFBiNwCQejcAkHo4gIQkAFBiNwCQcjdAkHI4wIQkAFB6NwCQcjdAkGo5AIQkAFBqOECQYjiAiACEI0BIAJBqOQCIAIQkQEgAiACEOQBQYjcAiACIAIQkAFBqN4CQYjfAiACQeAAahCNASACQeAAakHo4gIgAkHgAGoQkQFByN0CQYjlAhDkASACQeAAakGI5QIgAkHgAGoQkAFB6N8CQcjgAiACQcABahCNASACQcABakHI4wIgAkHAAWoQkQEgAkHAAWpB6NwCIAJBwAFqEJABC4ECACAAQejlAhCPASAAIABB4ABqQcjmAhCNAUHI5gJByOYCQajnAhCQASAAIABB4ABqQYjoAhCRAUGI6AIgAEHAAWpBiOgCEJABQYjoAkGI6AIQjwEgAEHgAGogAEHAAWpB6OgCEI0BQejoAkHo6AJByOkCEJABIABBwAFqQajqAhCPAUHI6QIgARDkAUHo5QIgASABEJABQajqAiABQeAAahDkAUGo5wIgAUHgAGogAUHgAGoQkAFB6OUCQajqAiABQcABahCQAUHI6QIgAUHAAWogAUHAAWoQkQFBiOgCIAFBwAFqIAFBwAFqEJABQajnAiABQcABaiABQcABahCQAQs1ACAAIAEgAhCQASAAQeAAaiABQeAAaiACQeAAahCQASAAQcABaiABQcABaiACQcABahCQAQs1ACAAIAEgAhCRASAAQeAAaiABQeAAaiACQeAAahCRASAAQcABaiABQcABaiACQcABahCRAQsnACAAIAEQkgEgAEHgAGogAUHgAGoQkgEgAEHAAWogAUHAAWoQkgELKwEBfyAAQcABahCVASIBBEAgAQ8LIABB4ABqEJUBIgEEQCABDwsgABCVAQsmACAAIAEQUiAAQeAAaiABQeAAahBScSAAQcABaiABQcAB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QeAAaiABIAJBwAFqEI0BQcjRAyABIAIQjQEgAiACQcABaiACEJEBIAIgAhDkAUHo0AMgASACQeAAahCNASACQeAAaiACQcABaiACQeAAahCRAQvsAQAgACABQajSAxCNASAAQeAAaiACQYjTAxCNASAAIABB4ABqQejTAxCQASAAIABBwAFqQcjUAxCQASAAQeAAaiAAQcABaiADEJABIAMgAiADEI0BIANBiNMDIAMQkQEgAyADEOQBIANBqNIDIAMQkAEgASACIANB4ABqEJABIANB4ABqQejTAyADQeAAahCNASADQeAAakGo0gMgA0HgAGoQkQEgA0HgAGpBiNMDIANB4ABqEJEBQcjUAyABIANBwAFqEI0BIANBwAFqQajSAyADQcABahCRASADQcABakGI0wMgA0HAAWoQkAELkAEAIAAgASACQajVAxCPAiAAQaACaiADQcjXAxCOAiACIANB6NkDEJABIABBoAJqIAAgBEGgAmoQ7AEgBEGgAmogAUHo2QMgBEGgAmoQjwIgBEGgAmpBqNUDIARBoAJqEO0BIARBoAJqQcjXAyAEQaACahDtAUHI1wMgBBDpASAEIAQQ9gEgBEGo1QMgBBDsAQtQACABIABBMGpByNoDEBMgAUEwaiAAQTBqQfjaAxATIAFB4ABqIABBqNsDEBMgAUGQAWogAEHY2wMQEyACIAFBwAFqQajbA0HI2gMgAhCQAgtsACAAQYj+BCABEI0BIABB4ABqQej+BCABQeAAahCNASAAQcABakHI/wQgAUHAAWoQjQEgAEGgAmpBqIAFIAFBoAJqEI0BIABBgANqQYiBBSABQYADahCNASAAQeADakHogQUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByIIFIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaiDBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiIQFIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHohAUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQciFBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqIYFIAFB4ANqEI0BC2wAIABBiIcFIAEQjQEgAEHgAGpB6IcFIAFB4ABqEI0BIABBwAFqQciIBSABQcABahCNASAAQaACakGoiQUgAUGgAmoQjQEgAEGAA2pBiIoFIAFBgANqEI0BIABB4ANqQeiKBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIiwUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqIwFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIjQUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeiNBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByI4FIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGojwUgAUHgA2oQjQELbAAgAEGIkAUgARCNASAAQeAAakHokAUgAUHgAGoQjQEgAEHAAWpByJEFIAFBwAFqEI0BIABBoAJqQaiSBSABQaACahCNASAAQYADakGIkwUgAUGAA2oQjQEgAEHgA2pB6JMFIAFB4ANqEI0BC4oCACAAIAEQACAAQTBqIAFBMGoQESABQciUBSABEI0BIABB4ABqIAFB4ABqEAAgAEGQAWogAUGQAWoQESABQeAAakGolQUgAUHgAGoQjQEgAEHAAWogAUHAAWoQACAAQfABaiABQfABahARIAFBwAFqQYiWBSABQcABahCNASAAQaACaiABQaACahAAIABB0AJqIAFB0AJqEBEgAUGgAmpB6JYFIAFBoAJqEI0BIABBgANqIAFBgANqEAAgAEGwA2ogAUGwA2oQESABQYADakHIlwUgAUGAA2oQjQEgAEHgA2ogAUHgA2oQACAAQZAEaiABQZAEahARIAFB4ANqQaiYBSABQeADahCNAQtsACAAQYiZBSABEI0BIABB4ABqQeiZBSABQeAAahCNASAAQcABakHImgUgAUHAAWoQjQEgAEGgAmpBqJsFIAFBoAJqEI0BIABBgANqQYicBSABQYADahCNASAAQeADakHonAUgAUHgA2oQjQELigIAIAAgARAAIABBMGogAUEwahARIAFByJ0FIAEQjQEgAEHgAGogAUHgAGoQACAAQZABaiABQZABahARIAFB4ABqQaieBSABQeAAahCNASAAQcABaiABQcABahAAIABB8AFqIAFB8AFqEBEgAUHAAWpBiJ8FIAFBwAFqEI0BIABBoAJqIAFBoAJqEAAgAEHQAmogAUHQAmoQESABQaACakHonwUgAUGgAmoQjQEgAEGAA2ogAUGAA2oQACAAQbADaiABQbADahARIAFBgANqQcigBSABQYADahCNASAAQeADaiABQeADahAAIABBkARqIAFBkARqEBEgAUHgA2pBqKEFIAFB4ANqEI0BC2wAIABBiKIFIAEQjQEgAEHgAGpB6KIFIAFB4ABqEI0BIABBwAFqQcijBSABQcABahCNASAAQaACakGopAUgAUGgAmoQjQEgAEGAA2pBiKUFIAFBgANqEI0BIABB4ANqQeilBSABQeADahCNAQuKAgAgACABEAAgAEEwaiABQTBqEBEgAUHIpgUgARCNASAAQeAAaiABQeAAahAAIABBkAFqIAFBkAFqEBEgAUHgAGpBqKcFIAFB4ABqEI0BIABBwAFqIAFBwAFqEAAgAEHwAWogAUHwAWoQESABQcABakGIqAUgAUHAAWoQjQEgAEGgAmogAUGgAmoQACAAQdACaiABQdACahARIAFBoAJqQeioBSABQaACahCNASAAQYADaiABQYADahAAIABBsANqIAFBsANqEBEgAUGAA2pByKkFIAFBgANqEI0BIABB4ANqIAFB4ANqEAAgAEGQBGogAUGQBGoQESABQeADakGoqgUgAUHgA2oQjQELgwEAIAAQSwRAQQEPCyAAEGRFBEBBAA8LIABBiKsFQfirBRATIABBMGpBqKwFEAAgAEG4qwVBiK0FEBMgAEEwakG4rQUQAEH4qwVB+KsFEFVB+KsFIABB+KsFEF1B+KsFQYitBUH4qwUQXUH4qwVB6KsFQRBB+KsFEHhB+KsFQYitBRBTCxEAIABB6K0FEGNB6K0FEJwCC7MCACAAEJsBBEBBAQ8LIAAQtAFFBEBBAA8LIABByK4FQfCwBRCNASAAQeAAakHIrgVB0LEFEI0BQfCwBUGorwVBsLIFEI4BQdCxBUGQswUQkgFB8LAFQfCzBRCSAUHQsQVB2K8FQdC0BRCNAUGwsgVB4LIF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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEHongMLoAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQYi8AwugAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBqNADC0AAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAB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"; +export const pq = 712; +export const pr = 3464; +export const pG1gen = 42968; +export const pG1zero = 43112; +export const pG1b = 4776; +export const pG2gen = 43256; +export const pG2zero = 43544; +export const pG2b = 17272; +export const pOneT = 43832; +export const prePSize = 288; +export const preQSize = 20448; +export const n8q = 48; +export const n8r = 32; +export const q = "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787"; +export const r = "52435875175126190479447740508185965837690552500527637822603658699938581184513"; diff --git a/src/wasm/bn128_wasm.js b/src/wasm/bn128_wasm.js new file mode 100644 index 0000000..be11993 --- /dev/null +++ b/src/wasm/bn128_wasm.js @@ -0,0 +1,20 @@ +// AUTO-GENERATED from wasmcurves/build/bn128_wasm.js — do not edit. +// Regenerate with: npm run gen-wasm +// 'code' is base64 of the wasm-opt -O2 optimized wasm; the rest are +// pointer offsets / field moduli. +export const code = "AGFzbQEAAAABigEQYAJ/fwBgA39/fwBgAX8Bf2AEf39/fwBgBX9/f39/AGABfwBgAn9/AX9gBn9/f39/fwBgCH9/f39/f39/AGADf39/AX9gBH9/f38Bf2AKf39/f39/f39/fwBgBX9/f39/AX9gB39/f39/f38Bf2AJf39/f39/f39/AX9gC39/f39/f39/f39/AX8CDwEDZW52Bm1lbW9yeQIAGQOdApsCAAUCBQYGCQkBAAADAQIBAQAAAQAAAAACAgAFAQMEAQEDAAICAQEAAAEAAAAAAgIABQEDBAEBAwACAQAAAgICBQUAAAAGBgYAAAEBAQAAAQEBAAAAAAACAgEAAQAAAAABAQEBAQoHCAQIBAMDAAMCAAAEBwcBAQcAAwsEAwIFAAEBAAEBAAADAgIEAwACAgIFBQAAAAYGBgAAAQEBAAABAQEAAAAAAAICAQAAAAAAAQEBAQEIBAgEAwMBAAMAAAQHBwEBBwEAAwAABAcHAQEHAQEEBAQEBAACAgUFAAEAAQEAAgYAAwIEAwACAgUFAAEBAAEBAAAAAAYAAwICBAMAAgAAAAADAwEAAAAAAAAAAAAAAAAAAAkMDQ4PAQexJasCCGludF9jb3B5AAAIaW50X3plcm8AAQdpbnRfb25lAAMKaW50X2lzWmVybwACBmludF9lcQAEB2ludF9ndGUABQdpbnRfYWRkAAYHaW50X3N1YgAHB2ludF9tdWwACAppbnRfc3F1YXJlAAkNaW50X3NxdWFyZU9sZAAKB2ludF9kaXYACw5pbnRfaW52ZXJzZU1vZAAMCGYxbV9jb3B5AAAIZjFtX3plcm8AAQpmMW1faXNaZXJvAAIGZjFtX2VxAAQHZjFtX2FkZAAOB2YxbV9zdWIADwdmMW1fbmVnABAOZjFtX2lzTmVnYXRpdmUAFwlmMW1faXNPbmUADQhmMW1fc2lnbgAYC2YxbV9tUmVkdWN0ABEHZjFtX211bAASCmYxbV9zcXVhcmUAEw1mMW1fc3F1YXJlT2xkABQSZjFtX2Zyb21Nb250Z29tZXJ5ABYQZjFtX3RvTW9udGdvbWVyeQAVC2YxbV9pbnZlcnNlABkHZjFtX29uZQAaCGYxbV9sb2FkABsPZjFtX3RpbWVzU2NhbGFyABwHZjFtX2V4cAAgEGYxbV9iYXRjaEludmVyc2UAHQhmMW1fc3FydAAhDGYxbV9pc1NxdWFyZQAiFWYxbV9iYXRjaFRvTW9udGdvbWVyeQAeF2YxbV9iYXRjaEZyb21Nb250Z29tZXJ5AB8IZnJtX2NvcHkAAAhmcm1femVybwABCmZybV9pc1plcm8AAgZmcm1fZXEABAdmcm1fYWRkACQHZnJtX3N1YgAlB2ZybV9uZWcAJg5mcm1faXNOZWdhdGl2ZQAtCWZybV9pc09uZQAjCGZybV9zaWduAC4LZnJtX21SZWR1Y3QAJwdmcm1fbXVsACgKZnJtX3NxdWFyZQApDWZybV9zcXVhcmVPbGQAKhJmcm1fZnJvbU1vbnRnb21lcnkALBBmcm1fdG9Nb250Z29tZXJ5ACsLZnJtX2ludmVyc2UALwdmcm1fb25lADAIZnJtX2xvYWQAMQ9mcm1fdGltZXNTY2FsYXIAMgdmcm1fZXhwADYQZnJtX2JhdGNoSW52ZXJzZQAzCGZybV9zcXJ0ADcMZnJtX2lzU3F1YXJlADgVZnJtX2JhdGNoVG9Nb250Z29tZXJ5ADQXZnJtX2JhdGNoRnJvbU1vbnRnb21lcnkANQZmcl9hZGQAJAZmcl9zdWIAJQZmcl9uZWcAJgZmcl9tdWwAOQlmcl9zcXVhcmUAOgpmcl9pbnZlcnNlADsNZnJfaXNOZWdhdGl2ZQA8B2ZyX2NvcHkAAAdmcl96ZXJvAAEGZnJfb25lADAJZnJfaXNaZXJvAAIFZnJfZXEABAxnMW1fbXVsdGlleHAAZxJnMW1fbXVsdGlleHBfY2h1bmsAZhJnMW1fbXVsdGlleHBBZmZpbmUAaRhnMW1fbXVsdGlleHBBZmZpbmVfY2h1bmsAaApnMW1faXNaZXJvAD4QZzFtX2lzWmVyb0FmZmluZQA9BmcxbV9lcQBGC2cxbV9lcU1peGVkAEUMZzFtX2VxQWZmaW5lAEQIZzFtX2NvcHkAQg5nMW1fY29weUFmZmluZQBBCGcxbV96ZXJvAEAOZzFtX3plcm9BZmZpbmUAPwpnMW1fZG91YmxlAEgQZzFtX2RvdWJsZUFmZmluZQBHB2cxbV9hZGQASwxnMW1fYWRkTWl4ZWQASg1nMW1fYWRkQWZmaW5lAEkHZzFtX25lZwBNDWcxbV9uZWdBZmZpbmUATAdnMW1fc3ViAFAMZzFtX3N1Yk1peGVkAE8NZzFtX3N1YkFmZmluZQBOEmcxbV9mcm9tTW9udGdvbWVyeQBSGGcxbV9mcm9tTW9udGdvbWVyeUFmZmluZQBREGcxbV90b01vbnRnb21lcnkAVBZnMW1fdG9Nb250Z29tZXJ5QWZmaW5lAFMPZzFtX3RpbWVzU2NhbGFyAGoVZzFtX3RpbWVzU2NhbGFyQWZmaW5lAGsNZzFtX25vcm1hbGl6ZQBZCmcxbV9MRU10b1UAWwpnMW1fTEVNdG9DAFwKZzFtX1V0b0xFTQBdCmcxbV9DdG9MRU0AXg9nMW1fYmF0Y2hMRU10b1UAXw9nMW1fYmF0Y2hMRU10b0MAYA9nMW1fYmF0Y2hVdG9MRU0AYQ9nMW1fYmF0Y2hDdG9MRU0AYgxnMW1fdG9BZmZpbmUAVQ5nMW1fdG9KYWNvYmlhbgBDEWcxbV9iYXRjaFRvQWZmaW5lAFgTZzFtX2JhdGNoVG9KYWNvYmlhbgBjC2cxbV9pbkN1cnZlAFcRZzFtX2luQ3VydmVBZmZpbmUAVhdmcm1fX3JldmVyc2VQZXJtdXRhdGlvbgBsB2ZybV9mZnQAbwhmcm1faWZmdABwCmZybV9yYXdmZnQAbQtmcm1fZmZ0Sm9pbgBxDmZybV9mZnRKb2luRXh0AHIRZnJtX2ZmdEpvaW5FeHRJbnYAcwpmcm1fZmZ0TWl4AHQMZnJtX2ZmdEZpbmFsAHUdZnJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24Adghwb2xfemVybwB3D3BvbF9jb25zdHJ1Y3RMQwB4DHFhcF9idWlsZEFCQwB5C3FhcF9qb2luQUJDAHoMcWFwX2JhdGNoQWRkAHsKZjJtX2lzWmVybwA9CWYybV9pc09uZQB8CGYybV96ZXJvAD8HZjJtX29uZQB9CGYybV9jb3B5AH4HZjJtX211bAB/CGYybV9tdWwxAIABCmYybV9zcXVhcmUAgQEHZjJtX2FkZACCAQdmMm1fc3ViAIMBB2YybV9uZWcAhAEIZjJtX3NpZ24AhwENZjJtX2Nvbmp1Z2F0ZQBMEmYybV9mcm9tTW9udGdvbWVyeQBREGYybV90b01vbnRnb21lcnkAUwZmMm1fZXEARAtmMm1faW52ZXJzZQCFAQdmMm1fZXhwAIoBD2YybV90aW1lc1NjYWxhcgCGARBmMm1fYmF0Y2hJbnZlcnNlAIkBCGYybV9zcXJ0AIsBDGYybV9pc1NxdWFyZQCMAQ5mMm1faXNOZWdhdGl2ZQCIAQxnMm1fbXVsdGlleHAAtAESZzJtX211bHRpZXhwX2NodW5rALMBEmcybV9tdWx0aWV4cEFmZmluZQC2ARhnMm1fbXVsdGlleHBBZmZpbmVfY2h1bmsAtQEKZzJtX2lzWmVybwCOARBnMm1faXNaZXJvQWZmaW5lAI0BBmcybV9lcQCWAQtnMm1fZXFNaXhlZACVAQxnMm1fZXFBZmZpbmUAlAEIZzJtX2NvcHkAkgEOZzJtX2NvcHlBZmZpbmUAkQEIZzJtX3plcm8AkAEOZzJtX3plcm9BZmZpbmUAjwEKZzJtX2RvdWJsZQCYARBnMm1fZG91YmxlQWZmaW5lAJcBB2cybV9hZGQAmwEMZzJtX2FkZE1peGVkAJoBDWcybV9hZGRBZmZpbmUAmQEHZzJtX25lZwCdAQ1nMm1fbmVnQWZmaW5lAJwBB2cybV9zdWIAoAEMZzJtX3N1Yk1peGVkAJ8BDWcybV9zdWJBZmZpbmUAngESZzJtX2Zyb21Nb250Z29tZXJ5AKIBGGcybV9mcm9tTW9udGdvbWVyeUFmZmluZQChARBnMm1fdG9Nb250Z29tZXJ5AKQBFmcybV90b01vbnRnb21lcnlBZmZpbmUAowEPZzJtX3RpbWVzU2NhbGFyALcBFWcybV90aW1lc1NjYWxhckFmZmluZQC4AQ1nMm1fbm9ybWFsaXplAKkBCmcybV9MRU10b1UAqgEKZzJtX0xFTXRvQwCrAQpnMm1fVXRvTEVNAKwBCmcybV9DdG9MRU0ArQEPZzJtX2JhdGNoTEVNdG9VAK4BD2cybV9iYXRjaExFTXRvQwCvAQ9nMm1fYmF0Y2hVdG9MRU0AsAEPZzJtX2JhdGNoQ3RvTEVNALEBDGcybV90b0FmZmluZQClAQ5nMm1fdG9KYWNvYmlhbgCTARFnMm1fYmF0Y2hUb0FmZmluZQCoARNnMm1fYmF0Y2hUb0phY29iaWFuALIBC2cybV9pbkN1cnZlAKcBEWcybV9pbkN1cnZlQWZmaW5lAKYBC2cxbV90aW1lc0ZyALkBF2cxbV9fcmV2ZXJzZVBlcm11dGF0aW9uALoBB2cxbV9mZnQAvAEIZzFtX2lmZnQAvQEKZzFtX3Jhd2ZmdAC7AQtnMW1fZmZ0Sm9pbgC+AQ5nMW1fZmZ0Sm9pbkV4dAC/ARFnMW1fZmZ0Sm9pbkV4dEludgDAAQpnMW1fZmZ0TWl4AMEBDGcxbV9mZnRGaW5hbADCAR1nMW1fcHJlcGFyZUxhZ3JhbmdlRXZhbHVhdGlvbgDDAQtnMm1fdGltZXNGcgDEARdnMm1fX3JldmVyc2VQZXJtdXRhdGlvbgDFAQdnMm1fZmZ0AMcBCGcybV9pZmZ0AMgBCmcybV9yYXdmZnQAxgELZzJtX2ZmdEpvaW4AyQEOZzJtX2ZmdEpvaW5FeHQAygERZzJtX2ZmdEpvaW5FeHRJbnYAywEKZzJtX2ZmdE1peADMAQxnMm1fZmZ0RmluYWwAzQEdZzJtX3ByZXBhcmVMYWdyYW5nZUV2YWx1YXRpb24AzgERZzFtX3RpbWVzRnJBZmZpbmUAzwERZzJtX3RpbWVzRnJBZmZpbmUA0AERZnJtX2JhdGNoQXBwbHlLZXkA0QERZzFtX2JhdGNoQXBwbHlLZXkA0gEWZzFtX2JhdGNoQXBwbHlLZXlNaXhlZADTARFnMm1fYmF0Y2hBcHBseUtleQDUARZnMm1fYmF0Y2hBcHBseUtleU1peGVkANUBCmY2bV9pc1plcm8A1wEJZjZtX2lzT25lANgBCGY2bV96ZXJvANkBB2Y2bV9vbmUA2gEIZjZtX2NvcHkA2wEHZjZtX211bADcAQpmNm1fc3F1YXJlAN0BB2Y2bV9hZGQA3gEHZjZtX3N1YgDfAQdmNm1fbmVnAOABCGY2bV9zaWduAOEBEmY2bV9mcm9tTW9udGdvbWVyeQCiARBmNm1fdG9Nb250Z29tZXJ5AKQBBmY2bV9lcQDiAQtmNm1faW52ZXJzZQDjAQdmNm1fZXhwAOcBD2Y2bV90aW1lc1NjYWxhcgDkARBmNm1fYmF0Y2hJbnZlcnNlAOYBDmY2bV9pc05lZ2F0aXZlAOUBCmZ0bV9pc1plcm8A6QEJZnRtX2lzT25lAOoBCGZ0bV96ZXJvAOsBB2Z0bV9vbmUA7AEIZnRtX2NvcHkA7QEHZnRtX211bADuAQhmdG1fbXVsMQDvAQpmdG1fc3F1YXJlAPABB2Z0bV9hZGQA8QEHZnRtX3N1YgDyAQdmdG1fbmVnAPMBCGZ0bV9zaWduAPoBDWZ0bV9jb25qdWdhdGUA9AESZnRtX2Zyb21Nb250Z29tZXJ5APYBEGZ0bV90b01vbnRnb21lcnkA9QEGZnRtX2VxAPcBC2Z0bV9pbnZlcnNlAPgBB2Z0bV9leHAA/QEPZnRtX3RpbWVzU2NhbGFyAPkBEGZ0bV9iYXRjaEludmVyc2UA/AEIZnRtX3NxcnQA/gEMZnRtX2lzU3F1YXJlAP8BDmZ0bV9pc05lZ2F0aXZlAPsBFGJuMTI4X19mcm9iZW5pdXNNYXAwAIcCFGJuMTI4X19mcm9iZW5pdXNNYXAxAIgCFGJuMTI4X19mcm9iZW5pdXNNYXAyAIkCFGJuMTI4X19mcm9iZW5pdXNNYXAzAIoCFGJuMTI4X19mcm9iZW5pdXNNYXA0AIsCFGJuMTI4X19mcm9iZW5pdXNNYXA1AIwCFGJuMTI4X19mcm9iZW5pdXNNYXA2AI0CFGJuMTI4X19mcm9iZW5pdXNNYXA3AI4CFGJuMTI4X19mcm9iZW5pdXNNYXA4AI8CFGJuMTI4X19mcm9iZW5pdXNNYXA5AJACEGJuMTI4X3BhaXJpbmdFcTEAlQIQYm4xMjhfcGFpcmluZ0VxMgCWAhBibjEyOF9wYWlyaW5nRXEzAJcCEGJuMTI4X3BhaXJpbmdFcTQAmAIQYm4xMjhfcGFpcmluZ0VxNQCZAg1ibjEyOF9wYWlyaW5nAJoCD2JuMTI4X3ByZXBhcmVHMQCBAg9ibjEyOF9wcmVwYXJlRzIAgwIQYm4xMjhfbWlsbGVyTG9vcACGAhlibjEyOF9maW5hbEV4cG9uZW50aWF0aW9uAJQCHGJuMTI4X2ZpbmFsRXhwb25lbnRpYXRpb25PbGQAkQIPYm4xMjhfX211bEJ5MDI0AIQCEmJuMTI4X19tdWxCeTAyNE9sZACFAhdibjEyOF9fY3ljbG90b21pY1NxdWFyZQCSAhdibjEyOF9fY3ljbG90b21pY0V4cF93MACTAgrerAObAioAIAEgACkDADcDACABIAApAwg3AwggASAAKQMQNwMQIAEgACkDGDcDGAseACAAQgA3AwAgAEIANwMIIABCADcDECAAQgA3AxgLLAAgACkDGFAEfiAAKQMQUAR+IAApAwhQBH4gACkDAAVCAQsFQgELBUIBC1ALHgAgAEIBNwMAIABCADcDCCAAQgA3AxAgAEIANwMYC0AAIAApAxggASkDGFEEfyAAKQMQIAEpAxBRBH8gACkDCCABKQMIUQR/IAApAwAgASkDAFEFQQALBUEACwVBAAsLcwAgACkDGCABKQMYVAR/QQAFIAApAxggASkDGFYEf0EBBSAAKQMQIAEpAxBUBH9BAAUgACkDECABKQMQVgR/QQEFIAApAwggASkDCFQEf0EABSAAKQMIIAEpAwhWBH9BAQUgACkDACABKQMAWgsLCwsLCwvEAQEBfiACIAA1AgAgATUCAHwiAz4CACACIAA1AgQgATUCBHwgA0IgiHwiAz4CBCACIAA1AgggATUCCHwgA0IgiHwiAz4CCCACIAA1AgwgATUCDHwgA0IgiHwiAz4CDCACIAA1AhAgATUCEHwgA0IgiHwiAz4CECACIAA1AhQgATUCFHwgA0IgiHwiAz4CFCACIAA1AhggATUCGHwgA0IgiHwiAz4CGCACIAA1AhwgATUCHHwgA0IgiHwiAz4CHCADQiCIpwv8AQEBfiACIAA1AgAgATUCAH0iA0L/////D4M+AgAgAiAANQIEIAE1AgR9IANCIId8IgNC/////w+DPgIEIAIgADUCCCABNQIIfSADQiCHfCIDQv////8Pgz4CCCACIAA1AgwgATUCDH0gA0Igh3wiA0L/////D4M+AgwgAiAANQIQIAE1AhB9IANCIId8IgNC/////w+DPgIQIAIgADUCFCABNQIUfSADQiCHfCIDQv////8Pgz4CFCACIAA1AhggATUCGH0gA0Igh3wiA0L/////D4M+AhggAiAANQIcIAE1Ahx9IANCIId8IgNC/////w+DPgIcIANCIIenC+YOARF+IAQgADUCACIFIAE1AgAiBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIAIARCIIghAyADIAUgATUCBCIHfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AgQiCCAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AgQgA0IgiCEEIAQgBSABNQIIIgl+IANC/////w+DfCIDQiCIfCEEIAQgByAIfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AggiCiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AgggBEIgiCEDIAMgBSABNQIMIgt+IARC/////w+DfCIEQiCIfCEDIAMgCCAJfiAEQv////8Pg3wiBEIgiHwhAyADIAcgCn4gBEL/////D4N8IgRCIIh8IQMgAyAANQIMIgwgBn4gBEL/////D4N8IgRCIIh8IQMgAiAEPgIMIANCIIghBCAEIAUgATUCECINfiADQv////8Pg3wiA0IgiHwhBCAEIAggC34gA0L/////D4N8IgNCIIh8IQQgBCAJIAp+IANC/////w+DfCIDQiCIfCEEIAQgByAMfiADQv////8Pg3wiA0IgiHwhBCAEIAA1AhAiDiAGfiADQv////8Pg3wiA0IgiHwhBCACIAM+AhAgBEIgiCEDIAMgBSABNQIUIg9+IARC/////w+DfCIEQiCIfCEDIAMgCCANfiAEQv////8Pg3wiBEIgiHwhAyADIAogC34gBEL/////D4N8IgRCIIh8IQMgAyAJIAx+IARC/////w+DfCIEQiCIfCEDIAMgByAOfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhQiECAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhQgA0IgiCEEIAQgBSABNQIYIhF+IANC/////w+DfCIDQiCIfCEEIAQgCCAPfiADQv////8Pg3wiA0IgiHwhBCAEIAogDX4gA0L/////D4N8IgNCIIh8IQQgBCALIAx+IANC/////w+DfCIDQiCIfCEEIAQgCSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAcgEH4gA0L/////D4N8IgNCIIh8IQQgBCAANQIYIhIgBn4gA0L/////D4N8IgNCIIh8IQQgAiADPgIYIARCIIghAyADIAUgATUCHCITfiAEQv////8Pg3wiBEIgiHwhAyADIAggEX4gBEL/////D4N8IgRCIIh8IQMgAyAKIA9+IARC/////w+DfCIEQiCIfCEDIAMgDCANfiAEQv////8Pg3wiBEIgiHwhAyADIAsgDn4gBEL/////D4N8IgRCIIh8IQMgAyAJIBB+IARC/////w+DfCIEQiCIfCEDIAMgByASfiAEQv////8Pg3wiBEIgiHwhAyADIAA1AhwiBSAGfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AhwgA0IgiCEEIAQgCCATfiADQv////8Pg3wiA0IgiHwhBCAEIAogEX4gA0L/////D4N8IgNCIIh8IQQgBCAMIA9+IANC/////w+DfCIDQiCIfCEEIAQgDSAOfiADQv////8Pg3wiA0IgiHwhBCAEIAsgEH4gA0L/////D4N8IgNCIIh8IQQgBCAJIBJ+IANC/////w+DfCIDQiCIfCEEIAQgBSAHfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiAgBEIgiCEDIAMgCiATfiAEQv////8Pg3wiBEIgiHwhAyADIAwgEX4gBEL/////D4N8IgRCIIh8IQMgAyAOIA9+IARC/////w+DfCIEQiCIfCEDIAMgDSAQfiAEQv////8Pg3wiBEIgiHwhAyADIAsgEn4gBEL/////D4N8IgRCIIh8IQMgAyAFIAl+IARC/////w+DfCIEQiCIfCEDIAIgBD4CJCADQiCIIQQgBCAMIBN+IANC/////w+DfCIDQiCIfCEEIAQgDiARfiADQv////8Pg3wiA0IgiHwhBCAEIA8gEH4gA0L/////D4N8IgNCIIh8IQQgBCANIBJ+IANC/////w+DfCIDQiCIfCEEIAQgBSALfiADQv////8Pg3wiA0IgiHwhBCACIAM+AiggBEIgiCEDIAMgDiATfiAEQv////8Pg3wiBEIgiHwhAyADIBAgEX4gBEL/////D4N8IgRCIIh8IQMgAyAPIBJ+IARC/////w+DfCIEQiCIfCEDIAMgBSANfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AiwgA0IgiCEEIAQgECATfiADQv////8Pg3wiA0IgiHwhBCAEIBEgEn4gA0L/////D4N8IgNCIIh8IQQgBCAFIA9+IANC/////w+DfCIDQiCIfCEEIAIgAz4CMCAEQiCIIQMgAyASIBN+IARC/////w+DfCIEQiCIfCEDIAMgBSARfiAEQv////8Pg3wiBEIgiHwhAyACIAQ+AjQgA0IgiCEEIAQgBSATfiADQv////8Pg3wiA0IgiHwhBCACIAM+AjggAiAEPgI8C84NAQx+IAMgADUCACIGIAZ+IAJC/////w+DfCICQiCIfCEDIAEgAj4CACADIgRCIIghBSAANQIEIgcgBn4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIEIAMiBEIgiCEFIAA1AggiCCAGfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAHIAd+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIIIAMiBEIgiCEFIAA1AgwiCSAGfiICQiCIIQMgAyAHIAh+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIMIAMiBEIgiCEFIAA1AhAiCiAGfiICQiCIIQMgAyAHIAl+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCCAIfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CECADIgRCIIghBSAANQIUIgsgBn4iAkIgiCEDIAMgByAKfiACQv////8Pg3wiAkIgiHwhAyADIAggCX4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AhQgAyIEQiCIIQUgADUCGCIMIAZ+IgJCIIghAyADIAcgC34gAkL/////D4N8IgJCIIh8IQMgAyAIIAp+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCSAJfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CGCADIgRCIIghBSAANQIcIg0gBn4iAkIgiCEDIAMgByAMfiACQv////8Pg3wiAkIgiHwhAyADIAggC34gAkL/////D4N8IgJCIIh8IQMgAyAJIAp+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIcIAMiBEIgiCEFIAcgDX4iAkIgiCEDIAMgCCAMfiACQv////8Pg3wiAkIgiHwhAyADIAkgC34gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAKIAp+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIgIAMiBEIgiCEFIAggDX4iAkIgiCEDIAMgCSAMfiACQv////8Pg3wiAkIgiHwhAyADIAogC34gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiQgAyIEQiCIIQUgCSANfiICQiCIIQMgAyAKIAx+IAJC/////w+DfCICQiCIfEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgCyALfiACQv////8Pg3wiAkIgiHwhAyADIAJC/////w+DIARC/////w+DfCICQiCIfCAFfCEDIAEgAj4CKCADIgRCIIghBSAKIA1+IgJCIIghAyADIAsgDH4gAkL/////D4N8IgJCIIh8QgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyACQv////8PgyAEQv////8Pg3wiAkIgiHwgBXwhAyABIAI+AiwgAyIEQiCIIQUgCyANfiICQiCIQgGGIAJC/////w+DQgGGIgJCIIh8IQMgAyAMIAx+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgIwIAMiBEIgiCEFIAwgDX4iAkIgiEIBhiACQv////8Pg0IBhiICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI0IAMiBEIgiCEFQgAhAkIAIQMgAyANIA1+IAJC/////w+DfCICQiCIfCEDIAMgAkL/////D4MgBEL/////D4N8IgJCIIh8IAV8IQMgASACPgI4IAEgAz4CPAsKACAAIAAgARAIC+QDAgN+AX8gACADQegAIAMbIgMQACABQSgQACACQcgAIAIbIgcQAUGIARABQR8hAEEfIQEDQCABQShqLQAAIAFBA0ZyRQRAIAFBAWshAQwBCwsgAUElajUAAEIBfCIGQgFRBEBCAEIAgBoLA0ACQANAIAAgA2otAAAgAEEHRnJFBEAgAEEBayEADAELCyAAIANqQQdrKQAAIAaAIQQgACABa0EEayECA0AgBEKAgICAcINQIAJBAE5xRQRAIARCCIghBCACQQFqIQIMAQsLIARQBEAgA0EoEAVFDQFCASEEQQAhAgtBqAFBKDUAACAEfiIFPgAAQawBQSw1AAAgBH4gBUIgiHwiBT4AAEGwAUEwNQAAIAR+IAVCIIh8IgU+AABBtAFBNDUAACAEfiAFQiCIfCIFPgAAQbgBQTg1AAAgBH4gBUIgiHwiBT4AAEG8AUE8NQAAIAR+IAVCIIh8IgU+AABBwAFBwAA1AAAgBH4gBUIgiHwiBT4AAEHEAUHEADUAACAEfiAFQiCIfD4AACADQagBIAJrIAMQBxogAiAHaiICIAI1AAAgBHwiBD4AACAEQiCIIQQDQCAEQgBSBEAgAkEEaiICNQAAIAR8IQQgAiAEPgAAIARCIIghBAwBCwsMAQsLC44CAQp/QcgBIQNByAEQAUHoASEIIAFB6AEQAEGIAiEJQYgCEANBqAIhBiAAQagCEABByAIhC0HoAiEKQcgDIQQDQCAGEAJFBEAgCCAGIAsgChALIAsgCUGIAxAIIAcEfyAFBH9BiAMgAxAFBH9BiAMgAyAEEAcaQQAFIANBiAMgBBAHGkEBCwVBiAMgAyAEEAYaQQELBSAFBH9BiAMgAyAEEAYaQQAFIANBiAMQBQR/IANBiAMgBBAHGkEABUGIAyADIAQQBxpBAQsLCyEMIAMhACAJIQMgBCEJIAAhBCAFIQcgDCEFIAghACAGIQggCiEGIAAhCgwBCwsgBwRAIAEgAyACEAcaBSADIAIQAAsLCQAgAEGoBBAECywAIAAgASACEAYEQCACQegDIAIQBxoFIAJB6AMQBQRAIAJB6AMgAhAHGgsLCxcAIAAgASACEAcEQCACQegDIAIQBhoLCwsAQcgEIAAgARAPC7YPAQN+IAAgADUCAEKJx5mkDiIEIAA1AgB+Qv////8PgyIDQegDNQIAfnwiAj4CACAAIAA1AgQgAkIgiHxB7AM1AgAgA358IgI+AgQgACAANQIIIAJCIIh8QfADNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEH0AzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB+AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfwDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEGABDUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBhAQ1AgAgA358IgI+AhxBiAYgAkIgiD4CACAAIAA1AgQgADUCBCAEfkL/////D4MiA0HoAzUCAH58IgI+AgQgACAANQIIIAJCIIh8QewDNQIAIAN+fCICPgIIIAAgADUCDCACQiCIfEHwAzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB9AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfgDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH8AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxBgAQ1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QYQENQIAIAN+fCICPgIgQYwGIAJCIIg+AgAgACAANQIIIAA1AgggBH5C/////w+DIgNB6AM1AgB+fCICPgIIIAAgADUCDCACQiCIfEHsAzUCACADfnwiAj4CDCAAIAA1AhAgAkIgiHxB8AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfQDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH4AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB/AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QYAENQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGEBDUCACADfnwiAj4CJEGQBiACQiCIPgIAIAAgADUCDCAANQIMIAR+Qv////8PgyIDQegDNQIAfnwiAj4CDCAAIAA1AhAgAkIgiHxB7AM1AgAgA358IgI+AhAgACAANQIUIAJCIIh8QfADNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEH0AzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB+AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfwDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEGABDUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBhAQ1AgAgA358IgI+AihBlAYgAkIgiD4CACAAIAA1AhAgADUCECAEfkL/////D4MiA0HoAzUCAH58IgI+AhAgACAANQIUIAJCIIh8QewDNQIAIAN+fCICPgIUIAAgADUCGCACQiCIfEHwAzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB9AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfgDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH8AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxBgAQ1AgAgA358IgI+AiggACAANQIsIAJCIIh8QYQENQIAIAN+fCICPgIsQZgGIAJCIIg+AgAgACAANQIUIAA1AhQgBH5C/////w+DIgNB6AM1AgB+fCICPgIUIAAgADUCGCACQiCIfEHsAzUCACADfnwiAj4CGCAAIAA1AhwgAkIgiHxB8AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfQDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH4AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB/AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QYAENQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGEBDUCACADfnwiAj4CMEGcBiACQiCIPgIAIAAgADUCGCAANQIYIAR+Qv////8PgyIDQegDNQIAfnwiAj4CGCAAIAA1AhwgAkIgiHxB7AM1AgAgA358IgI+AhwgACAANQIgIAJCIIh8QfADNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEH0AzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB+AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfwDNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEGABDUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBhAQ1AgAgA358IgI+AjRBoAYgAkIgiD4CACAAIAA1AhwgADUCHCAEfkL/////D4MiA0HoAzUCAH58IgI+AhwgACAANQIgIAJCIIh8QewDNQIAIAN+fCICPgIgIAAgADUCJCACQiCIfEHwAzUCACADfnwiAj4CJCAAIAA1AiggAkIgiHxB9AM1AgAgA358IgI+AiggACAANQIsIAJCIIh8QfgDNQIAIAN+fCICPgIsIAAgADUCMCACQiCIfEH8AzUCACADfnwiAj4CMCAAIAA1AjQgAkIgiHxBgAQ1AgAgA358IgI+AjQgACAANQI4IAJCIIh8QYQENQIAIAN+fCICPgI4QaQGIAJCIIg+AgBBiAYgAEEgaiABEA4LwBwBE34gBSABNQIAIgQgADUCACIOfnwiA0L/////D4MhBSAGIAA1AgQiDyAEfnwgA0IgiHwiA0L/////D4MhBiAHIAA1AggiECAEfnwgA0IgiHwiA0L/////D4MhByAIIAA1AgwiESAEfnwgA0IgiHwiA0L/////D4MhCCAJIAA1AhAiEiAEfnwgA0IgiHwiA0L/////D4MhCSAKIAA1AhQiEyAEfnwgA0IgiHwiA0L/////D4MhCiALIAA1AhgiFCAEfnwgA0IgiHwiA0L/////D4MhCyAMIAA1AhwiFSAEfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCBCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUKJx5mkDn5C/////w+DIgRCx/rzww1+fEIgiCAGIARClpiC4QN+fHwiA0L/////D4MhBSAHIARCjZXHwwZ+fCADQiCIfCIDQv////8PgyEGIAggBEKR1YW8CX58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AggiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVCiceZpA5+Qv////8PgyIEQsf688MNfnxCIIggBiAEQpaYguEDfnx8IgNC/////w+DIQUgByAEQo2Vx8MGfnwgA0IgiHwiA0L/////D4MhBiAIIARCkdWFvAl+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIMIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCECIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUKJx5mkDn5C/////w+DIgRCx/rzww1+fEIgiCAGIARClpiC4QN+fHwiA0L/////D4MhBSAHIARCjZXHwwZ+fCADQiCIfCIDQv////8PgyEGIAggBEKR1YW8CX58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhQiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVCiceZpA5+Qv////8PgyIEQsf688MNfnxCIIggBiAEQpaYguEDfnx8IgNC/////w+DIQUgByAEQo2Vx8MGfnwgA0IgiHwiA0L/////D4MhBiAIIARCkdWFvAl+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIYIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8PgyEFIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DIQYgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCHCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAIgBSAFQonHmaQOfkL/////D4MiBELH+vPDDX58QiCIIAYgBEKWmILhA358fCIDQv////8Pgz4CACACIAcgBEKNlcfDBn58IANCIIh8IgNC/////w+DPgIEIAIgCCAEQpHVhbwJfnwgA0IgiHwiA0L/////D4M+AgggAiAJIARC3bCFjAh+fCADQiCIfCIDQv////8Pgz4CDCACIAogBEK2i8HCC358IANCIIh8IgNC/////w+DPgIQIAIgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4M+AhQgAiAMIARC8pyRgwN+fCADQiCIfCIDQv////8Pgz4CGCACIA0gA0IgiHw+AhwgAkHoAxAFBEAgAkHoAyACEAcaCwvoHQETfiAIIAA1AgAiDSANfnwiAkL/////D4MhCCAMIAA1AgQiDyANfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhDCADQiCIQgGGIAJCIIh8IAsgADUCCCIQIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCyADQiCIQgGGIAJCIIh8IAogADUCDCIRIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgADUCECISIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgADUCFCITIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhByADQiCIQgGGIAJCIIh8IAYgADUCGCIUIA1+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAANQIcIg1+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgDiACQiCIfCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAwgDyAPfnwiAkL/////D4MhDCALIA8gEH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIA8gEX4iA0L/////D4NCAYZ8fCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAPIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgDyATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIA8gFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIA9+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAsgECAQfnwiAkL/////D4MhCyAKIBAgEX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIBAgEn4iA0L/////D4NCAYZ8fCICQv////8PgyEJIANCIIhCAYYgAkIgiHwgByAQIBN+IgNC/////w+DQgGGfHwiAkL/////D4MhByADQiCIQgGGIAJCIIh8IAYgECAUfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gEH4iA0L/////D4NCAYZ8fCICQv////8PgyEEIAUgA0IgiEIBhiACQiCIfHwiAkL/////D4MhBSACQiCIIQ4gCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8PgyEIIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DIQwgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4MhCyAJIANC3bCFjAh+fCACQiCIfCICQv////8PgyEKIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DIQkgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4MhByAEIANC8pyRgwN+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgCiARIBF+fCICQv////8PgyEKIAkgESASfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgESATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBEgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBF+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAkgEiASfnwiAkL/////D4MhCSAHIBIgE34iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBIgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAcgEyATfnwiAkL/////D4MhByAGIBMgFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gE34iA0L/////D4NCAYZ8fCICQv////8PgyEEIAUgA0IgiEIBhiACQiCIfHwiAkL/////D4MhBSACQiCIIQ4gCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8PgyEIIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DIQwgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4MhCyAJIANC3bCFjAh+fCACQiCIfCICQv////8PgyEKIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DIQkgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4MhByAEIANC8pyRgwN+fCACQiCIfCICQv////8PgyEGIAUgAkIgiHwiAkL/////D4MhBCAOIAJCIIh8IQUgBiAUIBR+fCICQv////8PgyEGIAQgDSAUfiIDQv////8Pg0IBhnwgAkIgiHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEKJx5mkDn5C/////w+DIgNCx/rzww1+fEIgiCAMIANClpiC4QN+fHwiAkL/////D4MhCCALIANCjZXHwwZ+fCACQiCIfCICQv////8PgyEMIAogA0KR1YW8CX58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAQgDSANfnwiAkL/////D4MhBCAFIAJCIIh8IgJC/////w+DIQUgAkIgiCEOIAEgCCAIQonHmaQOfkL/////D4MiA0LH+vPDDX58QiCIIAwgA0KWmILhA358fCICQv////8Pgz4CACABIAsgA0KNlcfDBn58IAJCIIh8IgJC/////w+DPgIEIAEgCiADQpHVhbwJfnwgAkIgiHwiAkL/////D4M+AgggASAJIANC3bCFjAh+fCACQiCIfCICQv////8Pgz4CDCABIAcgA0K2i8HCC358IAJCIIh8IgJC/////w+DPgIQIAEgBiADQqnAxokOfnwgAkIgiHwiAkL/////D4M+AhQgASAEIANC8pyRgwN+fCACQiCIfCICQv////8Pgz4CGCABIAUgAkIgiHwiAkL/////D4M+AhwgDiACQiCIfKcEQCABQegDIAEQBxoFIAFB6AMQBQRAIAFB6AMgARAHGgsLCwoAIAAgACABEBILCwAgAEGIBCABEBILFQAgAEGIChAAQagKEAFBiAogARARCxEAIABByAoQFkHICkGIBRAFCyMAIAAQAgRAQQAPCyAAQegKEBZB6ApBiAUQBQRAQX8PC0EBCxcAIAAgARAWIAFB6AMgARAMIAEgARAVCwkAQagEIAAQAAu8AQECfyACEAFBICEDA0AgASADTwRAIANBIEYEQEGICxAaBUGIC0GIBEGICxASCyAAQYgLQagLEBIgAkGoCyACEA4gAEEgaiEAIANBIGohAwwBCwsgAUEfcSIERQRADwtBqAsQAUEAIQEDQCABIARGRQRAIAEgAC0AADoAqAsgAEEBaiEAIAFBAWohAQwBCwsgA0EgRgRAQYgLEBoFQYgLQYgEQYgLEBILQagLQYgLQagLEBIgAkGoCyACEA4LHAAgASACQcgLEBtByAtByAsQFSAAQcgLIAMQEgvhAQECf0EAQQAoAgAiBSACQQFqQQV0ajYCACAFEBogBUEgaiEFA0AgAiAGRwRAIAAQAgRAIAVBIGsgBRAABSAAIAVBIGsgBRASCyAAIAFqIQAgBUEgaiEFIAZBAWohBgwBCwsgACABayEAIAMgAkEBayAEbGohAiAFQSBrIgUgBRAZA0AgBgRAIAAQAgRAIAUgBUEgaxAAIAIQAQUgBUEga0HoCxAAIAUgACAFQSBrEBIgBUHoCyACEBILIAAgAWshACACIARrIQIgBUEgayEFIAZBAWshBgwBCwtBACAFNgIACy0BAX8DQCABIANGRQRAIAAgAhAVIABBIGohACACQSBqIQIgA0EBaiEDDAELCwstAQF/A0AgASADRkUEQCAAIAIQFiAAQSBqIQAgAkEgaiECIANBAWohAwwBCwsLlwIAIAJFBEAgAxAaDwsgAEGIDBAAIAMQGgNAIAJBAWsiAiABai0AACEAIAMgAxATIABBgAFPBEAgA0GIDCADEBIgAEGAAWshAAsgAyADEBMgAEHAAE8EQCADQYgMIAMQEiAAQUBqIQALIAMgAxATIABBIE8EQCADQYgMIAMQEiAAQSBrIQALIAMgAxATIABBEE8EQCADQYgMIAMQEiAAQRBrIQALIAMgAxATIABBCE8EQCADQYgMIAMQEiAAQQhrIQALIAMgAxATIABBBE8EQCADQYgMIAMQEiAAQQRrIQALIAMgAxATIABBAk8EQCADQYgMIAMQEiAAQQJrIQALIAMgAxATIAAEQCADQYgMIAMQEgsgAg0ACwvVAQEBfyAAEAIEQCABEAEPC0EBIQJByAVBqAwQACAAQagFQSBByAwQICAAQegFQSBB6AwQIANAQcgMQagEEARFBEBByAxBiA0QE0EBIQADQEGIDUGoBBAERQRAQYgNQYgNEBMgAEEBaiEADAELC0GoDEGoDRAAIAIgAGtBAWshAgNAIAIEQEGoDUGoDRATIAJBAWshAgwBCwsgACECQagNQagMEBNByAxBqAxByAwQEkHoDEGoDUHoDBASDAELC0HoDBAXBEBB6AwgARAQBUHoDCABEAALCyAAIAAQAgRAQQEPCyAAQegEQSBByA0QIEHIDUGoBBAECwkAIABBqA4QBAssACAAIAEgAhAGBEAgAkHoDSACEAcaBSACQegNEAUEQCACQegNIAIQBxoLCwsXACAAIAEgAhAHBEAgAkHoDSACEAYaCwsLAEHIDiAAIAEQJQu2DwEDfiAAIAA1AgBC/////w4iBCAANQIAfkL/////D4MiA0HoDTUCAH58IgI+AgAgACAANQIEIAJCIIh8QewNNQIAIAN+fCICPgIEIAAgADUCCCACQiCIfEHwDTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB9A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfgNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH8DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxBgA41AgAgA358IgI+AhggACAANQIcIAJCIIh8QYQONQIAIAN+fCICPgIcQYgQIAJCIIg+AgAgACAANQIEIAA1AgQgBH5C/////w+DIgNB6A01AgB+fCICPgIEIAAgADUCCCACQiCIfEHsDTUCACADfnwiAj4CCCAAIAA1AgwgAkIgiHxB8A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfQNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH4DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB/A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QYAONQIAIAN+fCICPgIcIAAgADUCICACQiCIfEGEDjUCACADfnwiAj4CIEGMECACQiCIPgIAIAAgADUCCCAANQIIIAR+Qv////8PgyIDQegNNQIAfnwiAj4CCCAAIAA1AgwgAkIgiHxB7A01AgAgA358IgI+AgwgACAANQIQIAJCIIh8QfANNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEH0DTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB+A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfwNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEGADjUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxBhA41AgAgA358IgI+AiRBkBAgAkIgiD4CACAAIAA1AgwgADUCDCAEfkL/////D4MiA0HoDTUCAH58IgI+AgwgACAANQIQIAJCIIh8QewNNQIAIAN+fCICPgIQIAAgADUCFCACQiCIfEHwDTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB9A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfgNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH8DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxBgA41AgAgA358IgI+AiQgACAANQIoIAJCIIh8QYQONQIAIAN+fCICPgIoQZQQIAJCIIg+AgAgACAANQIQIAA1AhAgBH5C/////w+DIgNB6A01AgB+fCICPgIQIAAgADUCFCACQiCIfEHsDTUCACADfnwiAj4CFCAAIAA1AhggAkIgiHxB8A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfQNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH4DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB/A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QYAONQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEGEDjUCACADfnwiAj4CLEGYECACQiCIPgIAIAAgADUCFCAANQIUIAR+Qv////8PgyIDQegNNQIAfnwiAj4CFCAAIAA1AhggAkIgiHxB7A01AgAgA358IgI+AhggACAANQIcIAJCIIh8QfANNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEH0DTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB+A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfwNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEGADjUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxBhA41AgAgA358IgI+AjBBnBAgAkIgiD4CACAAIAA1AhggADUCGCAEfkL/////D4MiA0HoDTUCAH58IgI+AhggACAANQIcIAJCIIh8QewNNQIAIAN+fCICPgIcIAAgADUCICACQiCIfEHwDTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB9A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfgNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEH8DTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxBgA41AgAgA358IgI+AjAgACAANQI0IAJCIIh8QYQONQIAIAN+fCICPgI0QaAQIAJCIIg+AgAgACAANQIcIAA1AhwgBH5C/////w+DIgNB6A01AgB+fCICPgIcIAAgADUCICACQiCIfEHsDTUCACADfnwiAj4CICAAIAA1AiQgAkIgiHxB8A01AgAgA358IgI+AiQgACAANQIoIAJCIIh8QfQNNQIAIAN+fCICPgIoIAAgADUCLCACQiCIfEH4DTUCACADfnwiAj4CLCAAIAA1AjAgAkIgiHxB/A01AgAgA358IgI+AjAgACAANQI0IAJCIIh8QYAONQIAIAN+fCICPgI0IAAgADUCOCACQiCIfEGEDjUCACADfnwiAj4COEGkECACQiCIPgIAQYgQIABBIGogARAkC8AcARN+IAUgATUCACIEIAA1AgAiDn58IgNC/////w+DIQUgBiAANQIEIg8gBH58IANCIIh8IgNC/////w+DIQYgByAANQIIIhAgBH58IANCIIh8IgNC/////w+DIQcgCCAANQIMIhEgBH58IANCIIh8IgNC/////w+DIQggCSAANQIQIhIgBH58IANCIIh8IgNC/////w+DIQkgCiAANQIUIhMgBH58IANCIIh8IgNC/////w+DIQogCyAANQIYIhQgBH58IANCIIh8IgNC/////w+DIQsgDCAANQIcIhUgBH58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AgQiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVC/////w5+Qv////8PgyIEQoGAgIAPfnxCIIggBiAEQpPrh58Efnx8IgNC/////w+DIQUgByAEQpHh5c0HfnwgA0IgiHwiA0L/////D4MhBiAIIARCyNDPwQJ+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIIIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8OfkL/////D4MiBEKBgICAD358QiCIIAYgBEKT64efBH58fCIDQv////8PgyEFIAcgBEKR4eXNB358IANCIIh8IgNC/////w+DIQYgCCAEQsjQz8ECfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCDCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhAiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSAFIAVC/////w5+Qv////8PgyIEQoGAgIAPfnxCIIggBiAEQpPrh58Efnx8IgNC/////w+DIQUgByAEQpHh5c0HfnwgA0IgiHwiA0L/////D4MhBiAIIARCyNDPwQJ+fCADQiCIfCIDQv////8PgyEHIAkgBELdsIWMCH58IANCIIh8IgNC/////w+DIQggCiAEQraLwcILfnwgA0IgiHwiA0L/////D4MhCSALIARCqcDGiQ5+fCADQiCIfCIDQv////8PgyEKIAwgBELynJGDA358IANCIIh8IgNC/////w+DIQsgDSADQiCIfCEMIAUgDiABNQIUIgR+fCIDQv////8PgyEFIAYgBCAPfnwgA0IgiHwiA0L/////D4MhBiAHIAQgEH58IANCIIh8IgNC/////w+DIQcgCCAEIBF+fCADQiCIfCIDQv////8PgyEIIAkgBCASfnwgA0IgiHwiA0L/////D4MhCSAKIAQgE358IANCIIh8IgNC/////w+DIQogCyAEIBR+fCADQiCIfCIDQv////8PgyELIAwgBCAVfnwgA0IgiHwiA0L/////D4MhDCADQiCIIQ0gBSAFQv////8OfkL/////D4MiBEKBgICAD358QiCIIAYgBEKT64efBH58fCIDQv////8PgyEFIAcgBEKR4eXNB358IANCIIh8IgNC/////w+DIQYgCCAEQsjQz8ECfnwgA0IgiHwiA0L/////D4MhByAJIARC3bCFjAh+fCADQiCIfCIDQv////8PgyEIIAogBEK2i8HCC358IANCIIh8IgNC/////w+DIQkgCyAEQqnAxokOfnwgA0IgiHwiA0L/////D4MhCiAMIARC8pyRgwN+fCADQiCIfCIDQv////8PgyELIA0gA0IgiHwhDCAFIA4gATUCGCIEfnwiA0L/////D4MhBSAGIAQgD358IANCIIh8IgNC/////w+DIQYgByAEIBB+fCADQiCIfCIDQv////8PgyEHIAggBCARfnwgA0IgiHwiA0L/////D4MhCCAJIAQgEn58IANCIIh8IgNC/////w+DIQkgCiAEIBN+fCADQiCIfCIDQv////8PgyEKIAsgBCAUfnwgA0IgiHwiA0L/////D4MhCyAMIAQgFX58IANCIIh8IgNC/////w+DIQwgA0IgiCENIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4MhBSAHIARCkeHlzQd+fCADQiCIfCIDQv////8PgyEGIAggBELI0M/BAn58IANCIIh8IgNC/////w+DIQcgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4MhCCAKIARCtovBwgt+fCADQiCIfCIDQv////8PgyEJIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DIQogDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4MhCyANIANCIIh8IQwgBSAOIAE1AhwiBH58IgNC/////w+DIQUgBiAEIA9+fCADQiCIfCIDQv////8PgyEGIAcgBCAQfnwgA0IgiHwiA0L/////D4MhByAIIAQgEX58IANCIIh8IgNC/////w+DIQggCSAEIBJ+fCADQiCIfCIDQv////8PgyEJIAogBCATfnwgA0IgiHwiA0L/////D4MhCiALIAQgFH58IANCIIh8IgNC/////w+DIQsgDCAEIBV+fCADQiCIfCIDQv////8PgyEMIANCIIghDSACIAUgBUL/////Dn5C/////w+DIgRCgYCAgA9+fEIgiCAGIARCk+uHnwR+fHwiA0L/////D4M+AgAgAiAHIARCkeHlzQd+fCADQiCIfCIDQv////8Pgz4CBCACIAggBELI0M/BAn58IANCIIh8IgNC/////w+DPgIIIAIgCSAEQt2whYwIfnwgA0IgiHwiA0L/////D4M+AgwgAiAKIARCtovBwgt+fCADQiCIfCIDQv////8Pgz4CECACIAsgBEKpwMaJDn58IANCIIh8IgNC/////w+DPgIUIAIgDCAEQvKckYMDfnwgA0IgiHwiA0L/////D4M+AhggAiANIANCIIh8PgIcIAJB6A0QBQRAIAJB6A0gAhAHGgsL6B0BE34gCCAANQIAIg0gDX58IgJC/////w+DIQggDCAANQIEIg8gDX4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQwgA0IgiEIBhiACQiCIfCALIAA1AggiECANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQsgA0IgiEIBhiACQiCIfCAKIAA1AgwiESANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQogA0IgiEIBhiACQiCIfCAJIAA1AhAiEiANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIAA1AhQiEyANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIAA1AhgiFCANfiIDQv////8Pg0IBhnx8IgJC/////w+DIQYgA0IgiEIBhiACQiCIfCAEIA0gADUCHCINfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIA4gAkIgiHwhDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAMIA8gD358IgJC/////w+DIQwgCyAPIBB+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyELIANCIIhCAYYgAkIgiHwgCiAPIBF+IgNC/////w+DQgGGfHwiAkL/////D4MhCiADQiCIQgGGIAJCIIh8IAkgDyASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIA8gE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiAPIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSAPfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSALIBAgEH58IgJC/////w+DIQsgCiAQIBF+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEKIANCIIhCAYYgAkIgiHwgCSAQIBJ+IgNC/////w+DQgGGfHwiAkL/////D4MhCSADQiCIQgGGIAJCIIh8IAcgECATfiIDQv////8Pg0IBhnx8IgJC/////w+DIQcgA0IgiEIBhiACQiCIfCAGIBAgFH4iA0L/////D4NCAYZ8fCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBB+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4MhCCALIANCkeHlzQd+fCACQiCIfCICQv////8PgyEMIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAogESARfnwiAkL/////D4MhCiAJIBEgEn4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQkgA0IgiEIBhiACQiCIfCAHIBEgE34iA0L/////D4NCAYZ8fCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiARIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSARfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAJIBIgEn58IgJC/////w+DIQkgByASIBN+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEHIANCIIhCAYYgAkIgiHwgBiASIBR+IgNC/////w+DQgGGfHwiAkL/////D4MhBiADQiCIQgGGIAJCIIh8IAQgDSASfiIDQv////8Pg0IBhnx8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAHIBMgE358IgJC/////w+DIQcgBiATIBR+IgNC/////w+DQgGGfCACQiCIfCICQv////8PgyEGIANCIIhCAYYgAkIgiHwgBCANIBN+IgNC/////w+DQgGGfHwiAkL/////D4MhBCAFIANCIIhCAYYgAkIgiHx8IgJC/////w+DIQUgAkIgiCEOIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4MhCCALIANCkeHlzQd+fCACQiCIfCICQv////8PgyEMIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DIQsgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4MhCiAHIANCtovBwgt+fCACQiCIfCICQv////8PgyEJIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DIQcgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4MhBiAFIAJCIIh8IgJC/////w+DIQQgDiACQiCIfCEFIAYgFCAUfnwiAkL/////D4MhBiAEIA0gFH4iA0L/////D4NCAYZ8IAJCIIh8IgJC/////w+DIQQgBSADQiCIQgGGIAJCIIh8fCICQv////8PgyEFIAJCIIghDiAIIAhC/////w5+Qv////8PgyIDQoGAgIAPfnxCIIggDCADQpPrh58Efnx8IgJC/////w+DIQggCyADQpHh5c0HfnwgAkIgiHwiAkL/////D4MhDCAKIANCyNDPwQJ+fCACQiCIfCICQv////8PgyELIAkgA0LdsIWMCH58IAJCIIh8IgJC/////w+DIQogByADQraLwcILfnwgAkIgiHwiAkL/////D4MhCSAGIANCqcDGiQ5+fCACQiCIfCICQv////8PgyEHIAQgA0LynJGDA358IAJCIIh8IgJC/////w+DIQYgBSACQiCIfCICQv////8PgyEEIA4gAkIgiHwhBSAEIA0gDX58IgJC/////w+DIQQgBSACQiCIfCICQv////8PgyEFIAJCIIghDiABIAggCEL/////Dn5C/////w+DIgNCgYCAgA9+fEIgiCAMIANCk+uHnwR+fHwiAkL/////D4M+AgAgASALIANCkeHlzQd+fCACQiCIfCICQv////8Pgz4CBCABIAogA0LI0M/BAn58IAJCIIh8IgJC/////w+DPgIIIAEgCSADQt2whYwIfnwgAkIgiHwiAkL/////D4M+AgwgASAHIANCtovBwgt+fCACQiCIfCICQv////8Pgz4CECABIAYgA0KpwMaJDn58IAJCIIh8IgJC/////w+DPgIUIAEgBCADQvKckYMDfnwgAkIgiHwiAkL/////D4M+AhggASAFIAJCIIh8IgJC/////w+DPgIcIA4gAkIgiHynBEAgAUHoDSABEAcaBSABQegNEAUEQCABQegNIAEQBxoLCwsKACAAIAAgARAoCwsAIABBiA4gARAoCxUAIABBiBQQAEGoFBABQYgUIAEQJwsRACAAQcgUECxByBRBiA8QBQsjACAAEAIEQEEADwsgAEHoFBAsQegUQYgPEAUEQEF/DwtBAQsXACAAIAEQLCABQegNIAEQDCABIAEQKwsJAEGoDiAAEAALvAEBAn8gAhABQSAhAwNAIAEgA08EQCADQSBGBEBBiBUQMAVBiBVBiA5BiBUQKAsgAEGIFUGoFRAoIAJBqBUgAhAkIABBIGohACADQSBqIQMMAQsLIAFBH3EiBEUEQA8LQagVEAFBACEBA0AgASAERkUEQCABIAAtAAA6AKgVIABBAWohACABQQFqIQEMAQsLIANBIEYEQEGIFRAwBUGIFUGIDkGIFRAoC0GoFUGIFUGoFRAoIAJBqBUgAhAkCxwAIAEgAkHIFRAxQcgVQcgVECsgAEHIFSADECgL4QEBAn9BAEEAKAIAIgUgAkEBakEFdGo2AgAgBRAwIAVBIGohBQNAIAIgBkcEQCAAEAIEQCAFQSBrIAUQAAUgACAFQSBrIAUQKAsgACABaiEAIAVBIGohBSAGQQFqIQYMAQsLIAAgAWshACADIAJBAWsgBGxqIQIgBUEgayIFIAUQLwNAIAYEQCAAEAIEQCAFIAVBIGsQACACEAEFIAVBIGtB6BUQACAFIAAgBUEgaxAoIAVB6BUgAhAoCyAAIAFrIQAgAiAEayECIAVBIGshBSAGQQFrIQYMAQsLQQAgBTYCAAstAQF/A0AgASADRkUEQCAAIAIQKyAAQSBqIQAgAkEgaiECIANBAWohAwwBCwsLLQEBfwNAIAEgA0ZFBEAgACACECwgAEEgaiEAIAJBIGohAiADQQFqIQMMAQsLC5cCACACRQRAIAMQMA8LIABBiBYQACADEDADQCACQQFrIgIgAWotAAAhACADIAMQKSAAQYABTwRAIANBiBYgAxAoIABBgAFrIQALIAMgAxApIABBwABPBEAgA0GIFiADECggAEFAaiEACyADIAMQKSAAQSBPBEAgA0GIFiADECggAEEgayEACyADIAMQKSAAQRBPBEAgA0GIFiADECggAEEQayEACyADIAMQKSAAQQhPBEAgA0GIFiADECggAEEIayEACyADIAMQKSAAQQRPBEAgA0GIFiADECggAEEEayEACyADIAMQKSAAQQJPBEAgA0GIFiADECggAEECayEACyADIAMQKSAABEAgA0GIFiADECgLIAINAAsL1QEBAX8gABACBEAgARABDwtBHCECQcgPQagWEAAgAEGoD0EgQcgWEDYgAEHoD0EgQegWEDYDQEHIFkGoDhAERQRAQcgWQYgXEClBASEAA0BBiBdBqA4QBEUEQEGIF0GIFxApIABBAWohAAwBCwtBqBZBqBcQACACIABrQQFrIQIDQCACBEBBqBdBqBcQKSACQQFrIQIMAQsLIAAhAkGoF0GoFhApQcgWQagWQcgWEChB6BZBqBdB6BYQKAwBCwtB6BYQLQRAQegWIAEQJgVB6BYgARAACwsgACAAEAIEQEEBDwsgAEHoDkEgQcgXEDZByBdBqA4QBAsVACAAIAFB6BcQKEHoF0GIDiACECgLCgAgACAAIAEQOQsLACAAQegNIAEQDAsJACAAQYgPEAULDgAgABACIABBIGoQAnELCQAgAEFAaxACCw0AIAAQASAAQSBqEAELFAAgABABIABBIGoQGiAAQUBrEAELUgAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOAt6ACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWAsnACAAED0EQCABEEAFIAFBQGsQGiAAQSBqIAFBIGoQACAAIAEQAAsLFQAgACABEAQgAEEgaiABQSBqEARxC3EBAX8gABA+BEAgARA9DwsgARA9BEBBAA8LIABBQGsiAhANBEAgACABEEQPCyACQagYEBMgAUGoGEHIGBASIAJBqBhB6BgQEiABQSBqQegYQYgZEBIgAEHIGBAEBEAgAEEgakGIGRAEBEBB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ECAAQUBrIAFBQGsQAAsSACABQYgpEEwgAEGIKSACEEkLEgAgAUHoKRBMIABB6CkgAhBKCxIAIAFByCoQTSAAQcgqIAIQSwsUACAAIAEQFiAAQSBqIAFBIGoQFgsgACAAIAEQFiAAQSBqIAFBIGoQFiAAQUBrIAFBQGsQFgsUACAAIAEQFSAAQSBqIAFBIGoQFQsgACAAIAEQFSAAQSBqIAFBIGoQFSAAQUBrIAFBQGsQFQtKACAAED4EQCABEAEgAUEgahABBSAAQUBrQagrEBlBqCtByCsQE0GoK0HIK0HoKxASIABByCsgARASIABBIGpB6CsgAUEgahASCwswACAAQSBqQYgsEBMgAEGoLBATIABBqCxBqCwQEkGoLEGIGEGoLBAOQYgsQagsEAQLDgAgAEHILBBVQcgsEFYLlAEBA39BAEEAKAIAIgQgAUEFdGo2AgAgAEFAa0HgACABIARBIBAdIAQhAwNAIAEgBUcEQCADEAIEQCACEAEgAkEgahABBSADIABBIGpBiC0QEiADIAMQEyADIAAgAhASIANBiC0gAkEgahASCyAAQeAAaiEAIAJBQGshAiADQSBqIQMgBUEBaiEFDAELC0EAIAQ2AgALSgAgABA+BEAgARBABSAAQUBrQagtEBlBqC1ByC0QE0GoLUHILUHoLRASIABByC0gARASIABBIGpB6C0gAUEgahASIAFBQGsQGgsLMgAgASACakEBayEBA0AgASACSEUEQCABIAAtAAA6AAAgAUEBayEBIABBAWohAAwBCwsLKgAgABA9BEAgARA/DwsgAEGILhBRQYguQSAgARBaQaguQSAgAUEgahBaC0EAIAAQPQRAIAEQASABQcAAOgAADwsgAEHILhAWQcguQSAgARBaIABBIGoQGEF/RgRAIAEgAS0AAEGAAXI6AAALCy8AIAAtAABBwABxBEAgARA/DwsgAEEgQeguEFogAEEgakEgQYgvEFpB6C4gARBTC64BAQJ/IAAtAAAiAkHAAHEEQCABED8PCyACQYABcSEDIABByC8QAEHILyACQT9xOgAAQcgvQSBBqC8QWkGoLyABEBUgAUHILxATIAFByC9ByC8QEkHIL0GIGEHILxAOQcgvQcgvECFByC9BqC8QEEHILxAYQX9GBEAgAwRAQcgvIAFBIGoQAAVByC8gAUEgahAQCwUg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fyAAQYABayEACyADIAMQgQEgAEHAAE8EQCADQcjcACADEH8gAEFAaiEACyADIAMQgQEgAEEgTwRAIANByNwAIAMQfyAAQSBrIQALIAMgAxCBASAAQRBPBEAgA0HI3AAgAxB/IABBEGshAAsgAyADEIEBIABBCE8EQCADQcjcACADEH8gAEEIayEACyADIAMQgQEgAEEETwRAIANByNwAIAMQfyAAQQRrIQALIAMgAxCBASAAQQJPBEAgA0HI3AAgAxB/IABBAmshAAsgAyADEIEBIAAEQCADQcjcACADEH8LIAINAAsLwwEAQYjfABB9QYjfAEGI3wAQhAEgAEGI3QBBIEHI3QAQigFByN0AQYjeABCBASAAQYjeAEGI3gAQf0GI3gBByN4AEExByN4AQYjeAEHI3gAQf0HI3gBBiN8AEEQEQAALQcjdACAAQcjfABB/QYjeAEGI3wAQRARAQYjfABABQajfABAaQYjfAEHI3wAgARB/BUGI4AAQfUGI4ABBiN4AQYjgABCCAUGI4ABBqN0AQSBBiOAAEIoBQYjgAEHI3wAgARB/CwtjAEGo4gAQfUGo4gBBqOIAEIQBIABByOAAQSBB6OAAEIoBQejgAEGo4QAQgQEgAEGo4QBBqOEAEH9BqOEAQejhABBMQejhAEGo4QBB6OEAEH9B6OEAQajiABBEBEBBAA8LQQELDgAgABA9IABBQGsQPXELCgAgAEGAAWoQPQsNACAAED8gAEFAaxA/CxUAIAAQPyAAQUBrEH0gAEGAAWoQPwuiAQAgASAAKQMANwMAIAEgACkDCDcDCCABIAApAxA3AxAgASAAKQMYNwMYIAEgACkDIDcDICABIAApAyg3AyggASAAKQMwNwMwIAEgACkDODcDOCABIAApA0A3A0AgASAAKQNINwNIIAEgACkDUDcDUCABIAApA1g3A1ggASAAKQNgNwNgIAEgACkDaDcDaCABIAApA3A3A3AgASAAKQN4NwN4C4ICACABIAApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggASAAKQMgNwMgIAEgACkDKDcDKCABIAApAzA3AzAgASAAKQM4NwM4IAEgACkDQDcDQCABIAApA0g3A0ggASAAKQNQNwNQIAEgACkDWDcDWCABIAApA2A3A2AgASAAKQNoNwNoIAEg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gAFqIAFBgAFqEIMBQYiLAiABQYABaiABQYABahCCAUHIigIgAUGAAWogAUGAAWoQggELMgAgACABIAIQggEgAEFAayABQUBrIAJBQGsQggEgAEGAAWogAUGAAWogAkGAAWoQggELMgAgACABIAIQgwEgAEFAayABQUBrIAJBQGsQgwEgAEGAAWogAUGAAWogAkGAAWoQgwELJQAgACABEIQBIABBQGsgAUFAaxCEASAAQYABaiABQYABahCEAQsqAQF/IABBgAFqEIcBIgEEQCABDwsgAEFAaxCHASIBBEAgAQ8LIAAQhwELJAAgACABEEQgAEFAayABQUBrEERxIABBgAFqIAFBgAFqEERxC50CACAAQYiNAhCBASAAQUBrQciNAhCBASAAQYABakGIjgIQgQEgACAAQUBrQciOAhB/IAAgAEGAAWpBiI8CEH8gAEFAayAAQYABakHIjwIQf0HIjwJBiJACENYBQYiNAkGIkAJBiJACEIMBQYiOAkHIkAIQ1gFByJACQciOAkHIkAIQgwFByI0CQYiPAkGIkQIQgwEgAEGAAWpByJACQciRAhB/IABBQGtBiJECQYiSAhB/QciRAkGIkgJByJECEIIBQciRAkHIkQIQ1gEgAEGIkAJBiJICEH9BiJICQciRAkHIkQIQggFByJECQciRAhCFAUHIkQJBiJACIAEQf0HIkQJByJACIAFBQGsQf0HIkQJBiJECIAFBgAFqEH8LMQAgACABIAIgAxCGASAAQUBrIAEgAiADQUBrEIYBIABBgAFqIAEgAiADQYABahCGAQspACAAQYABahA9BEAgACAAQUBrIABBQGsQPRsQiAEPCyAAQYABahCIAQv4AQECf0EAQQAoAgAiBSACQQFqQcABbGo2AgAgBRDaASAFQcABaiEFA0AgAiAGRwRAIAAQ1wEEQCAFQcABayAFENsBBSAAIAVBwAFrIAUQ3AELIAAgAWohACAFQcABaiEFIAZBAWohBgwBCwsgACABayEAIAMgAkEBayAEbGohAiAFQcABayIFIAUQ4wEDQCAGBEAgABDXAQRAIAUgBUHAAWsQ2wEgAhDZAQUgBUHAAWtByJICENsBIAUgACAFQcABaxDcASAFQciSAiACENwBCyAAIAFrIQAgAiAEayECIAVBwAFrIQUgBkEBayEGDAELC0EAIAU2AgALswIAIAJFBEAgAxDaAQ8LIABBiJQCENsBIAMQ2gEDQCACQQFrIgIgAWotAAAhACADIAMQ3QEgAEGAAU8EQCADQYiUAiADENwBIABBgAFrIQALIAMgAxDdASAAQcAATwRAIANBiJQCIAMQ3AEgAEFAaiEACyADIAMQ3QEgAEEgTwRAIANBiJQCIAMQ3AEgAEEgayEACyADIAMQ3QEgAEEQTwRAIANBiJQCIAMQ3AEgAEEQayEACyADIAMQ3QEgAEEITwRAIANBiJQCIAMQ3AEgAEEIayEACyADIAMQ3QEgAEEETwRAIANBiJQCIAMQ3AEgAEEEayEACyADIAMQ3QEgAEECTwRAIANBiJQCIAMQ3AEgAEECayEACyADIAMQ3QEgAARAIANBiJQCIAMQ3AELIAINAAsLJgBByIECIABBgAFqIAEQfyAAIAFBQGsQfiAAQUBrIAFBgAFqEH4LEQAgABDXASAAQcABahDXAXELEQAgABDYASAAQcABahDXAXELEAAgABDZASAAQcABahDZAQsQACAAENoBIABBwAFqENkBCxgAIAAgARDbASAAQcABaiABQcABahDbAQuFAQAgACABQciVAhDcASAAQcABaiABQcABakGIlwIQ3AEgACAAQcABakHImAIQ3gEgASABQcABakGImgIQ3gFByJgCQYiaAkHImAIQ3AFBiJcCIAIQ6AFByJUCIAIgAhDeAUHIlQJBiJcCIAJBwAFqEN4BQciYAiACQcABaiACQcABahDfAQscACAAIAEgAhDcASAAQcABaiABIAJBwAFqENwBC30AIAAgAEHAAWpByJsCENwBIAAgAEHAAWpBiJ0CEN4BIABBwAFqQcieAhDoASAAQcieAkHIngIQ3gFByJsCQYigAhDoAUGIoAJByJsCQYigAhDeAUGInQJByJ4CIAEQ3AEgAUGIoAIgARDfAUHImwJByJsCIAFBwAFqEN4BCyAAIAAgASACEN4BIABBwAFqIAFBwAFqIAJBwAFqEN4BCyAAIAAgASACEN8BIABBwAFqIAFBwAFqIAJBwAFqEN8BCxgAIAAgARDgASAAQcABaiABQcABahDgAQsYACAAIAEQ2wEgAEHAAWogAUHAAWoQ4AELGAAgACABEKQBIABBwAFqIAFBwAFqEKQBCxgAIAAgARCiASAAQcABaiABQcABahCiAQsZACAAIAEQ4gEgAEHAAWogAUHAAWoQ4gFxC2oAIABByKECEN0BIABBwAFqQYijAhDdAUGIowJByKQCEOgBQcihAkHIpAJByKQCEN8BQcikAkGIpgIQ4wEgAEGIpgIgARDcASAAQcABakGIpgIgAUHAAWoQ3AEgAUHAAWogAUHAAWoQ4AELIAAgACABIAIgAxDkASAAQcABaiABIAIgA0HAAWoQ5AELGgEBfyAAQcABahDhASIBBEAgAQ8LIAAQ4QELHQAgAEHAAWoQ1wEEQCAAEOUBDwsgAEHAAWoQ5QEL+AEBAn9BAEEAKAIAIgUgAkEBakGAA2xqNgIAIAUQ7AEgBUGAA2ohBQNAIAIgBkcEQCAAEOkBBEAgBUGAA2sgBRDtAQUgACAFQYADayAFEO4BCyAAIAFqIQAgBUGAA2ohBSAGQQFqIQYMAQsLIAAgAWshACADIAJBAWsgBGxqIQIgBUGAA2siBSAFEPgBA0AgBgRAIAAQ6QEEQCAFIAVBgANrEO0BIAIQ6wEFIAVBgANrQcinAhDtASAFIAAgBUGAA2sQ7gEgBUHIpwIgAhDuAQsgACABayEAIAIgBGshAiAFQYADayEFIAZBAWshBgwBCwtBACAFNgIAC7MCACACRQRAIAMQ7AEPCyAAQciqAhDtASADEOwBA0AgAkEBayICIAFqLQAAIQAgAyADEPABIABBgAFPBEAgA0HIqgIgAxDuASAAQYABayEACyADIAMQ8AEgAEHAAE8EQCADQciqAiADEO4BIABBQGohAAsgAyADEPABIABBIE8EQCADQciqAiADEO4BIABBIGshAAsgAyADEPABIABBEE8EQCADQciqAiADEO4BIABBEGshAAsgAyADEPABIABBCE8EQCADQciqAiADEO4BIABBCGshAAsgAyADEPABIABBBE8EQCADQciqAiADEO4BIABBBGshAAsgAyADEPABIABBAk8EQCADQciqAiADEO4BIABBAmshAAsgAyADEPABIAAEQCADQciqAiADEO4BCyACDQALC9EBAEHIuQIQ7AFByLkCQci5AhDzASAAQcitAkHAAUHIsAIQ/QFByLACQcizAhDwASAAQcizAkHIswIQ7gFByLMCQci2AhD0AUHItgJByLMCQci2AhDuAUHItgJByLkCEPcBBEAAC0HIsAIgAEHIvAIQ7gFByLMC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ECABQYABakGQjwQgAUGAAWoQfyAAQcABaiABQcABahAAIABB4AFqIAFB4AFqEBAgAUHAAWpB0I8EIAFBwAFqEH8gAEGAAmogAUGAAmoQACAAQaACaiABQaACahAQIAFBgAJqQZCQBCABQYACahB/IABBwAJqIAFBwAJqEAAgAEHgAmogAUHgAmoQECABQcACakHQkAQgAUHAAmoQfwtkACAAQZCRBCABEH8gAEFAa0HQkQQgAUFAaxB/IABBgAFqQZCSBCABQYABahB/IABBwAFqQdCSBCABQcABahB/IABBgAJqQZCTBCABQYACahB/IABBwAJqQdCTBCABQcACahB/C4ACACAAIAEQACAAQSBqIAFBIGoQECABQZCUBCABEH8gAEFAayABQUBrEAAgAEHgAGogAUHgAGoQECABQUBrQdCUBCABQUBrEH8gAEGAAWogAUGAAWoQACAAQaABaiABQaABahAQIAFBgAFqQZCVBCABQYABahB/IABBwAFqIAFBwAFqEAAgAEHgAWogAUHgAWoQECABQcABakHQlQQgAUHAAWoQfyAAQYACaiABQYACahAAIABBoAJqIAFBoAJqEBAgAUGAAmpBkJYEIAFBgAJqEH8gAEHAAmogAUHAAmoQACAAQeACaiABQeACahAQIAFBwAJqQdCWBCABQcACahB/C2QAIABBkJcEIAEQfyAAQUBrQdCXBCABQUBrEH8gAEGAAWpBkJgEIAFBgAFqEH8gAEHAAWpB0JgEIAFBwAFqEH8gAEGAAmpBkJkEIAFBgAJqEH8gAEHAAmpB0JkEIAFBwAJqEH8LgAIAIAAgARAAIABBIGogAUEgahAQIAFBkJoEIAEQfyAAQUBrIAFBQGsQACAAQeAAaiABQeAAahAQIAFBQGtB0JoEIAFBQGsQfyAAQYABaiABQYABahAAIABBoAFqIAFBoAFqEBAgAUGAAWpBkJsEIAFBgAFqEH8gAEHAAWogAUHAAWoQACAAQeABaiABQeABahAQIAFBwAFqQdCbBCABQcABahB/IABBgAJqIAFBgAJqEAAgAEGgAmogAUGgAmoQECABQYACakGQnAQgAUGAAmoQfyAAQcACaiABQcACahAAIABB4AJqIAFB4AJqEBAgAUHAAmpB0JwEIAFBwAJqEH8LZAAgAEGQnQQgARB/IABBQGtB0J0EIAFB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"; +export const pq = 488; +export const pr = 1768; +export const pG1gen = 32008; +export const pG1zero = 32104; +export const pG1b = 3080; +export const pG2gen = 32200; +export const pG2zero = 32392; +export const pG2b = 12648; +export const pOneT = 32584; +export const prePSize = 192; +export const preQSize = 19776; +export const n8q = 32; +export const n8r = 32; +export const q = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; +export const r = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; diff --git a/src/wasm/msm_batch_wasm.js b/src/wasm/msm_batch_wasm.js new file mode 100644 index 0000000..5ffbef9 --- /dev/null +++ b/src/wasm/msm_batch_wasm.js @@ -0,0 +1,4 @@ +// AUTO-GENERATED from wasmcurves/build/msm_batch.wasm — do not edit. +// Regenerate with: npm run gen-wasm +// Batch-affine MSM module; links against the main curve module at runtime. +export const code = "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"; diff --git a/src/wasm_field1.js b/src/wasm_field1.js index e5c3b64..7dbd8bb 100644 --- a/src/wasm_field1.js +++ b/src/wasm_field1.js @@ -282,7 +282,7 @@ export default class WasmField1 { {cmd: "GET", out: 0, var: 1, len:sOut * n}, ]; opPromises.push( - this.tm.queueAction(task) + this.tm.queueAction(task, [buffChunk.buffer]) ); } diff --git a/test/bn128.js b/test/bn128.js index c6c6291..29c18a0 100644 --- a/test/bn128.js +++ b/test/bn128.js @@ -73,6 +73,20 @@ describe("bn128", async function () { } }); + it("Fr.fft consume matches non-consume and detaches the input", async () => { + const Fr = bn128.Fr; + const N = 1 << 10; + const a = new Uint8Array(N * Fr.n8); + for (let i = 0; i < N; i++) a.set(Fr.e(i + 1), i * Fr.n8); + + const ref = await Fr.fft(a.slice(), "", "", null, "ref"); // copy, non-consume + const got = await Fr.fft(a, "", "", null, "consume", true); // flat Uint8Array -> consumed + + assert.equal(got.byteLength, ref.byteLength); + for (let i = 0; i < ref.byteLength; i++) assert.equal(got[i], ref[i]); + assert.equal(a.byteLength, 0, "consumed input buffer should be detached"); + }); + it("It shoud do a big FFT/IFFT in Fr", async () => { @@ -86,7 +100,7 @@ describe("bn128", async function () { const Ainv = await bn128.Fr.ifft(A); for (let i=0; i bases.slice(off, off+len); + const got = await G.multiExpAffineChunked(reader, bases.byteLength, scalars, null, "chunked"); + assert(G.eq(expected, got)); + } + + it("multiExpAffineChunked (G1) matches multiExpAffine", async () => { + await checkChunkedMatches(bn128.G1, bn128.Fr, 1 << 14); // ~4 chunks + }); + + it("multiExpAffineChunked (G2) matches multiExpAffine", async () => { + await checkChunkedMatches(bn128.G2, bn128.Fr, 1 << 13); // ~2 chunks + }); + + it("multiexp batching modes (auto/enabled/disabled) agree", async () => { + const G = bn128.G1, Fr = bn128.Fr; + const N = 1 << 12; + const sG = G.F.n8*2; + const scalars = new Uint8Array(N*Fr.n8); + const bases = new Uint8Array(N*sG); + for (let i=0; i { + const G = bn128.G1, Fr = bn128.Fr; + const N = 1 << 11; + const sG = G.F.n8*2; + const scalars = new Uint8Array(N*Fr.n8); + const bases = new Uint8Array(N*sG); + for (let i=0; i { + const G = bn128.G2, Fr = bn128.Fr; + const N = 1 << 10; + const sG = G.F.n8*2; + const scalars = new Uint8Array(N*Fr.n8); + const bases = new Uint8Array(N*sG); + for (let i=0; i { + let threw = false; + try { await bn128.G1.multiExpAffineChunked(null, 64, new Uint8Array(32), null, "bad"); } + catch { threw = true; } + assert(threw, "should throw when basesReader is not a function"); + }); + }); diff --git a/test/ses.test.js b/test/ses.test.js new file mode 100644 index 0000000..378623c --- /dev/null +++ b/test/ses.test.js @@ -0,0 +1,20 @@ +import { execFileSync } from "child_process"; +import { fileURLToPath } from "url"; +import path from "path"; + +// Runs the SES lockdown harness (test/ses/lockdown.mjs) as its OWN process. +// lockdown() is global and irreversible, so it must never run in the mocha +// process itself -- doing so would freeze intrinsics out from under every other +// test. Spawning a child keeps the realm hardening fully isolated; here we just +// assert the harness exits 0. +describe("SES lockdown", function () { + this.timeout(120000); // building both curves single-threaded is slow + + it("builds curves and runs pairings inside a hardened SES realm", () => { + const dir = path.dirname(fileURLToPath(import.meta.url)); + const harness = path.join(dir, "ses", "lockdown.mjs"); + // throws (failing the test) if the harness exits non-zero; inherit stdio + // so the harness's ok/FAIL lines appear in the mocha output. + execFileSync(process.execPath, [harness], { stdio: "inherit" }); + }); +}); diff --git a/test/ses/lockdown.mjs b/test/ses/lockdown.mjs new file mode 100644 index 0000000..2052e77 --- /dev/null +++ b/test/ses/lockdown.mjs @@ -0,0 +1,98 @@ +// SES lockdown harness — run with `npm run test:ses` (or via test/ses.test.js). +// +// Validates that ffjavascript builds a curve and runs under a SES hardened +// profile: frozen intrinsics + frozen globalThis, no Worker (single-thread). +// This catches regressions plain unit tests can't -- +// e.g. mutating globalThis at module load (the module-local curve cache fix), or +// touching Blob/btoa at import. +// +// Lives in a subdirectory and is run as its own process so lockdown() (global +// and irreversible) never affects the main mocha suite. The modules under test +// are imported AFTER lockdown so their evaluation happens inside the realm. +import "ses"; + +// errorTaming:'unsafe' keeps readable stack traces on failure; the rest are +// defaults (shared intrinsics hardened/frozen). +lockdown({ errorTaming: "unsafe" }); + +let failed = false; +function check(cond, msg) { + if (cond) { + console.log("ok " + msg); + } else { + failed = true; + console.error("FAIL " + msg); + } +} + +// Core SES guarantee: shared intrinsics are frozen. Confirms lockdown is active. +check(Object.isFrozen(Object.prototype), "lockdown active (Object.prototype frozen)"); + +// Simulate the strictest realm (a hardened profile that freezes the global object): +// freeze globalThis so any module-load-time globalThis mutation -- the kind the +// module-local curve cache fix removed -- throws on the import below. +Object.freeze(globalThis); +let frozen = false; +try { globalThis.__ses_probe__ = 1; } catch { frozen = true; } +check(frozen, "globalThis frozen (assigning a global throws)"); + +let buildBn128, buildBls12381; +try { + ({ default: buildBn128 } = await import("../../src/bn128.js")); + ({ default: buildBls12381 } = await import("../../src/bls12381.js")); + check(true, "curve modules import under frozen globalThis (no global mutation at load)"); +} catch (e) { + check(false, "curve modules import under frozen globalThis -- threw: " + (e && e.stack ? e.stack : e)); +} + +if (buildBn128 && buildBls12381) { + for (const [name, build] of [["bn128", buildBn128], ["bls12381", buildBls12381]]) { + try { + const c = await build(true); // single-thread: SES realms have no Worker + check(c.G1.isValid(c.G1.g), `${name}: builds under lockdown, G1 generator valid`); + // pairing bilinearity: e(2P, Q) == e(P, 2Q) + const two = c.Fr.e(2); + const lhs = await c.pairing(c.G1.timesFr(c.G1.g, two), c.G2.g); + const rhs = await c.pairing(c.G1.g, c.G2.timesFr(c.G2.g, two)); + check(c.Gt.eq(lhs, rhs), `${name}: pairing bilinearity holds under lockdown`); + + // Multiexp through the batch module (the single-thread task manager + // instantiates the batch-affine MSM module next to the main one -- + // a second WebAssembly.instantiate inside the hardened realm) and + // through the GLV/GLS endomorphism paths, checked against the + // plain path for agreement. + for (const [gName, G] of [["G1", c.G1], ["G2", c.G2]]) { + const N = 256; + const sG = G.F.n8 * 2; + const scalars = new Uint8Array(N * c.Fr.n8); + const bases = new Uint8Array(N * sG); + for (let i = 0; i < N; i++) { + const num = c.Fr.e(i * 17 + 3); + scalars.set(c.Fr.fromMontgomery(num), i * c.Fr.n8); + bases.set(G.toAffine(G.timesFr(G.g, num)), i * sG); + } + const rBatch = await G.multiExpAffine(bases, scalars, null, "b", { batch: "enabled" }); + const rNoEndo = await G.multiExpAffine(bases, scalars, null, "n", { batch: "enabled", glv: "disabled", gls: "disabled" }); + const rPlain = await G.multiExpAffine(bases, scalars, null, "p", { batch: "disabled" }); + check(G.eq(rBatch, rPlain) && G.eq(rNoEndo, rPlain), + `${name}: ${gName} multiexp (batch/endo/plain agree) under lockdown`); + } + + // Fr FFT roundtrip in the hardened realm + const nF = 1 << 10; + const fbuf = new Uint8Array(nF * c.Fr.n8); + for (let i = 0; i < nF; i++) fbuf.set(c.Fr.e(i * 31 + 7), i * c.Fr.n8); + const rt = await c.Fr.ifft(await c.Fr.fft(fbuf)); + check(Buffer.from(rt).equals(Buffer.from(fbuf)), `${name}: Fr fft/ifft roundtrip under lockdown`); + await c.terminate(); + } catch (e) { + check(false, `${name}: threw under lockdown -- ${e && e.stack ? e.stack : e}`); + } + } +} + +if (failed) { + console.error("SES LOCKDOWN HARNESS FAILED"); + process.exit(1); +} +console.log("SES LOCKDOWN HARNESS PASSED"); diff --git a/test/utils.js b/test/utils.js index 693557c..8ff0af1 100644 --- a/test/utils.js +++ b/test/utils.js @@ -30,7 +30,7 @@ describe("Utils native", () => { it("Should generate buffer little-endian without trailing non-zero element", () => { for (let i = 1; i < 33; i++) { - var buff = utilsN.leInt2Buff(BigInt(42), i); + let buff = utilsN.leInt2Buff(BigInt(42), i); for (let t = 1; t < buff.length; t++){ assert(buff[t] === 0, true); } @@ -39,7 +39,7 @@ describe("Utils native", () => { it("Should generate buffer big-endian without trailing non-zero element", () => { for (let i = 1; i < 33; i++) { - var buff = utilsN.beInt2Buff(BigInt(42), i); + let buff = utilsN.beInt2Buff(BigInt(42), i); for (let t = 0; t < buff.length - 1; t++){ assert(buff[t] === 0, true); }