UNPKG

@bitcoinerlab/miniscript

Version:

Bitcoin Miniscript, a high-level language for describing Bitcoin spending conditions. It includes a Policy and Miniscript compiler, as well as a novel Satisfier for generating expressive witness scripts.

536 lines (491 loc) 818 kB
'use strict'; var bip68 = require('bip68'); // Copyright (c) 2022 Jose-Luis Landabaso - https://bitcoinerlab.com const ABSOLUTE = 'ABSOLUTE'; const RELATIVE = 'RELATIVE'; /** * Calculates the maximum lock time value between two lock time values (a and b) * using the specified lock type (ABSOLUTE or RELATIVE). * It asserts that there are no timeLock mixings. * It asserts that a or b are correctly encoded in bip68 format if they are * RELATIVE. * Either both a and b are block based or time based. * https://medium.com/blockstream/dont-mix-your-timelocks-d9939b665094 * * If only a or b is undefined it asserts the value and returns it. * If none are defined it returns undefined. * @param {string|number} [a] - The first lock time value to compare. * @param {string|number} [b] - The second lock time value to compare. * @param {string} lockType - The type of lock time to use. Can be either "ABSOLUTE" or "RELATIVE". * @return {number} - The maximum lock time value between a and b. */ function maxLock(a, b, lockType) { if (typeof a === 'undefined' && typeof b === 'undefined') { return undefined; } if (typeof lockType === 'undefined') throw new Error('lockType must be specified'); // Check that lockType is either "ABSOLUTE" or "RELATIVE" if (lockType !== ABSOLUTE && lockType !== RELATIVE) throw new Error('lockType must be either "ABSOLUTE" or "RELATIVE"'); function isInteger(number) { const isNumeric = !isNaN(number) && !isNaN(parseFloat(number)); if (isNumeric && Number.isInteger(Number(number))) return true; else return false; } if (typeof a !== 'undefined') { if (isInteger(a) === false) throw new Error('nSequence/nLockTime must be an integer: ' + a); a = Number(a); if ( lockType === RELATIVE && !bip68.decode(a).hasOwnProperty('seconds') && !bip68.decode(a).hasOwnProperty('blocks') ) throw new Error('Invalid bip68 encoded a value: ' + a); } if (typeof b !== 'undefined') { if (isInteger(b) === false) throw new Error('nSequence/nLockTime must be an integer: ' + b); b = Number(b); if ( lockType === RELATIVE && !bip68.decode(b).hasOwnProperty('seconds') && !bip68.decode(b).hasOwnProperty('blocks') ) throw new Error('Invalid bip68 encoded b value: ' + b); } if (typeof a !== 'undefined' && typeof b !== 'undefined') { if (lockType === ABSOLUTE) { // Both a and b must be either below 500000000 or both above or equal 500000000 if ( (a < 500000000 && b >= 500000000) || (a >= 500000000 && b < 500000000) ) { throw new Error( 'nLockTime values must be either below 500000000 or both above or equal 500000000' ); } } else { const decodedA = bip68.decode(a); const decodedB = bip68.decode(b); if ( decodedA.hasOwnProperty('seconds') !== decodedB.hasOwnProperty('seconds') ) { throw new Error( 'a and b must both be either represent seconds or block height' ); } } return Math.max(a, b); } if (typeof a !== 'undefined') return a; if (typeof b !== 'undefined') return b; return undefined; } // Copyright (c) 2022 Jose-Luis Landabaso - https://bitcoinerlab.com /** * Given a `solutionTemplate`, such as "0 dsat(X) sat(Y) 1 sat(Z)", and given the * sat/dissatisfactions for X, Y, Z,... (comprised in `satisfactionsMap`) it * computes all the possible combination of solutions returned in an array * of {@link Solution}. * * Terminology: * * A solution of type {@link Solution} is an object * that contains an unlocking witness for a * miniscript fragment. * * When matching an unlocking witness with a locking * script, they can produce True or False. These solutions are called sats and * dsats, respectively. * * For example, take this solution: `sol = {asm:"sig key"}`. * * When matched with `DUP HASH160 <HASH160(key)> EQUALVERIFY CHECKSIG` it * produces `True`, that is, a valid sat solution: `<sig> <key> DUP HASH160 <HASH160(key)> EQUALVERIFY CHECKSIG`. * * A solution object can also contain other associated pieces of information: `solution: {asm, nLockTime, nSequence}`: * - nLockTime, nSequence: (number/str) interlock attached to this transaction * * A `solutionTemplate` describes a solution using sats and dsats of subexpressions. * * F.ex., this is a `solutionTemplate = "0 dsat(X) sat(Y) 1 sat(Z)"`. * * satisfactions is an object of type {@link Satisfactions} * that comprises both sat and dsat solutions for a * miniscript fragment: * * `satisfactions = {sats: [sol_s1, sol_s2, ...], dsats: [sol_d1, ...]}` * * satisfactionsMap is a group of satisfactions: * ```javascript * satisfactionsMap = { X: satisfactions_X, Y: satisfactions_Y, ...} = * satisfactionsMap = { * X: { * sats: [sol_s1, sol_s2, ...], * dsats:[...] * }, * Y: {sats: [...], dsats: [...]}, * ...} * ``` * * @param {string} solutionTemplate - a string containing sat or dsat expressions such as: "0 dsat(X) sat(Y) 1 sat(Z)" * @param {Object} satisfactionsMap - an object mapping the arguments for the sat and dsat expressions * in `solutionTemplate` (f.ex: `X, Y, Z`) to their {@link Satisfactions}. * @param {Satisfactions} [satisfactionsMap.X] - The satisfactions for `X` * @param {Satisfactions} [satisfactionsMap.Y] - The satisfactions for `Y` * @param {Satisfactions} [satisfactionsMap.Z] - The satisfactions for `Z` * @param {Satisfactions} [satisfactionsMap....] - The satisfactions for `...` * * @returns {Solution[]} an array of solutions, containing the resulting witness, nSequence and nLockTime values, and whether the solution has a HASSIG marker or should be marked as "DONTUSE". */ function combine(solutionTemplate, satisfactionsMap) { //First, break solutionTemplate into 3 parts: // pre + curr + post, //where curr is the first sat(...)/dsat(...) in solutionTemplate. // //For example, in "0 dsat(X) sat(Y) 1 sat(Z)": // pre= "0 "; curr = "dsat(X)"; post: " sat(Y) sat(Z)" // //Recursively call combine(post) until there are no further //sat()/dsat() in *post* //regExp that matches the first dsat(...) or sat(...): const reCurr = /d?sat\(([^\(]*)\)/; const currMatch = solutionTemplate.match(reCurr); if (currMatch && currMatch.length) { //The array of solutions to be computed and returned. const solutions = []; //curr is the first d?sat() matched in solutionTemplate: const curr = currMatch[0]; //pre is whatever was before the first d?sat(): const pre = solutionTemplate.split(curr)[0]; //post is whatever was after the first d?sat(): const post = solutionTemplate.slice(curr.length + pre.length); //the argument for curr: d?sat( -> argument <- ): //This will match the string "X" in the example above: //currArg = "X" for solutionTemplate "0 dsat(X) sat(Y) 1 sat(Z)" const currArg = currMatch[1]; //currKey = "sats" or "dsats". "dsats" for the example above. const currKey = curr[0] === 'd' ? 'dsats' : 'sats'; if (typeof satisfactionsMap[currArg] !== 'object') throw new Error( `satisfactionsMap does not provide sats/dsats solutions for argument ${currArg}, evaluating: ${solutionTemplate}` ); const currSolutions = satisfactionsMap[currArg][currKey] || []; for (const currSolution of currSolutions) { //Does *post* contain further sat() or dsat() expressions? if (post.match(reCurr)) { //There are more sat/dsat, do a recursive call: const postSolutions = combine(post, satisfactionsMap); for (const postSolution of postSolutions) { //if ((currSolution.nLockTime && postSolution.nLockTime)) return []; solutions.push({ nSequence: maxLock( currSolution.nSequence, postSolution.nSequence, RELATIVE ), nLockTime: maxLock( currSolution.nLockTime, postSolution.nLockTime, ABSOLUTE ), asm: `${pre}${currSolution.asm}${postSolution.asm}` }); } } else { //This was the last instance of combine where there are no *post* //sat/dsats solutions.push({ ...currSolution, asm: `${pre}${currSolution.asm}${post}` }); } } //markDontUseSolutions(solutions); return solutions; } throw new Error('Invalid solutionTemplate: ' + solutionTemplate); } /** * An object containing functions for generating Basic satisfaction and dissatisfaction sets for miniscripts. * * @see {@link https://bitcoin.sipa.be/miniscript/} * @typedef {Object} SatisfactionsMaker * */ const satisfactionsMaker = { 0: () => ({ dsats: [{ asm: `` }] }), 1: () => ({ sats: [{ asm: `` }] }), pk_k: key => ({ dsats: [{ asm: `0` }], sats: [{ asm: `<sig(${key})>` }] }), pk_h: key => ({ dsats: [{ asm: `0 <${key}>` }], sats: [{ asm: `<sig(${key})> <${key}>` }] }), older: n => ({ sats: [{ asm: ``, nSequence: n }] }), after: n => ({ sats: [{ asm: ``, nLockTime: n }] }), sha256: h => ({ sats: [{ asm: `<sha256_preimage(${h})>` }], dsats: [{ asm: `<random_preimage()>` }] }), ripemd160: h => ({ sats: [{ asm: `<ripemd160_preimage(${h})>` }], dsats: [{ asm: `<random_preimage()>` }] }), hash256: h => ({ sats: [{ asm: `<hash256_preimage(${h})>` }], dsats: [{ asm: `<random_preimage()>` }] }), hash160: h => ({ sats: [{ asm: `<hash160_preimage(${h})>` }], dsats: [{ asm: `<random_preimage()>` }] }), andor: (X, Y, Z) => ({ dsats: [ ...combine(`dsat(Z) dsat(X)`, { X, Y, Z }), ...combine(`dsat(Y) sat(X)`, { X, Y, Z }) ], sats: [ ...combine('sat(Y) sat(X)', { X, Y, Z }), ...combine('sat(Z) dsat(X)', { X, Y, Z }) ] }), and_v: (X, Y) => ({ dsats: [...combine(`dsat(Y) sat(X)`, { X, Y })], sats: [...combine(`sat(Y) sat(X)`, { X, Y })] }), and_b: (X, Y) => ({ dsats: [ ...combine(`dsat(Y) dsat(X)`, { X, Y }), //https://bitcoin.sipa.be/miniscript/ //The non-canonical options for and_b, or_b, and thresh are always //overcomplete (reason 3), so instead use DONTUSE there ...combine(`sat(Y) dsat(X)`, { X, Y }), ...combine(`dsat(Y) sat(X)`, { X, Y }) ], sats: [...combine(`sat(Y) sat(X)`, { Y, X })] }), or_b: (X, Z) => ({ dsats: [...combine(`dsat(Z) dsat(X)`, { X, Z })], sats: [ ...combine(`dsat(Z) sat(X)`, { X, Z }), ...combine(`sat(Z) dsat(X)`, { X, Z }), //https://bitcoin.sipa.be/miniscript/ //The non-canonical options for and_b, or_b, and thresh are always //overcomplete (reason 3), so instead use DONTUSE there ...combine(`sat(Z) sat(X)`, { X, Z }) ] }), or_c: (X, Z) => ({ sats: [ ...combine(`sat(X)`, { X, Z }), ...combine(`sat(Z) dsat(X)`, { X, Z }) ] }), or_d: (X, Z) => ({ dsats: [...combine(`dsat(Z) dsat(X)`, { X, Z })], sats: [ ...combine(`sat(X)`, { X, Z }), ...combine(`sat(Z) dsat(X)`, { X, Z }) ] }), or_i: (X, Z) => ({ dsats: [ ...combine(`dsat(X) 1`, { X, Z }), ...combine(`dsat(Z) 0`, { X, Z }) ], sats: [...combine(`sat(X) 1`, { X, Z }), ...combine(`sat(Z) 0`, { X, Z })] }), /* * This is not entirely trivial from the docs * (https://bitcoin.sipa.be/miniscript/), * but solution templates for thresh must be written in reverse order. * For example the first dsat, which is "All dsats", corresponds to: * "<DSAT_N> <DSAT_N-1> ... <DSAT_1>" (note the reverse order in N) * While this is not entirely trivial by reading the document * it can be deduced by analyzing the script: * thresh(k,X1,...,Xn) [X1] [X2] ADD ... [Xn] ADD ... <k> EQUAL */ thresh: (k, ...satisfactionsArray) => { if (Number.isInteger(Number(k)) && Number(k) > 0) k = Number(k); else throw new Error(`k must be positive number: ${k}`); //First, convert input satisfactions (which are dynamic for thresh //and multi) into an object. //For example, if input was, thresh(k, X, Y, Z), then //create an object like this: satisfactionsMap = {X, Y, Z}; const satisfactionsMap = {}; const N = satisfactionsArray.length; satisfactionsArray.map((satisfactions, index) => { satisfactionsMap[index] = satisfactions; }); const dsats = []; const sats = []; //Push the canonical dsat (All dsats): //"<DSAT_N> <DSAT_N-1> ... <DSAT_1>" (note the reverse order) dsats.push( ...combine( Object.keys(satisfactionsMap) .map(mapKeyName => `dsat(${mapKeyName})`) .reverse() .join(' '), satisfactionsMap ) ); const dsatsNonCanSolutionTemplates = []; //Sats/dsats with 1 ≤ #(sats) ≠ k const satsSolutionTemplates = []; //Sats/dsats with #(sats) = k for (let i = 1; i < 1 << N; i++) { const c = []; let totalSatisfactions = 0; for (let j = 0; j < N; j++) { if (i & (1 << j)) totalSatisfactions++; c.push(i & (1 << j) ? `sat(${j})` : `dsat(${j})`); } if (totalSatisfactions !== k) dsatsNonCanSolutionTemplates.push(c.reverse().join(' ')); else satsSolutionTemplates.push(c.reverse().join(' ')); } //Push the non canonical dsats: for (const solutionTemplate of dsatsNonCanSolutionTemplates) { //https://bitcoin.sipa.be/miniscript/ //The non-canonical options for and_b, or_b, and thresh are always //overcomplete (reason 3), so instead use DONTUSE there dsats.push(...combine(solutionTemplate, satisfactionsMap)); } //Push the sats (which all are canonical): for (const solutionTemplate of satsSolutionTemplates) { sats.push(...combine(solutionTemplate, satisfactionsMap)); } return { dsats, sats }; }, multi: (k, ...keys) => { if (Number.isInteger(Number(k)) && Number(k) > 0) k = Number(k); else throw new Error(`k must be positive number: ${k}`); //Example of a multi-sig locking script: //OP_3 <pubKey1> <pubKey2> <pubKey3> <pubKey4> OP_4 OP_CHECKMULTISIG //unlockingScript: OP_0 <sig1> <sig2> <sig4> //OP_0 is a dummy OP, needed because of a bug in Bitcoin if (typeof k !== 'number') throw new Error('k must be a number:' + k); if (k === 0) throw new Error('k cannot be 0'); const dsats = [{ asm: '0 '.repeat(k + 1).trim() }]; // Create all combinations of k signatures function keyCombinations(keys, k) { if (k === 0) { return [[]]; } const combinations = []; for (let i = 0; i < keys.length; i++) { const remainingKeys = keys.slice(i + 1); const subCombinations = keyCombinations(remainingKeys, k - 1); subCombinations.forEach(combination => { combinations.push([keys[i], ...combination]); }); } return combinations; } const asms = []; // Create asms from keyCombination keyCombinations(keys, k).forEach(combination => { let asm = '0'; combination.forEach(key => { asm += ` <sig(${key})>`; }); asms.push(asm); }); let asm = '0'; for (let i = 0; i < k; i++) { asm += ` <sig(${keys[i]})>`; } const sats = asms.map(asm => ({ asm })); return { sats, dsats }; }, a: X => ({ dsats: [...combine(`dsat(X)`, { X })], sats: [...combine(`sat(X)`, { X })] }), s: X => ({ dsats: [...combine(`dsat(X)`, { X })], sats: [...combine(`sat(X)`, { X })] }), c: X => ({ dsats: [...combine(`dsat(X)`, { X })], sats: [...combine(`sat(X)`, { X })] }), d: X => ({ dsats: [{ asm: `0` }], sats: [...combine(`sat(X) 1`, { X })] }), v: X => ({ sats: [...combine(`sat(X)`, { X })] }), /** * j:X corresponds to SIZE 0NOTEQUAL IF [X] ENDIF * * By definition, this: "dsat(X) X" produces a zero. * * * A dsat needs to make this "dsat(X) X" return zero. * The easiest dsat for j:X is using 0: * 0 SIZE 0NOTEQUAL IF [X] ENDIF * 0 0 0NOTEQUAL IF [X] ENDIF * 0 0 IF [X] ENDIF * 0 * Now let's do the case where dsat(X) finishes with a 0: "... 0" * ... 0 SIZE 0NOTEQUAL IF [X] ENDIF * ... 0 0 0NOTEQUAL IF [X] ENDIF * ... 0 0 IF [X] ENDIF * ... 0 * DSAT(X) * The final expression is "DSAT(X)". * It should have either been "0" or "DSAT(X) X" * Thus, this is not a valid dsat. * Now let's do the case where dsat(X) is this: "... <nonzero>" * ... <nonzero> SIZE 0NOTEQUAL IF [X] ENDIF * ... <nonzero> <length_is_nonzero> 0NOTEQUAL IF [X] ENDIF * ... <nonzero> 1 IF [X] ENDIF * ... <nonzero> [X] * DSAT(X) [X] * DSAT(X) X is a good dsat */ j: X => { const dsats = []; dsats.push({ asm: `0` }); //Filter the dsats of X with Non Zero Top Stack (nztp). const dsats_nzts = X.dsats.filter( //The top stack corresponds to the last element pushed to the stack, //that is, the last element in the produced witness solution => solution.asm.trim().split(' ').pop() !== '0' ); dsats.push(...dsats_nzts); return { dsats, sats: [...combine(`sat(X)`, { X })] }; }, n: X => ({ dsats: [...combine(`dsat(X)`, { X })], sats: [...combine(`sat(X)`, { X })] }) }; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var bindings = createCommonjsModule(function (module, exports) { var Module = (() => { var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; return ( function(moduleArg = {}) { var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject;});var moduleOverrides=Object.assign({},Module);var thisProgram="./this.program";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}{if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src;}if(_scriptDir){scriptDirectory=_scriptDir;}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1);}else {scriptDirectory="";}}Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];Module["noExitRuntime"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536);},Module:function(binary){},Instance:function(module,info){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(_a){function c(d){d.set=function(a,b){this[a]=b;};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a;}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-(o[j-1]=="=");for(;a<j;a+=4){g=f[o.charCodeAt(a+1)];h=f[o.charCodeAt(a+2)];m[i++]=f[o.charCodeAt(a)]<<2|g>>4;if(i<k)m[i++]=g<<4|h>>2;if(i<k)m[i++]=h<<6|f[o.charCodeAt(a+3)];}}function p(q){l(e,1024,"ZG16AFZ6AGluZmluaXR5AGNoYW5nZV9jYXBhY2l0eQBGZWJydWFyeQBKYW51YXJ5AEp1bHkAVGh1cnNkYXkAVHVlc2RheQBXZWRuZXNkYXkAU2F0dXJkYXkAU3VuZGF5AE1vbmRheQBGcmlkYXkATWF5ACVtLyVkLyV5AGR1eABCL3pvbm1zeABWL3Vuem9mbXN4AEsvdW56b2Ztc3gAQi91bnpvZm1zeABCby91ZGZlbXN4AGZ4AG5keAAtKyAgIDBYMHgALTBYKzBYIDBYLTB4KzB4IDB4AF9fbmV4dF9wcmltZSBvdmVyZmxvdwBOb3YAYW5kX3YAVGh1AFdlbWR1AEJlbWR1AFdkdQBCZHUAQXVndXN0AHN0ZDo6YmFkX2Nhc3QAQ29tcHV0aW5nIENvc3RQYWlyIG9mIHVua25vd24gZnJhZ21lbnQAbmV3X2luZGlyZWN0AF91bmlvbi5pbmRpcmVjdABPY3QAU2F0AHpzAGsgPj0gMSAmJiBrIDw9IG5fa2V5cwB1cwBDYWxjT3BzAG91bXMAVi9uem9tcwBCZHVlL3pvbXMAV2RlL3pvbXMAQmRlL3pvbXMAVi96b21zAFYvbnNvbXMAem9ubXMAVi96Zm1zAFYvem91Zm1zAEsvem91Zm1zAEIvem91Zm1zAEJuL291Zm1zAFYvenVkZmVtcwBLL3p1ZGZlbXMAQi96dWRmZW1zAFYvem91ZGZlbXMASy96b3VkZmVtcwBCL3pvdWRmZW1zAEIvdWRmZW1zAEJ6b25kZmVtcwBXL3pvbmRmZW1zAEIvem9uZGZlbXMAQm1zAFZCS3VmcwB6ZXMAayA+PSAxICYmIGsgPD0gbl9zdWJzAEdldFBRcwBBcHIAdmVjdG9yAHVuc3BlY2lmaWVkIGlvc3RyZWFtX2NhdGVnb3J5IGVycm9yAG1vbmV5X2dldCBlcnJvcgBDYWxjQ29zdFBhaXIAR2V0VHlwZUZpbHRlcgBhZnRlcgBvbGRlcgBPY3RvYmVyAE5vdmVtYmVyAFNlcHRlbWJlcgBEZWNlbWJlcgBpb3NfYmFzZTo6Y2xlYXIATWFyAGl0LT5zZWNvbmQucSA9PSBxAG1pbmlzY3JpcHQvYml0Y29pbi9zY3JpcHQvbWluaXNjcmlwdC5jcHAAbWluaXNjcmlwdC9jb21waWxlci5jcHAAU2VwACVJOiVNOiVTICVwAGl0LT5zZWNvbmQucCA9PSBwAEJvAFN1bgBKdW4Ac3RkOjpleGNlcHRpb24AR2V0Q29tcGlsYXRpb24ATW9uAENvbXB1dGVTY3JpcHRMZW4AbmFuAEphbgBCbgBkem0Ab25kZmVtAGlvc3RyZWFtAEp1bABsbABBcHJpbABVbmtub3duIGNoYXJhY3RlciBpbiBfbXN0IGxpdGVyYWwAQnp1ZGVtc3hrAEtvbnVkZW1zeGsAS251ZGVtc3hrAEJ6Zm14awBCenVmbXhrAEJudWRlbXNrAEJvbnVkbWsAZ2hpamsAZ2hpagBGcmkAYmFkX2FycmF5X25ld19sZW5ndGgAdGhyZXNoAE1hcmNoAG1pbmlzY3JpcHQvYml0Y29pbi9zY3JpcHQvbWluaXNjcmlwdC5oAG1pbmlzY3JpcHQvYml0Y29pbi9wcmV2ZWN0b3IuaABBdWcAYmFzaWNfc3RyaW5nAHNmAGluZgAlLjBMZgAlTGYAJWYAQ2FsY1N0YWNrU2l6ZQB0cnVlAFR1ZQB6c2UAUGFyc2UAZmFsc2UAU2FuaXRpemVUeXBlAENvbXB1dGVUeXBlAEp1bmUAQ29tcGlsZQBDU2NyaXB0OjpvcGVyYXRvcjw8KCk6IGludmFsaWQgb3Bjb2RlAEsvb25kZQBUcmVlRXZhbE1heWJlAGl0Mi5zZWNvbmQAYW5kAHVmZABsb2NhbGUgbm90IHN1cHBvcnRlZABXZWQAQWRkAFdkAEJkAFVua25vd24gZXJyb3IgJWQAc3RkOjpiYWRfYWxsb2MARGVjAEZlYgBhbmRfYgBhAC4tXwBbYW5hbHlzaXMgZXJyb3JdAFtjb21waWxlIGVycm9yXQBhbmRvciBbb3JdAFtpbnZhbGlkXQBPUF9WRVJJRlkAT1BfRVFVQUxWRVJJRlkAT1BfTlVNRVFVQUxWRVJJRlkAT1BfQ0hFQ0tTSUdWRVJJRlkAT1BfQ0hFQ0tNVUxUSVNJR1ZFUklGWQBPUF9DSEVDS0xPQ0tUSU1FVkVSSUZZAE9QX0NIRUNLU0VRVUVOQ0VWRVJJRlkAJWEgJWIgJWQgJUg6JU06JVMgJVkAUE9TSVgAT1BfTUFYAFcAQktWAE9QX0RJVgBPUF8yRElWAE9QX0lOVkVSVABPUF9ST1QAT1BfMlJPVABPUF9OT1QAT1BfUklHSFQAT1BfUlNISUZUAE9QX0xTSElGVABPUF9MRUZUAE9QX0NBVABPUF9BQlMAJUg6JU06JVMAT1BfU1VCU1RSAE9QX09SAE9QX1hPUgBPUF9DT0RFU0VQQVJBVE9SAE9QX0JPT0xPUgBPUF9WRVIAT1BfT1ZFUgBPUF8yT1ZFUgBPUF9EVVAAT1BfSUZEVVAAT1BfM0RVUABPUF8yRFVQAE9QX0RST1AAT1BfMkRST1AAT1BfTk9QAE9QX05JUABPUF9TV0FQAE9QXzJTV0FQAE9QX1VOS05PV04AT1BfUkVUVVJOAE9QX01JTgBPUF9XSVRISU4ATkFOAE9QX0xFU1NUSEFOAE9QX0dSRUFURVJUSEFOAFBNAEFNAE9QX01VTABPUF8yTVVMAGsgPj0gMSAmJiBrIDwgMHg4MDAwMDAwMFVMAE9QX1JPTEwATENfQUxMAE9QX0VRVUFMAE9QX05VTU5PVEVRVUFMAE9QXzBOT1RFUVVBTABPUF9MRVNTVEhBTk9SRVFVQUwAT1BfR1JFQVRFUlRIQU5PUkVRVUFMAE9QX05VTUVRVUFMAE9QX1RVQ0sAT1BfUElDSwBPUF9UT0FMVFNUQUNLAE9QX0ZST01BTFRTVEFDSwBPUF9ERVBUSABMQU5HAE9QX0NIRUNLU0lHAE9QX0NIRUNLTVVMVElTSUcASU5GAE9QX0lGAE9QX05PVElGAE9QX1ZFUk5PVElGAE9QX1ZFUklGAE9QX0VORElGAE9QX1NJWkUAT1BfTkVHQVRFAE9QX0VMU0UAc3RyYXQtPm5vZGVfdHlwZSA9PSBTdHJhdDo6VHlwZTo6Q0FDSEUAT1BfSU5WQUxJRE9QQ09ERQBPUF9NT0QAT1BfQU5EAE9QX0JPT0xBTkQAT1BfUkVTRVJWRUQAT1BfQUREAE9QXzFBREQAQwBLVkIAT1BfU1VCAE9QXzFTVUIAPC9zcGFuPgAgV1U8L2xpPjwvdWw+ACBieXRlcyBzY3JpcHQ8dWw+PGxpPgA8L2xpPjwvdWw+PC9saT48bGk+ADx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBkaXNjOyI+PGxpPmFuZG9yIFthbmRdPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IGRpc2M7Ij48bGk+ADwvbGk+ADxIPgApPgA8dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogZGlzYzsiPgA8ADoAT1BfTk9QOQBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OQBPUF9OT1A4AEMuVVRGLTgAT1BfTk9QNwBPUF9OT1A2AGhhc2gyNTYAc2hhMjU2AE9QX0hBU0gyNTYAT1BfU0hBMjU2ADE2AE9QX05PUDUAMTUAT1BfTk9QNABPUF9QVVNIREFUQTQAMTQAMTMAbl9zdWJzID09IDMAT1BfUkVTRVJWRUQyAE9QX1BVU0hEQVRBMgBkYXRhX3NpemUgPT0gMzIAMTIAbl9zdWJzID09IDIAT1BfTk9QMQBPUF9SRVNFUlZFRDEAT1BfUFVTSERBVEExAE9QX1NIQTEAMTEALTEAbl9rZXlzID09IDEAbnVtX3R5cGVzID09IDEAbl9zdWJzID09IDEAcmVzdWx0cy5zaXplKCkgPT0gMQBjb25zdHJ1Y3RlZC5zaXplKCkgPT0gMQByZXNfVy5zaXplKCkgPT0gMQByZXNfQi5zaXplKCkgPT0gMQBoYXNoMTYwAHJpcGVtZDE2MABPUF9IQVNIMTYwAE9QX1JJUEVNRDE2MABkYXRhX3NpemUgPT0gMjAAbl9rZXlzID49IDEgJiYgbl9rZXlzIDw9IDIwAE9QX05PUDEwAHN0cmF0LT5zdWIuc2l6ZSgpID4gMABuX2tleXMgPT0gMABuX3N1YnMgPT0gMABsID09IDAAayA9PSAwAGRhdGFfc2l6ZSA9PSAwAC4ALAAhKGUgPDwgIm4iX21zdCkgfHwgIShlIDw8ICJ6Il9tc3QpACEoZSA8PCAiViJfbXN0KSB8fCAhKGUgPDwgInUiX21zdCkAIShlIDw8ICJLIl9tc3QpIHx8IChlIDw8ICJ1Il9tc3QpACEoZSA8PCAiSyJfbXN0KSB8fCAoZSA8PCAicyJfbXN0KQAhKGUgPDwgInoiX21zdCkgfHwgIShlIDw8ICJvIl9tc3QpACEoZSA8PCAieiJfbXN0KSB8fCAoZSA8PCAibSJfbXN0KQAhKGUgPDwgImUiX21zdCkgfHwgIShlIDw8ICJmIl9tc3QpACEoZSA8PCAiZCJfbXN0KSB8fCAhKGUgPDwgImYiX21zdCkAIShlIDw8ICJWIl9tc3QpIHx8IChlIDw8ICJmIl9tc3QpACEoZSA8PCAiViJfbXN0KSB8fCAhKGUgPDwgImUiX21zdCkAIShlIDw8ICJWIl9tc3QpIHx8ICEoZSA8PCAiZCJfbXN0KQAhKGUgPDwgImUiX21zdCkgfHwgKGUgPDwgImQiX21zdCkAIShlIDw8ICJuIl9tc3QpIHx8ICEoZSA8PCAiVyJfbXN0KQAobnVsbCkAaGFzaDI1NihIKQBzaGEyNTYoSCkAaGFzaDE2MChIKQByaXBlbWQxNjAoSCkAaGFzaDE2MCg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5KQByaXBlbWQxNjAoOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSkAaGFzaDI1Nig4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4KQBzaGEyNTYoODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OCkAb3BlcmF0b3IoKQBrIDw9IHNhdHMuc2l6ZSgpAHJlc3VsdHMuc2l6ZSgpID49IG5vZGUuc3Vicy5zaXplKCkAcy5zaXplKCkgPT0gZmlsdGVyW2pdLnNpemUoKQAgLiw7LV8vOj9AKCkAaGFzaDI1NigpAGhhc2gxNjAoKQByaXBlbWQxNjAoKQBhbmRfdigAYW5kb3IoAGFmdGVyKABvbGRlcigAYW5kX24oAHBrKABwa19rKABtdWx0aSgAb3JfaSgAdGhyZXNoKABwa2goAHBrX2goAG9yX2QoAG9yX2MoAG9yX2IoAGFuZF9iKABoYXNoMjU2KABzaGEyNTYoAGhhc2gxNjAoAHJpcGVtZDE2MCgAPEhBU0gxNjAoACEqJygpOzpAJj0rJCwvPyNbXS1fLn4lACBvZiAAIFdVPC9saT48bGk+SW5wdXQ6IAA8dWw+PGxpPlNjcmlwdDogACYjMTM7bWF4IG9wczogAFtleGNlcHRpb246IAAmIzEzO3NjcmlwdGxlbjogACBXVTwvbGk+PGxpPlRvdGFsOiAAJiMxMzttYXggc3RhY2sgc2l6ZTogAFNpemU6IAA8c3BhbiB0aXRsZT0idHlwZTogACAg");l(e,5584,"////////////////////////////////////////////////////////////////AAECAwQFBgcICf////////8KCwwNDg///////////////////////////////////woLDA0OD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4QAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADEDwAAgw8AAFcPAADcDwAAtw0AAFQQAACtDwAAdA8AAGUPAABNDwAAQg8AABMPAAALDwAA+w4AALIQAADZDwAAoA8AAGcPAABkDwAATA8AAEEPAADFCwAAfAsAAB8NAAAlDQAAOg0AAC4NAABeDQAAQw0AADUKAADvCwAA0gwAAOAMAAC8CwAArAsAAKQLAACLCwAA/woAANsLAACbCwAA8AwAALQLAACUCwAAzAsAAIMLAADKDAAAWQwAAPgKAADTCwAAwgwAADMLAABKCwAAKwsAAA4LAABMDQAA7goAAKUNAABUCwAAWgsAAGgMAAA/CgAAtw8AAHYPAADKDQAA3w0AADYMAADmCgAAVA0AADoLAAAHCwAAgAwAAMMNAADYDQAALwwAAN8KAACeDQAAIQsAABcLAACsDQAAcgsAALYMAABOCgAAcQwAAA4MAAAaDAAAjQwAAKAMAAD5CwAA0goAAAAMAABzEAAA0Q8AADcPAABoEAAALA8AAGELAAD+DAAAYAoAAAoNAAByCgAArw8AAIkKAACgCgAATw8AAEQPAAAVDwAADQ8AAP0OAAC2DgAArBAAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAOQLAADkCwAA5AsAAI0NAAAEXwAABF8AAARfAAAEXwAABF8AAARfAAAEXwAABF8AAARfAAAEXwAAFF8AACRfAAA0XwAARF8AAFRfAABkXwAAdF8AAIRfAACUXwAApF8AAMRfAAC0XwAA1F8AAORfAAAEXwAABF8=");l(e,6976,"MDEyMzQ1Njc4OWFiY2RlZgAAAAAAAAAAJAEAACUBAAAmAQAAJwEAACgBAAAAAAAAGQAKABkZGQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAAZABEKGRkZAwoHAAEACQsYAAAJBgsAAAsABhkAAAAZGRk=");l(e,7105,"DgAAAAAAAAAAGQAKDRkZGQANAAACAAkOAAAACQAOAAAO");l(e,7163,"DA==");l(e,7175,"EwAAAAATAAAAAAkMAAAAAAAMAAAM");l(e,7221,"EA==");l(e,7233,"DwAAAAQPAAAAAAkQAAAAAAAQAAAQ");l(e,7279,"Eg==");l(e,7291,"EQAAAAARAAAAAAkSAAAAAAASAAASAAAaAAAAGhoa");l(e,7346,"GgAAABoaGgAAAAAAAAk=");l(e,7395,"FA==");l(e,7407,"FwAAAAAXAAAAAAkUAAAAAAAUAAAU");l(e,7453,"Fg==");l(e,7465,"FQAAAAAVAAAAAAkWAAAAAAAWAAAWAAAwMTIzNDU2Nzg5QUJDREVGAAAAAAIAAAADAAAABQAAAAcAAAALAAAADQAAABEAAAATAAAAFwAAAB0AAAAfAAAAJQAAACkAAAArAAAALwAAADUAAAA7AAAAPQAAAEMAAABHAAAASQAAAE8AAABTAAAAWQAAAGEAAABlAAAAZwAAAGsAAABtAAAAcQAAAH8AAACDAAAAiQAAAIsAAACVAAAAlwAAAJ0AAACjAAAApwAAAK0AAACzAAAAtQAAAL8AAADBAAAAxQAAAMcAAADTAAAAAQAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAeQAAAH8AAACDAAAAiQAAAIsAAACPAAAAlQAAAJcAAACdAAAAowAAAKcAAACpAAAArQAAALMAAAC1AAAAuwAAAL8AAADBAAAAxQAAAMcAAADRAAAAAAAAALwfAAApAQAAKgEAACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQBAAA1AQAANgEAAAAAAABQIAAANwEAADgBAAArAQAALAEAADkBAAA6AQAALwEAADABAAAxAQAAOwEAADMBAAA8AQAANQEAAD0BAABOU3QzX18yOWJhc2ljX2lvc0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAACRZAABQHwAAXCEAAE5TdDNfXzIxNWJhc2ljX3N0cmVhbWJ1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAAADkWAAAiB8AAE5TdDNfXzIxM2Jhc2ljX29zdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAABXAADEHwAAAAAAAAEAAAB8HwAAA/T//05TdDNfXzIxNWJhc2ljX3N0cmluZ2J1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAAAAJFkAAAwgAAC8HwAAOAAAAAAAAAD0IAAAPgEAAD8BAADI////yP////QgAABAAQAAQQEAADgAAAAAAAAA9B8AAEIBAABDAQAAyP///8j////0HwAARAEAAEUBAABOU3QzX18yMTliYXNpY19vc3RyaW5nc3RyZWFtSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUAAAAkWQAArCAAAPQfAAAAAAAArCEAAEYBAABHAQAASAEAAEkBAABKAQAASwEAAEwBAAAAAAAAgCEAALEAAABNAQAATgEAAAAAAABcIQAATwEAAFABAABOU3QzX18yOGlvc19iYXNlRQAAAORYAABIIQAATlN0M19fMjhpb3NfYmFzZTdmYWlsdXJlRQAAACRZAABkIQAAlFUAAE5TdDNfXzIxOV9faW9zdHJlYW1fY2F0ZWdvcnlFAAAAJFkAAIwhAADkVQ==");l(e,8640,"/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAADRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAAN4SBJUAAAAA////////////////");l(e,9024,"TENfQ1RZUEUAAAAATENfTlVNRVJJQwAATENfVElNRQAAAAAATENfQ09MTEFURQAATENfTU9ORVRBUlkATENfTUVTU0FHRVMAICMAABQAAABDLlVURi04");l(e,9652,"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAGEAAABiAAAAYwAAAGQAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB0AAAAdQAAAHYAAAB3AAAAeAAAAHkAAAB6AAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfw==");l(e,11188,"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAAVQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAAB7AAAAfAAAAH0AAAB+AAAAfw==");l(e,12208,"AgAAwAMAAMAEAADABQAAwAYAAMAHAADACAAAwAkAAMAKAADACwAAwAwAAMANAADADgAAwA8AAMAQAADAEQAAwBIAAMATAADAFAAAwBUAAMAWAADAFwAAwBgAAMAZAADAGgAAwBsAAMAcAADAHQAAwB4AAMAfAADAAAAAswEAAMMCAADDAwAAwwQAAMMFAADDBgAAwwcAAMMIAADDCQAAwwoAAMMLAADDDAAAww0AANMOAADDDwAAwwAADLsBAAzDAgAMwwMADMMEAAzbAAAAADAxMjM0NTY3ODlhYmNkZWZBQkNERUZ4WCstcFBpSW5OACVJOiVNOiVTICVwJUg6JU0=");l(e,12480,"JQAAAG0AAAAvAAAAJQAAAGQAAAAvAAAAJQAAAHkAAAAlAAAAWQAAAC0AAAAlAAAAbQAAAC0AAAAlAAAAZAAAACUAAABJAAAAOgAAACUAAABNAAAAOgAAACUAAABTAAAAIAAAACUAAABwAAAAAAAAACUAAABIAAAAOgAAACUAAABN");l(e,12624,"JQAAAEgAAAA6AAAAJQAAAE0AAAA6AAAAJQAAAFMAAAAAAAAAxDoAAFEBAABSAQAAUwEAAAAAAAAkOwAAVAEAAFUBAABTAQAAVgEAAFcBAABYAQAAWQEAAFoBAABbAQAAXAEAAF0B");l(e,12736,"BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABQIAAAUAAAAFAAAABQAAAAUAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAADAgAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAACCAAAAQgEAAEIBAABCAQAAQgEAAEIBAABCAQAAQgEAAEIBAABCAQAAQgEAAIIAAACCAAAAggAAAIIAAACCAAAAggAAAIIAAAAqAQAAKgEAACoBAAAqAQAAKgEAACoBAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAACoAAAAqAAAAKgAAAIIAAACCAAAAggAAAIIAAACCAAAAggAAADIBAAAyAQAAMgEAADIBAAAyAQAAMgEAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAggAAAIIAAACCAAAAggAAAAQ=");l(e,13764,"jDoAAF4BAABfAQAAUwEAAGABAABhAQAAYgEAAGMBAABkAQAAZQEAAGYBAAAAAAAAXDsAAGcBAABoAQAAUwEAAGkBAABqAQAAawEAAGwBAABtAQAAAAAAAIA7AABuAQAAbwEAAFMBAABwAQAAcQEAAHIBAABzAQAAdAEAAHQAAAByAAAAdQAAAGUAAAAAAAAAZgAAAGEAAABsAAAAcwAAAGUAAAAAAAAAJQAAAG0AAAAvAAAAJQAAAGQAAAAvAAAAJQAAAHkAAAAAAAAAJQAAAEgAAAA6AAAAJQAAAE0AAAA6AAAAJQAAAFMAAAAAAAAAJQAAAGEAAAAgAAAAJQAAAGIAAAAgAAAAJQAAAGQAAAAgAAAAJQAAAEgAAAA6AAAAJQAAAE0AAAA6AAAAJQAAAFMAAAAgAAAAJQAAAFkAAAAAAAAAJQAAAEkAAAA6AAAAJQAAAE0AAAA6AAAAJQAAAFMAAAAgAAAAJQAAAHA=");l(e,14140,"ZDcAAHUBAAB2AQAAUwEAAE5TdDNfXzI2bG9jYWxlNWZhY2V0RQAAACRZAABMNwAA3FUAAAAAAADkNwAAdQEAAHcBAABTAQAAeAEAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACAAQAAgQEAAIIBAACDAQAATlN0M19fMjVjdHlwZUl3RUUATlN0M19fMjEwY3R5cGVfYmFzZUUAAORYAADGNwAAAFcAALQ3AAAAAAAAAgAAAGQ3AAACAAAA3DcAAAIAAAAAAAAAeDgAAHUBAACEAQAAUwEAAIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAABOU3QzX18yN2NvZGVjdnRJY2MxMV9fbWJzdGF0ZV90RUUATlN0M19fMjEyY29kZWN2dF9iYXNlRQAAAADkWAAAVjgAAABXAAA0OAAAAAAAAAIAAABkNwAAAgAAAHA4AAACAAAAAAAAAOw4AAB1AQAAjAEAAFMBAACNAQAAjgEAAI8BAACQAQAAkQEAAJIBAACTAQAATlN0M19fMjdjb2RlY3Z0SURzYzExX19tYnN0YXRlX3RFRQAAAFcAAMg4AAAAAAAAAgAAAGQ3AAACAAAAcDgAAAIAAAAAAAAAYDkAAHUBAACUAQAAUwEAAJUBAACWAQAAlwEAAJgBAACZAQAAmgEAAJsBAABOU3QzX18yN2NvZGVjdnRJRHNEdTExX19tYnN0YXRlX3RFRQAAVwAAPDkAAAAAAAACAAAAZDcAAAIAAABwOAAAAgAAAAAAAADUOQAAdQEAAJwBAABTAQAAnQEAAJ4BAACfAQAAoAEAAKEBAACiAQAAowEAAE5TdDNfXzI3Y29kZWN2dElEaWMxMV9fbWJzdGF0ZV90RUUAAABXAACwOQAAAAAAAAIAAABkNwAAAgAAAHA4AAACAAAAAAAAAEg6AAB1AQAApAEAAFMBAAClAQAApgEAAKcBAACoAQAAqQEAAKoBAACrAQAATlN0M19fMjdjb2RlY3Z0SURpRHUxMV9fbWJzdGF0ZV90RUUAAFcAACQ6AAAAAAAAAgAAAGQ3AAACAAAAcDgAAAIAAABOU3QzX18yN2NvZGVjdnRJd2MxMV9fbWJzdGF0ZV90RUUAAAAAVwAAaDoAAAAAAAACAAAAZDcAAAIAAABwOAAAAgAAAE5TdDNfXzI2bG9jYWxlNV9faW1wRQAAACRZAACsOgAAZDcAAE5TdDNfXzI3Y29sbGF0ZUljRUUAJFkAANA6AABkNwAATlN0M19fMjdjb2xsYXRlSXdFRQAkWQAA8DoAAGQ3AABOU3QzX18yNWN0eXBlSWNFRQAAAABXAAAQOwAAAAAAAAIAAABkNwAAAgAAANw3AAACAAAATlN0M19fMjhudW1wdW5jdEljRUUAAAAAJFkAAEQ7AABkNwAATlN0M19fMjhudW1wdW5jdEl3RUUAAAAAJFkAAGg7AABkNwAAAAAAAOQ6AACsAQAArQEAAFMBAACuAQAArwEAALABAAAAAAAABDsAALEBAACyAQAAUwEAALMBAAC0AQAAtQEAAAAAAACgPAAAdQEAALYBAABTAQAAtwEAALgBAAC5AQAAugEAALsBAAC8AQAAvQEAAL4BAAC/AQAAwAEAAMEBAABOU3QzX18yN251bV9nZXRJY05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzI5X19udW1fZ2V0SWNFRQBOU3QzX18yMTRfX251bV9nZXRfYmFzZUUAAORYAABmPAAAAFcAAFA8AAAAAAAAAQAAAIA8AAAAAAAAAFcAAAw8AAAAAAAAAgAAAGQ3AAACAAAAiDw=");l(e,15556,"dD0AAHUBAADCAQAAUwEAAMMBAADEAQAAxQEAAMYBAADHAQAAyAEAAMkBAADKAQAAywEAAMwBAADNAQAATlN0M19fMjdudW1fZ2V0SXdOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yOV9fbnVtX2dldEl3RUUAAAAAVwAARD0AAAAAAAABAAAAgDwAAAAAAAAAVwAAAD0AAAAAAAACAAAAZDcAAAIAAABcPQ==");l(e,15768,"XD4AAHUBAADOAQAAUwEAAM8BAADQAQAA0QEAANIBAADTAQAA1AEAANUBAADWAQAATlN0M19fMjdudW1fcHV0SWNOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yOV9fbnVtX3B1dEljRUUATlN0M19fMjE0X19udW1fcHV0X2Jhc2VFAADkWAAAIj4AAABXAAAMPgAAAAAAAAEAAAA8PgAAAAAAAABXAADIPQAAAAAAAAIAAABkNwAAAgAAAEQ+");l(e,16e3,"JD8AAHUBAADXAQAAUwEAANgBAADZAQAA2gEAANsBAADcAQAA3QEAAN4BAADfAQAATlN0M19fMjdudW1fcHV0SXdOU18xOW9zdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yOV9fbnVtX3B1dEl3RUUAAAAAVwAA9D4AAAAAAAABAAAAPD4AAAAAAAAAVwAAsD4AAAAAAAACAAAAZDcAAAIAAAAMPw==");l(e,16200,"JEAAAOABAADhAQAAUwEAAOIBAADjAQAA5AEAAOUBAADmAQAA5wEAAOgBAAD4////JEAAAOkBAADqAQAA6wEAAOwBAADtAQAA7gEAAO8BAABOU3QzX18yOHRpbWVfZ2V0SWNOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJY05TXzExY2hhcl90cmFpdHNJY0VFRUVFRQBOU3QzX18yOXRpbWVfYmFzZUUA5FgAAN0/AABOU3QzX18yMjBfX3RpbWVfZ2V0X2Nfc3RvcmFnZUljRUUAAADkWAAA+D8AAABXAACYPwAAAAAAAAMAAABkNwAAAgAAAPA/AAACAAAAHEAAAAAIAAAAAAAAEEEAAPABAADxAQAAUwEAAPIBAADzAQAA9AEAAPUBAAD2AQAA9wEAAPgBAAD4////EEEAAPkBAAD6AQAA+wEAAPwBAAD9AQAA/gEAAP8BAABOU3QzX18yOHRpbWVfZ2V0SXdOU18xOWlzdHJlYW1idWZfaXRlcmF0b3JJd05TXzExY2hhcl90cmFpdHNJd0VFRUVFRQBOU3QzX18yMjBfX3RpbWVfZ2V0X2Nfc3RvcmFnZUl3RUUAAORYAADlQAAAAFcAAKBAAAAAAAAAAwAAAGQ3AAACAAAA8D8AAAIAAAAIQQAAAAgAAAAAAAC0QQAAAAIAAAECAABTAQAAAgIAAE5TdDNfXzI4dGltZV9wdXRJY05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIxMF9fdGltZV9wdXRFAAAA5FgAAJVBAAAAVwAAUEEAAAAAAAACAAAAZDcAAAIAAACsQQAAAAgAAAAAAAA0QgAAAwIAAAQCAABTAQAABQIAAE5TdDNfXzI4dGltZV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAAAAAABXAADsQQAAAAAAAAIAAABkNwAAAgAAAKxBAAAACAAAAAAAAMhCAAB1AQAABgIAAFMBAAAHAgAACAIAAAkCAAAKAgAACwIAAAwCAAANAgAADgIAAA8CAABOU3QzX18yMTBtb25leXB1bmN0SWNMYjBFRUUATlN0M19fMjEwbW9uZXlfYmFzZUUAAAAA5FgAAKhCAAAAVwAAjEIAAAAAAAACAAAAZDcAAAIAAADAQgAAAgAAAAAAAAA8QwAAdQEAABACAABTAQAAEQIAABICAAATAgAAFAIAABUCAAAWAgAAFwIAABgCAAAZAgAATlN0M19fMjEwbW9uZXlwdW5jdEljTGIxRUVFAABXAAAgQwAAAAAAAAIAAABkNwAAAgAAAMBCAAACAAAAAAAAALBDAAB1AQAAGgIAAFMBAAAbAgAAHAIAAB0CAAAeAgAAHwIAACACAAAhAgAAIgIAACMCAABOU3QzX18yMTBtb25leXB1bmN0SXdMYjBFRUUAAFcAAJRDAAAAAAAAAgAAAGQ3AAACAAAAwEIAAAIAAAAAAAAAJEQAAHUBAAAkAgAAUwEAACUCAAAmAgAAJwIAACgCAAApAgAAKgIAACsCAAAsAgAALQIAAE5TdDNfXzIxMG1vbmV5cHVuY3RJd0xiMUVFRQAAVwAACEQAAAAAAAACAAAAZDcAAAIAAADAQgAAAgAAAAAAAADIRAAAdQEAAC4CAABTAQAALwIAADACAABOU3QzX18yOW1vbmV5X2dldEljTlNfMTlpc3RyZWFtYnVmX2l0ZXJhdG9ySWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFRUUATlN0M19fMjExX19tb25leV9nZXRJY0VFAADkWAAApkQAAABXAABgRAAAAAAAAAIAAABkNwAAAgAAAMBE");l(e,17644,"bEUAAHUBAAAxAgAAUwEAADICAAAzAgAATlN0M19fMjltb25leV9nZXRJd05TXzE5aXN0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfZ2V0SXdFRQAA5FgAAEpFAAAAVwAABEUAAAAAAAACAAAAZDcAAAIAAABkRQ==");l(e,17808,"EEYAAHUBAAA0AgAAUwEAADUCAAA2AgAATlN0M19fMjltb25leV9wdXRJY05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfcHV0SWNFRQAA5FgAAO5FAAAAVwAAqEUAAAAAAAACAAAAZDcAAAIAAAAIRg==");l(e,17972,"tEYAAHUBAAA3AgAAUwEAADgCAAA5AgAATlN0M19fMjltb25leV9wdXRJd05TXzE5b3N0cmVhbWJ1Zl9pdGVyYXRvckl3TlNfMTFjaGFyX3RyYWl0c0l3RUVFRUVFAE5TdDNfXzIxMV9fbW9uZXlfcHV0SXdFRQAA5FgAAJJGAAAAVwAATEYAAAAAAAACAAAAZDcAAAIAAACsRg==");l(e,18136,"LEcAAHUBAAA6AgAAUwEAADsCAAA8AgAAPQIAAE5TdDNfXzI4bWVzc2FnZXNJY0VFAE5TdDNfXzIxM21lc3NhZ2VzX2Jhc2VFAAAAAORYAAAJRwAAAFcAAPRGAAAAAAAAAgAAAGQ3AAACAAAAJEcAAAIAAAAAAAAAhEcAAHUBAAA+AgAAUwEAAD8CAABAAgAAQQIAAE5TdDNfXzI4bWVzc2FnZXNJd0VFAAAAAABXAABsRwAAAAAAAAIAAABkNwAAAgAAACRHAAACAAAAUwAAAHUAAABuAAAAZAAAAGEAAAB5AAAAAAAAAE0AAABvAAAAbgAAAGQAAABhAAAAeQAAAAAAAABUAAAAdQAAAGUAAABzAAAAZAAAAGEAAAB5AAAAAAAAAFcAAABlAAAAZAAAAG4AAABlAAAAcwAAAGQAAABhAAAAeQAAAAAAAABUAAAAaAAAAHUAAAByAAAAcwAAAGQAAABhAAAAeQAAAAAAAABGAAAAcgAAAGkAAABkAAAAYQAAAHkAAAAAAAAAUwAAAGEAAAB0AAAAdQAAAHIAAABkAAAAYQAAAHkAAAAAAAAAUwAAAHUAAABuAAAAAAAAAE0AAABvAAAAbgAAAAAAAABUAAAAdQAAAGUAAAAAAAAAVwAAAGUAAABkAAAAAAAAAFQAAABoAAAAdQAAAAAAAABGAAAAcgAAAGkAAAAAAAAAUwAAAGEAAAB0AAAAAAAAAEoAAABhAAAAbgAAAHUAAABhAAAAcgAAAHkAAAAAAAAARgAAAGUAAABiAAAAcgAAAHUAAABhAAAAcgAAAHkAAAAAAAAATQAAAGEAAAByAAAAYwAAAGgAAAAAAAAAQQAAAHAAAAByAAAAaQAAAGwAAAAAAAAATQAAAGEAAAB5AAAAAAAAAEoAAAB1AAAAbgAAAGUAAAAAAAAASgAAAHUAAABsAAAAeQAAAAAAAABBAAAAdQAAAGcAAAB1AAAAcwAAAHQAAAAAAAAAUwAAAGUAAABwAAAAdAAAAGUAAABtAAAAYgAAAGUAAAByAAAAAAAAAE8AAABjAAAAdAAAAG8AAABiAAAAZQAAAHIAAAAAAAAATgAAAG8AAAB2AAAAZQAAAG0AAABiAAAAZQAAAHIAAAAAAAAARAAAAGUAAABjAAAAZQAAAG0AAABiAAAAZQAAAHIAAAAAAAAASgAAAGEAAABuAAAAAAAAAEYAAABlAAAAYgAAAAAAAABNAAAAYQAAAHIAAAAAAAAAQQAAAHAAAAByAAAAAAAAAEoAAAB1AAAAbgAAAAAAAABKAAAAdQAAAGwAAAAAAAAAQQAAAHUAAABnAAAAAAAAAFMAAABlAAAAcAAAAAAAAABPAAAAYwAAAHQAAAAAAAAATgAAAG8AAAB2AAAAAAAAAEQAAABlAAAAYwAAAAAAAABBAAAATQAAAAAAAABQAAAATQ==");l(e,19228,"HEAAAOkBAADqAQAA6wEAAOwBAADtAQAA7gEAAO8BAAAAAAAACEEAAPkBAAD6AQAA+wEAAPwBAAD9AQAA/gEAAP8BAABOU3QzX18yMTRfX3NoYXJlZF9jb3VudEU=");l(e,19348,"iCM=");l(e,19372,"Tm8gZXJyb3IgaW5mb3JtYXRpb24ASWxsZWdhbCBieXRlIHNlcXVlbmNlAERvbWFpbiBlcnJvcgBSZXN1bHQgbm90IHJlcHJlc2VudGFibGUATm90IGEgdHR5AFBlcm1pc3Npb24gZGVuaWVkAE9wZXJhdGlvbiBub3QgcGVybWl0dGVkAE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkATm8gc3VjaCBwcm9jZXNzAEZpbGUgZXhpc3RzAFZhbHVlIHRvbyBsYXJnZSBmb3IgZGF0YSB0eXBlAE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlAE91dCBvZiBtZW1vcnkAUmVzb3VyY2UgYnVzeQBJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbABSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQBJbnZhbGlkIHNlZWsAQ3Jvc3MtZGV2aWNlIGxpbmsAUmVhZC1vbmx5IGZpbGUgc3lzdGVtAERpcmVjdG9yeSBub3QgZW1wdHkAQ29ubmVjdGlvbiByZXNldCBieSBwZWVyAE9wZXJhdGlvbiB0aW1lZCBvdXQAQ29ubmVjdGlvbiByZWZ1c2VkAEhvc3QgaXMgZG93bgBIb3N0IGlzIHVucmVhY2hhYmxlAEFkZHJlc3MgaW4gdXNlAEJyb2tlbiBwaXBlAEkvTyBlcnJvcgBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzAEJsb2NrIGRldmljZSByZXF1aXJlZABObyBzdWNoIGRldmljZQBOb3QgYSBkaXJlY3RvcnkASXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATXVsdGlob3AgYXR0ZW1wdGVkAFJlcXVpcmVkIGtleSBub3QgYXZhaWxhYmxlAEtleSBoYXMgZXhwaXJlZABLZXkgaGFzIGJlZW4gcmV2b2tlZABLZXkgd2FzIHJlamVjdGVkIGJ5IHNlcnZpY2U=");l(e,21298,"pQJbAPABtQWMBSUBgwYdA5QE/wDHAzEDCwa8AY8BfwPKBCsA2gavAEIDTgPcAQ4EFQChBg0BlAILAjgGZAK8Av8CXQPnBAsHzwLLBe8F2wXhAh4GRQKFAIICbANvBPEA8wMYBdkA2gNMBlQCewGdA70EAABRABUCuwCzA20A/wGFBC8F+QQ4AGUBRgGfALcGqAFzAlMB");l(e,21496,"IQQAAAAAAAAAAC8C");l(e,21528,"NQRHBFYE");l(e,21550,"oAQ=");l(e,21570,"RgVgBW4FYQYAAM8BAAAAAAAAAADJBukG+QYeBzkHSQdeBw==");l(e,21620,"CgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUAypo7AAAAAAAAAAAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OQAAAACUVQAAQgIAAEMCAABOAQAATlN0M19fMjEyc3lzdGVtX2Vycm9yRQAAJFkAAHxVAACIWAAATlN0M19fMjE0ZXJyb3JfY2F0ZWdvcnlFAAAAAORYAACgVQAATlN0M19fMjEyX19kb19tZXNzYWdlRQAA5FgAAGBLAAAkWQAAxFUAALxVAAAAAAAA3FUAAEQCAABFAgAARgIAAE4xMF9fY3h4YWJpdjExNl9fc2hpbV90eXBlX2luZm9FAAAAACRZAAAEVgAAFFkAAE4xMF9fY3h4YWJpdjExN19fY2xhc3NfdHlwZV9pbmZvRQAAACRZAAA0VgAAKFYAAE4xMF9fY3h4YWJpdjExN19fcGJhc2VfdHlwZV9pbmZvRQAAACRZAABkVgAAKFYAAE4xMF9fY3h4YWJpdjExOV9fcG9pbnRlcl90eXBlX2luZm9FACRZAACUVgAAiFYAAE4xMF9fY3h4YWJpdjEyMF9fc2lfY2xhc3NfdHlwZV9pbmZvRQAAAAAkWQAAxFYAAFhWAAAAAAAASFcAAEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4CAABPAgAATjEwX19jeHhhYml2MTIxX192bWlfY2xhc3NfdHlwZV9pbmZvRQAAACRZAAAgVwAAWFYAAAAAAACwVwAABQAAAFACAABRAgAAAAAAALxXAAAFAAAAUgIAAFMCAABTdDlleGNlcHRpb24AU3QyMGJhZF9hcnJheV9uZXdfbGVuZ3RoAFN0OWJhZF9hbGxvYwAAJFkAAKJXAABQWQAAJFkAAIlXAACwVwAAAAAAAABYAAAHAAAAVAIAAFUCAAAAAAAAiFgAAFwAAABWAgAATgEAAFN0MTFsb2dpY19lcnJvcgAkWQAA8FcAAFBZAAAAAAAANFgAAAcAAABXAgAAVQIAAFN0MTJsZW5ndGhfZXJyb3IAAAAAJFkAACBYAAAAWAAAAAAAAGhYAAAHAAAAWAIAAFUCAABTdDEyb3V0X29mX3JhbmdlAAAAACRZAABUWAAAAFgAAFN0MTNydW50aW1lX2Vycm9yAAAAJFkAAHRYAABQWQAAAAAAALxYAABcAAAAWQIAAE4BAABTdDE0b3ZlcmZsb3dfZXJyb3IAACRZAACoWAAAiFgAAAAAAABYWQAArQAAAFoCAABbAgAAAAAAAFhWAABIAgAAXAIAAEoCAABLAgAATAIAAF0CAABeAgAAXwIAAFN0OXR5cGVfaW5mbwAAAADkWAAABFkAAAAAAADsVgAASAIAAGACAABKAgAASwIAAEwCAABhAgAAYgIAAGMCAABTdDhiYWRfY2FzdADkWAAAfFcAACRZAABEWQAAUFkAAAAAAABQWQAABQAAAGQCAABlAg==");l(e,22904,"0GoBAAghAABHAg==");}var r=new ArrayBuffer(16);var s=new Int32Array(r);var t=new Float32Array(r);var u=new Float64Array(r);function v(w){return s[w]}function x(w,y){s[w]=y;}function z(){return u[0]}function A(y){u[0]=y;}function B(){throw new Error("abort")}function C(){return t[2]}function D(y){t[2]=y;}function Za(q){var E=q.a;var F=E.a;var G=F.buffer;var H=new Int8Array(G);var I=new Int16Array(G);var J=new Int32Array(G);var K=new Uint8Array(G);var L=new Uint16Array(G);var M=new Uint32Array(G);var N=new Float32Array(G);var O=new Float64Array(G);var P=Math.imul;var Q=Math.fround;var R=Math.abs;var S=Math.clz32;var W=Math.ceil;var Z=E.b;var _=E.c;var $=E.d;var aa=E.e;var ba=E.f;var ca=E.g;var da=E.h;var ea=E.i;var fa=E.j;var ga=E.k;var ha=E.l;var ia=E.m;var ja=E.n;var ka=E.o;var la=E.p;var ma=E.q;var na=E.r;var oa=E.s;var pa=E.t;var qa=E.u;var ra=E.v;var sa=E.w;var ta=E.x;var ua=E.y;var va=E.z;var wa=E.A;var xa=E.B;var ya=E.C;var za=E.D;var Aa=E.E;var Ba=E.F;var Ca=E.G;var Da=E.H;var Ea=E.I;var Fa=E.J;var Ga=E.K;var Ha=E.L;var Ia=E.M;var Ja=E.N;var Ka=E.O;var La=E.P;var Ma=E.Q;var Na=E.R;var Oa=E.S;var Pa=E.T;var Qa=E.U;var Ra=E.V;var Sa=E.W;var Ta=E.X;var Ua=92880;var Va=0;var Wa=0; // EMSCRIPTEN_START_FUNCS function Vm(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=Ua-352|0;Ua=e;J[e+328>>2]=0;J[e+320>>2]=0;J[e+324>>2]=0;J[5996]=0;J[e+316>>2]=0;J[e+308>>2]=0;J[e+312>>2]=0;f=$(3,24)|0;d=J[5996];J[5996]=0;a:{b:{c:{if((d|0)!=1){J[f+8>>2]=-1;J[f+12>>2]=-1;J[f>>2]=0;J[f+16>>2]=-1;J[f+20>>2]=-1;c=f+24|0;J[e+328>>2]=c;J[e+320>>2]=f;m=e+296|0;d:{e:{f:{g:{h:{i:{j:{k:{l:{while(1){d=c-24|0;g=J[d+20>>2];J[m>>2]=J[d+16>>2];J[m+4>>2]=g;g=J[d+12>>2];J[e+288>>2]=J[d+8>>2];J[e+292>>2]=g;h=J[d+4>>2];g=J[d>>2];J[e+280>>2]=g;J[e+284>>2]=h;J[e+324>>2]=d;l=18;m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{switch(g|0){case 0:c=J[b+4>>2];A:{if((c|0)<2){f=-1;break A}g=J[b>>2];f=1;while(1){h=K[f+g|0];if((h|0)==58){l=0;B:{C:{D:{E:{while(1){F:{G:{switch(K[J[b>>2]+l|0]-97|0){case 0:d=J[e+324>>2];h=J[e+328>>2];if(d>>>0<h>>>0){J[d+8>>2]=-1;J[d+12>>2]=-1;J[d>>2]=3;J[d+16>>2]=-1;J[d+20>>2]=-1;J[e+324>>2]=d+24;break F}H:{I:{J:{g=J[e+320>>2];j=(d-g|0)/24|0;c=j+1|0;K:{if(c>>>0>=178956971){J[5996]=0;ca(142);a=J[5996];J[5996]=0;if((a|0)==1){break K}break a}h=(h-g|0)/24|0;i=h<<1;h=h>>>0>=89478485?178956970:c>>>0<i>>>0?i:c;if(!h){i=0;break I}if(h>>>0<178956971){break J}J[5996]=0;ca(35);a=J[5996];J[5996]=0;if((a|0)!=1){break a}}b=Z()|0;break b}J[5996]=0;i=$(3,P(h,24)|0)|0;c=J[5996];J[5996]=0;if((c|0)==1){break H}}c=P(j,24)+i|0;J[c+8>>2]=-1;J[c+12>>2]=-1;J[c>>2]=3;J[c+16>>2]=-1;J[c+20>>2]=-1;j=c+24|0;if((d|0)!=(g|0)){while(1){d=d-24|0;k=J[d+4>>2];c=c-24|0;J[c>>2]=J[d>>2];J[c+4>>2]=k;k=J[d+20>>2];J[c+16>>2]=J[d+16>>2];J[c+20>>2]=k;k=J[d+12>>2];J[c+8>>2]=J[d+8>>2];J[c+12>>2]=k;if((d|0)!=(g|0)){continue}break}d=g;}J[e+328>>2]=P(h,24)+i;J[e+324>>2]=j;J[e+320>>2]=c;if(!d){break F}$a(d);break F}b=Z()|0;break b;case 18:d=J[e+324>>2];h=J[e+328>>2];if(d>>>0<h>>>0){J[d+8>>2]=-1;J[d+12>>2]=-1;J[d>>2]=2;J[d+16>>2]=-1;J[d+20>>2]=-1;J[e+324>>2]=d+24;break F}L:{M:{N:{g=J[e+320>>2];j=(d-g|0)/24|0;c=j+1|0;O:{if(c>>>0>=178956971){J[5996]=0;ca(142);break O}h=(h-g|0)/24|0;i=h<<1;h=h>>>0>=89478485?178956970:c>>>0<i>>>0?i:c;if(!h){i=0;break M}if(h>>>0<178956971){break N}J[5996]=0;ca(35);}a=J[5996];J[5996]=0;if((a|0)!=1){break a}b=Z()|0;break b}J[5996]=0;i=$(3,P(h,24)|0)|0;c=J[5996];J[5996]=0;if((c|0)==1){break L}}c=P(j,24)+i|0;J[c+8>>2]=-1;J[c+12>>2]=-1;J[c>>2]=2;J[c+16>>2]=-1;J[c+20>>2]=-1;j=c+24|0;if((d|0)!=(g|0)){while(1){d=d-24|0;k=J[d+4>>2];c=c-24|0;J[c>>2]=J[d>>2];J[c+4>>2]=k;k=J[d+20>>2];J[c+16>>2]=J[d+16>>2];J[c+20>>2]=k;k=J[d+12>>2];J[c+8>>2]=J[d+8>>2];J[c+12>>2]=k;if((d|0)!=(g|0)){continue}break}d=g;}J[e+328>>2]=P(h,24)+i;J[e+324>>2]=j;J[e+320>>2]=c;if(!d){break F}$a(d);break F}b=Z()|0;break b;case 2:d=J[e+324>>2];h=J[e+328>>2];if(d>>>0<h>>>0){J[d+8>>2]=-1;J[d+12>>2]=-1;J[d>>2]=4;J[d+16>>2]=-1;J[d+20>>2]=-1;J[e+324>>2]=d+24;break F}P:{Q:{R:{g=J[e+320>>2];j=(d-g|0)/24|0;c=j+1|0;S:{if(c>>>0>=178956971){J[5996]=0;ca(142);break S}h=(h-g|0)/24|0;i=h<<1;h=h>>>0>=89478485?178956970:c>>>0<i>>>0?i:c;if(!h){i=0;break Q}if(h>>>0<178956971){break R}J[5996]=0;ca(35);}a=J[5996];J[5996]=0;if((a|0)!=1){break a}b=Z()|0;break b}J[5996]=0;i=$(3,P(h,24)|0)|0;c=J[5996];J[5996]=0;if((c|0)==1){break P}}c=P(j,24)+i|0;J[c+8>>2]=-1;J[c+12>>2]=-1;J[c>>2]=4;J[c+16>>2]=-1;J[c+20>>2]=-1;j=c+24|0;if((d|0)!=(g|0)){while(1){d=d-24|0;k=J[d+4>>2];c=c-24|0;J[c>>2]=J[d>>2];J[c+4>>2]=k;k=J[d+20>>2];J[c+16>>2]=J[d+16>>2];J[c+20>>2]=k;k=J[d+12>>2];J[c+8>>2]=J[d+8>>2];J[c+12>>2]=k;if((d|0)!=(g|0)){continue}break}d=g;}J[e+328>>2]=P(h,24)+i;J[e+324>>2]=j;J[e+320>>2]=c;if(!d){break F}$a(d);break F}b=Z()|0;break b;case 3:d=J[e+324>