From ebdb00f50da560e9e1a7fc141e8310d55a2ca0f6 Mon Sep 17 00:00:00 2001 From: Surma Date: Wed, 9 Sep 2020 12:50:02 +0100 Subject: [PATCH] Keep planarized reference image around across runs --- cli/index.js | 16 +++--- codecs/visdif/visdif.cpp | 85 +++++++++++++++++--------------- codecs/visdif/visdif.js | 101 ++++++++++++++++++++++---------------- codecs/visdif/visdif.wasm | Bin 43484 -> 44776 bytes 4 files changed, 113 insertions(+), 89 deletions(-) diff --git a/cli/index.js b/cli/index.js index 3e871232..7fa64ac5 100644 --- a/cli/index.js +++ b/cli/index.js @@ -24,10 +24,16 @@ async function optimize(bitmapIn, encode, decode) { let bitmapOut; let binaryOut; - const { visdif } = await visdifModule(); + const { VisDiff } = await visdifModule(); + const comparator = new VisDiff( + bitmapIn.data, + bitmapIn.width, + bitmapIn.height + ); do { binaryOut = await encode(bitmapIn, quality); bitmapOut = await decode(binaryOut); + butteraugliDistance = comparator.distance(bitmapOut.data); console.log({ butteraugliDistance, quality, @@ -35,12 +41,6 @@ async function optimize(bitmapIn, encode, decode) { binaryOut, bitmapOut }); - butteraugliDistance = visdif( - bitmapIn.data, - bitmapOut.data, - bitmapIn.width, - bitmapIn.height - ); if (butteraugliDistance > butteraugliGoal) { quality += inc; } else { @@ -53,6 +53,8 @@ async function optimize(bitmapIn, encode, decode) { attempts < maxRounds ); + comparator.delete(); + return { bitmap: bitmapOut, binary: binaryOut, diff --git a/codecs/visdif/visdif.cpp b/codecs/visdif/visdif.cpp index 7f2608a3..a13e5e31 100644 --- a/codecs/visdif/visdif.cpp +++ b/codecs/visdif/visdif.cpp @@ -5,50 +5,57 @@ using namespace emscripten; using namespace butteraugli; -double visdif(std::string rgba1, std::string rgba2, int width, int height) { - const char* rgba1p = rgba1.c_str(); - const char* rgba2p = rgba2.c_str(); - // One Image8 for each color channel + alpha - std::vector img1; - img1.push_back(ImageF(width, height)); - img1.push_back(ImageF(width, height)); - img1.push_back(ImageF(width, height)); - img1.push_back(ImageF(width, height)); - std::vector img2; - img2.push_back(ImageF(width, height)); - img2.push_back(ImageF(width, height)); - img2.push_back(ImageF(width, height)); - img2.push_back(ImageF(width, height)); - // Convert from interleaved RGBA to separate channels +// Turns an interleaved RGBA buffer into 4 planes for each color channel +void planarize(std::vector& img, + const char* rgba, + int width, + int height, + float gamma = 2.2) { + assert(img.size() == 0); + img.push_back(ImageF(width, height)); + img.push_back(ImageF(width, height)); + img.push_back(ImageF(width, height)); + img.push_back(ImageF(width, height)); for (int y = 0; y < height; y++) { - float* const img1_row_r = img1[0].Row(y); - float* const img1_row_g = img1[1].Row(y); - float* const img1_row_b = img1[2].Row(y); - float* const img1_row_a = img1[3].Row(y); - float* const img2_row_r = img2[0].Row(y); - float* const img2_row_g = img2[1].Row(y); - float* const img2_row_b = img2[2].Row(y); - float* const img2_row_a = img2[3].Row(y); + float* const row_r = img[0].Row(y); + float* const row_g = img[1].Row(y); + float* const row_b = img[2].Row(y); + float* const row_a = img[3].Row(y); for (int x = 0; x < width; x++) { - img1_row_r[x] = 255.0 * pow(rgba1p[y * width * 4 + x * 4 + 0] / 255.0, 2.2); - img1_row_g[x] = 255.0 * pow(rgba1p[y * width * 4 + x * 4 + 1] / 255.0, 2.2); - img1_row_b[x] = 255.0 * pow(rgba1p[y * width * 4 + x * 4 + 2] / 255.0, 2.2); - img1_row_a[x] = 255.0 * pow(rgba1p[y * width * 4 + x * 4 + 3] / 255.0, 2.2); - img2_row_r[x] = 255.0 * pow(rgba2p[y * width * 4 + x * 4 + 0] / 255.0, 2.2); - img2_row_g[x] = 255.0 * pow(rgba2p[y * width * 4 + x * 4 + 1] / 255.0, 2.2); - img2_row_b[x] = 255.0 * pow(rgba2p[y * width * 4 + x * 4 + 2] / 255.0, 2.2); - img2_row_a[x] = 255.0 * pow(rgba2p[y * width * 4 + x * 4 + 3] / 255.0, 2.2); + row_r[x] = 255.0 * pow(rgba[y * width * 4 + x * 4 + 0] / 255.0, gamma); + row_g[x] = 255.0 * pow(rgba[y * width * 4 + x * 4 + 1] / 255.0, gamma); + row_b[x] = 255.0 * pow(rgba[y * width * 4 + x * 4 + 2] / 255.0, gamma); + row_a[x] = 255.0 * pow(rgba[y * width * 4 + x * 4 + 3] / 255.0, gamma); } } - - ImageF diffmap; - double diffvalue; - if (!ButteraugliInterface(img1, img2, 1.0, diffmap, diffvalue)) { - return -1.0; - } - return diffvalue; } +class VisDiff { + private: + std::vector ref_img; + int width; + int height; + + public: + VisDiff(std::string ref_img, int width, int height) { + planarize(this->ref_img, ref_img.c_str(), width, height); + this->width = width; + this->height = height; + } + + double distance(std::string other_img) { + std::vector img; + planarize(img, other_img.c_str(), width, height); + + ImageF diffmap; + double diffvalue; + if (!ButteraugliInterface(ref_img, img, 1.0, diffmap, diffvalue)) { + return -1.0; + } + return diffvalue; + } +}; EMSCRIPTEN_BINDINGS(my_module) { - function("visdif", &visdif); + class_("VisDiff").constructor().function("distance", + &VisDiff::distance); } diff --git a/codecs/visdif/visdif.js b/codecs/visdif/visdif.js index 420802cd..20a2d881 100644 --- a/codecs/visdif/visdif.js +++ b/codecs/visdif/visdif.js @@ -7,49 +7,64 @@ function(visdif) { visdif = visdif || {}; -var d;d||(d=typeof visdif !== 'undefined' ? visdif : {});var aa,ba;d.ready=new Promise(function(a,b){aa=a;ba=b});var r={},t;for(t in d)d.hasOwnProperty(t)&&(r[t]=d[t]);var u=!1,v=!1,ca=!1,da=!1;u="object"===typeof window;v="function"===typeof importScripts;ca="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node;da=!u&&!ca&&!v;var w="",x,z,ea,fa; -if(ca)w=v?require("path").dirname(w)+"/":__dirname+"/",x=function(a,b){ea||(ea=require("fs"));fa||(fa=require("path"));a=fa.normalize(a);return ea.readFileSync(a,b?null:"utf8")},z=function(a){a=x(a,!0);a.buffer||(a=new Uint8Array(a));a.buffer||A("Assertion failed: undefined");return a},1=e);)++c;if(16f?e+=String.fromCharCode(f):(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else e+=String.fromCharCode(f)}return e} -function la(a,b,c){var e=G;if(0=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}if(127>=g){if(b>=c)break;e[b++]=g}else{if(2047>=g){if(b+1>=c)break;e[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;e[b++]=224|g>>12}else{if(b+3>=c)break;e[b++]=240|g>>18;e[b++]=128|g>>12&63}e[b++]=128|g>>6&63}e[b++]=128|g&63}}e[b]=0}}var ma="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; -function na(a,b){var c=a>>1;for(var e=c+b/2;!(c>=e)&&H[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return e;++c;e+=String.fromCharCode(f)}}function oa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;I[b>>1]=0;return b-e}function pa(a){return 2*a.length} -function qa(a,b){for(var c=0,e="";!(c>=b/4);){var f=K[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,e+=String.fromCharCode(55296|f>>10,56320|f&1023)):e+=String.fromCharCode(f)}return e}function ra(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=g){var l=a.charCodeAt(++f);g=65536+((g&1023)<<10)|l&1023}K[b>>2]=g;b+=4;if(b+4>c)break}K[b>>2]=0;return b-e} -function sa(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}var L,ta,G,I,H,K,M,ua,va;function wa(a){L=a;d.HEAP8=ta=new Int8Array(a);d.HEAP16=I=new Int16Array(a);d.HEAP32=K=new Int32Array(a);d.HEAPU8=G=new Uint8Array(a);d.HEAPU16=H=new Uint16Array(a);d.HEAPU32=M=new Uint32Array(a);d.HEAPF32=ua=new Float32Array(a);d.HEAPF64=va=new Float64Array(a)}var xa=d.INITIAL_MEMORY||16777216;d.wasmMemory?E=d.wasmMemory:E=new WebAssembly.Memory({initial:xa/65536,maximum:32768}); -E&&(L=E.buffer);xa=L.byteLength;wa(L);K[5740]=5266E3;function N(a){for(;0=b?"_"+a:a} -function Oa(a,b){a=Na(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function Pa(a){var b=Error,c=Oa(a,function(e){this.name=a;this.message=e;e=Error(e).stack;void 0!==e&&(this.stack=this.toString()+"\n"+e.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c} -var Sa=void 0;function W(a){throw new Sa(a);}var Ta=void 0;function Ua(a,b){function c(k){k=b(k);if(k.length!==e.length)throw new Ta("Mismatched type converter count");for(var h=0;h>2])}function Ya(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a} -function Za(a,b){switch(b){case 2:return function(c){return this.fromWireType(ua[c>>2])};case 3:return function(c){return this.fromWireType(va[c>>3])};default:throw new TypeError("Unknown float type: "+a);}}function $a(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Oa(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c} -function ab(a){for(;a.length;){var b=a.pop();a.pop()(b)}}function bb(a,b){var c=d;if(void 0===c[a].F){var e=c[a];c[a]=function(){c[a].F.hasOwnProperty(arguments.length)||W("Function '"+b+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+c[a].F+")!");return c[a].F[arguments.length].apply(this,arguments)};c[a].F=[];c[a].F[e.J]=e}} -function cb(a,b,c){d.hasOwnProperty(a)?((void 0===c||void 0!==d[a].F&&void 0!==d[a].F[c])&&W("Cannot register public name '"+a+"' twice"),bb(a,a),d.hasOwnProperty(c)&&W("Cannot register multiple overloads of a function with the same number of arguments ("+c+")!"),d[a].F[c]=b):(d[a]=b,void 0!==c&&(d[a].O=c))}function db(a,b){for(var c=[],e=0;e>2)+e]);return c} -function eb(a,b){a=T(a);var c=d["dynCall_"+a];for(var e=[],f=1;f>1]}:function(e){return H[e>>1]};case 2:return c?function(e){return K[e>>2]}:function(e){return M[e>>2]};default:throw new TypeError("Unknown integer type: "+a);}} -for(var kb=[null,[],[]],lb=Array(256),mb=0;256>mb;++mb)lb[mb]=String.fromCharCode(mb);La=lb;Sa=d.BindingError=Pa("BindingError");Ta=d.InternalError=Pa("InternalError");d.count_emval_handles=function(){for(var a=0,b=5;b>g])},G:null})},j:function(a,b){b=T(b);X(a,{name:b,fromWireType:function(c){var e=Y[c].value;4q&&W("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var y=null!==h[1]&&!1,C=!1,m=1;m>>k}}var h=-1!=b.indexOf("unsigned");X(a,{name:b,fromWireType:g,toWireType:function(n,p){if("number"!==typeof p&&"boolean"!==typeof p)throw new TypeError('Cannot convert "'+Ya(p)+'" to '+this.name);if(pf)throw new TypeError('Passing a number "'+ -Ya(p)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+e+", "+f+"]!");return h?p>>>0:p|0},argPackAdvance:8,readValueFromPointer:jb(b,l,0!==e),G:null})},a:function(a,b,c){function e(g){g>>=2;var l=M;return new f(L,l[g+1],l[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=T(c);X(a,{name:c,fromWireType:e,argPackAdvance:8,readValueFromPointer:e},{L:!0})},g:function(a,b){b=T(b);var c="std::string"=== -b;X(a,{name:b,fromWireType:function(e){var f=M[e>>2];if(c)for(var g=e+4,l=0;l<=f;++l){var k=e+4+l;if(l==f||0==G[k]){g=g?F(G,g,k-g):"";if(void 0===h)var h=g;else h+=String.fromCharCode(0),h+=g;g=k+1}}else{h=Array(f);for(l=0;l=q&&(q=65536+((q&1023)<<10)|f.charCodeAt(++p)&1023);127>=q?++n:n=2047>=q?n+2:65535>=q?n+3:n+4}return n}:function(){return f.length})(),k=nb(4+l+1);M[k>>2]=l;if(c&&g)la(f,k+4,l+1);else if(g)for(g=0;g>2],p=l(),q,y=h+4,C=0;C<=n;++C){var m=h+4+C*b;if(C==n||0==p[m>>k])y=e(y,m-y),void 0===q?q=y:(q+=String.fromCharCode(0),q+=y),y=m+b}Z(h);return q},toWireType:function(h,n){"string"!==typeof n&&W("Cannot pass non-string to C++ string type "+c);var p=g(n),q=nb(4+p+b);M[q>>2]=p>> -k;f(n,q+4,p+b);null!==h&&h.push(Z,q);return q},argPackAdvance:8,readValueFromPointer:Xa,G:function(h){Z(h)}})},l:function(a,b){b=T(b);X(a,{N:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},f:function(){A()},o:function(a,b,c){G.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=G.length;if(2147483648=c;c*=2){var e=b*(1+.2/c);e=Math.min(e,a+100663296);e=Math.max(16777216,a,e);0>>16);wa(E.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},h:function(a,b,c,e){for(var f=0,g=0;g>2],k=K[b+(8*g+4)>>2],h=0;h>2]=f;return 0},memory:E,n:function(){},table:ia}; -(function(){function a(f){d.asm=f.exports;O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);0==O&&(null!==Da&&(clearInterval(Da),Da=null),Q&&(f=Q,Q=null,f()))}function b(f){a(f.instance)}function c(f){return Ia().then(function(g){return WebAssembly.instantiate(g,e)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var e={a:ob};O++;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(d.instantiateWasm)try{return d.instantiateWasm(e,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+ -f),!1}(function(){if(D||"function"!==typeof WebAssembly.instantiateStreaming||Fa()||Ea("file://")||"function"!==typeof fetch)return c(b);fetch(R,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,e).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); -var Ja=d.___wasm_call_ctors=function(){return(Ja=d.___wasm_call_ctors=d.asm.r).apply(null,arguments)},nb=d._malloc=function(){return(nb=d._malloc=d.asm.s).apply(null,arguments)},Z=d._free=function(){return(Z=d._free=d.asm.t).apply(null,arguments)},hb=d.___getTypeName=function(){return(hb=d.___getTypeName=d.asm.u).apply(null,arguments)};d.___embind_register_native_and_builtin_types=function(){return(d.___embind_register_native_and_builtin_types=d.asm.v).apply(null,arguments)}; -d.dynCall_diiiii=function(){return(d.dynCall_diiiii=d.asm.w).apply(null,arguments)};d.dynCall_diiii=function(){return(d.dynCall_diiii=d.asm.x).apply(null,arguments)};d.dynCall_vi=function(){return(d.dynCall_vi=d.asm.y).apply(null,arguments)};d.dynCall_ii=function(){return(d.dynCall_ii=d.asm.z).apply(null,arguments)};d.dynCall_iiii=function(){return(d.dynCall_iiii=d.asm.A).apply(null,arguments)};d.dynCall_viiiiii=function(){return(d.dynCall_viiiiii=d.asm.B).apply(null,arguments)}; -d.dynCall_viiiii=function(){return(d.dynCall_viiiii=d.asm.C).apply(null,arguments)};d.dynCall_viiii=function(){return(d.dynCall_viiii=d.asm.D).apply(null,arguments)};d.dynCall_jiji=function(){return(d.dynCall_jiji=d.asm.E).apply(null,arguments)};var pb;Q=function qb(){pb||rb();pb||(Q=qb)}; -function rb(){function a(){if(!pb&&(pb=!0,d.calledRun=!0,!ja)){N(za);N(Aa);aa(d);if(d.onRuntimeInitialized)d.onRuntimeInitialized();if(d.postRun)for("function"==typeof d.postRun&&(d.postRun=[d.postRun]);d.postRun.length;){var b=d.postRun.shift();Ba.unshift(b)}N(Ba)}}if(!(0=d);)++c;if(16f?d+=String.fromCharCode(f):(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023))}}else d+=String.fromCharCode(f)}return d} +function sa(a,b,c){var d=D;if(0=g){var k=a.charCodeAt(++f);g=65536+((g&1023)<<10)|k&1023}if(127>=g){if(b>=c)break;d[b++]=g}else{if(2047>=g){if(b+1>=c)break;d[b++]=192|g>>6}else{if(65535>=g){if(b+2>=c)break;d[b++]=224|g>>12}else{if(b+3>=c)break;d[b++]=240|g>>18;d[b++]=128|g>>12&63}d[b++]=128|g>>6&63}d[b++]=128|g&63}}d[b]=0}}var ta="undefined"!==typeof TextDecoder?new TextDecoder("utf-16le"):void 0; +function ua(a,b){var c=a>>1;for(var d=c+b/2;!(c>=d)&&va[c];)++c;c<<=1;if(32>1];if(0==f||c==b/2)return d;++c;d+=String.fromCharCode(f)}}function wa(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;E[b>>1]=0;return b-d}function xa(a){return 2*a.length} +function ya(a,b){for(var c=0,d="";!(c>=b/4);){var f=F[a+4*c>>2];if(0==f)break;++c;65536<=f?(f-=65536,d+=String.fromCharCode(55296|f>>10,56320|f&1023)):d+=String.fromCharCode(f)}return d}function za(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var d=b;c=d+c-4;for(var f=0;f=g){var k=a.charCodeAt(++f);g=65536+((g&1023)<<10)|k&1023}F[b>>2]=g;b+=4;if(b+4>c)break}F[b>>2]=0;return b-d} +function Aa(a){for(var b=0,c=0;c=d&&++c;b+=4}return b}var G,Ba,D,E,va,F,I,Ca,Da;function Ea(a){G=a;e.HEAP8=Ba=new Int8Array(a);e.HEAP16=E=new Int16Array(a);e.HEAP32=F=new Int32Array(a);e.HEAPU8=D=new Uint8Array(a);e.HEAPU16=va=new Uint16Array(a);e.HEAPU32=I=new Uint32Array(a);e.HEAPF32=Ca=new Float32Array(a);e.HEAPF64=Da=new Float64Array(a)}var Fa=e.INITIAL_MEMORY||16777216; +e.wasmMemory?C=e.wasmMemory:C=new WebAssembly.Memory({initial:Fa/65536,maximum:32768});C&&(G=C.buffer);Fa=G.byteLength;Ea(G);F[5836]=5266384;function Ga(a){for(;0=b?"_"+a:a} +function Za(a,b){a=Ya(a);return(new Function("body","return function "+a+'() {\n "use strict"; return body.apply(this, arguments);\n};\n'))(b)}function $a(a){var b=Error,c=Za(a,function(d){this.name=a;this.message=d;d=Error(d).stack;void 0!==d&&(this.stack=this.toString()+"\n"+d.replace(/^Error(:[^\n]*)?\n/,""))});c.prototype=Object.create(b.prototype);c.prototype.constructor=c;c.prototype.toString=function(){return void 0===this.message?this.name:this.name+": "+this.message};return c} +var O=void 0;function R(a){throw new O(a);}var ab=void 0;function bb(a){throw new ab(a);}function cb(a,b,c){function d(h){h=c(h);h.length!==a.length&&bb("Mismatched type converter count");for(var m=0;m>2])}function yb(a,b,c){if(b===c)return a;if(void 0===c.O)return null;a=yb(a,b,c.O);return null===a?null:c.ha(a)}var zb={}; +function Ab(a,b){for(void 0===b&&R("ptr should not be undefined");a.O;)b=a.X(b),a=a.O;return zb[b]}function Bb(a,b){b.L&&b.K||bb("makeClassHandle requires ptr and ptrType");!!b.N!==!!b.M&&bb("Both smartPtrType and smartPtr must be specified");b.count={value:1};return ib(Object.create(a,{I:{value:b}}))}function V(a,b,c,d){this.name=a;this.J=b;this.ba=c;this.Z=d;this.$=!1;this.T=this.pa=this.oa=this.fa=this.ra=this.ma=void 0;void 0!==b.O?this.toWireType=ub:(this.toWireType=d?rb:wb,this.R=null)} +function Cb(a,b){e.hasOwnProperty(a)||bb("Replacing nonexistant public symbol");e[a]=b;e[a].Y=void 0}function W(a,b){a=L(a);var c=e["dynCall_"+a];for(var d=[],f=1;f>2)+d]);return c}function Ib(a){for(;a.length;){var b=a.pop();a.pop()(b)}} +function Jb(a){var b=Function;if(!(b instanceof Function))throw new TypeError("new_ called with constructor type "+typeof b+" which is not a function");var c=Za(b.name||"unknownFunctionName",function(){});c.prototype=b.prototype;c=new c;a=b.apply(c,a);return a instanceof Object?a:c}var Kb=[],Y=[{},{value:void 0},{value:null},{value:!0},{value:!1}]; +function vb(a){switch(a){case void 0:return 1;case null:return 2;case !0:return 3;case !1:return 4;default:var b=Kb.length?Kb.pop():Y.length;Y[b]={qa:1,value:a};return b}}function U(a){if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}function Lb(a,b){switch(b){case 2:return function(c){return this.fromWireType(Ca[c>>2])};case 3:return function(c){return this.fromWireType(Da[c>>3])};default:throw new TypeError("Unknown float type: "+a);}} +function Mb(a,b,c){switch(b){case 0:return c?function(d){return Ba[d]}:function(d){return D[d]};case 1:return c?function(d){return E[d>>1]}:function(d){return va[d>>1]};case 2:return c?function(d){return F[d>>2]}:function(d){return I[d>>2]};default:throw new TypeError("Unknown integer type: "+a);}}for(var Nb=[null,[],[]],Ob=Array(256),Pb=0;256>Pb;++Pb)Ob[Pb]=String.fromCharCode(Pb);Wa=Ob;O=e.BindingError=$a("BindingError");ab=e.InternalError=$a("InternalError"); +T.prototype.isAliasOf=function(a){if(!(this instanceof T&&a instanceof T))return!1;var b=this.I.L.J,c=this.I.K,d=a.I.L.J;for(a=a.I.K;b.O;)c=b.X(c),b=b.O;for(;d.O;)a=d.X(a),d=d.O;return b===d&&c===a};T.prototype.clone=function(){this.I.K||eb(this);if(this.I.W)return this.I.count.value+=1,this;var a=ib(Object.create(Object.getPrototypeOf(this),{I:{value:db(this.I)}}));a.I.count.value+=1;a.I.U=!1;return a}; +T.prototype["delete"]=function(){this.I.K||eb(this);this.I.U&&!this.I.W&&R("Object already scheduled for deletion");gb(this);hb(this.I);this.I.W||(this.I.M=void 0,this.I.K=void 0)};T.prototype.isDeleted=function(){return!this.I.K};T.prototype.deleteLater=function(){this.I.K||eb(this);this.I.U&&!this.I.W&&R("Object already scheduled for deletion");kb.push(this);1===kb.length&&jb&&jb(lb);this.I.U=!0;return this};V.prototype.ka=function(a){this.fa&&(a=this.fa(a));return a}; +V.prototype.ea=function(a){this.T&&this.T(a)};V.prototype.argPackAdvance=8;V.prototype.readValueFromPointer=xb;V.prototype.deleteObject=function(a){if(null!==a)a["delete"]()}; +V.prototype.fromWireType=function(a){function b(){return this.$?Bb(this.J.V,{L:this.ma,K:c,N:this,M:a}):Bb(this.J.V,{L:this,K:a})}var c=this.ka(a);if(!c)return this.ea(a),null;var d=Ab(this.J,c);if(void 0!==d){if(0===d.I.count.value)return d.I.K=c,d.I.M=a,d.clone();d=d.clone();this.ea(a);return d}d=this.J.ja(c);d=mb[d];if(!d)return b.call(this);d=this.Z?d.ga:d.pointerType;var f=yb(c,this.J,d.J);return null===f?b.call(this):this.$?Bb(d.J.V,{L:d,K:f,N:this,M:a}):Bb(d.J.V,{L:d,K:f})}; +e.getInheritedInstanceCount=function(){return Object.keys(zb).length};e.getLiveInheritedInstances=function(){var a=[],b;for(b in zb)zb.hasOwnProperty(b)&&a.push(zb[b]);return a};e.flushPendingDeletes=lb;e.setDelayFunction=function(a){jb=a;kb.length&&jb&&jb(lb)};Db=e.UnboundTypeError=$a("UnboundTypeError");e.count_emval_handles=function(){for(var a=0,b=5;b>g])},R:null})},n:function(a,b,c,d,f,g,k,h,m,l,n,t,u){n=L(n);g=W(f,g);h&&(h=W(k,h));l&&(l=W(m,l));u=W(t,u);var y=Ya(n);ob(y,function(){Gb("Cannot construct "+n+" due to unbound types",[d])});cb([a,b,c],d?[d]:[],function(r){r=r[0];if(d){var w=r.J;var p=w.V}else p=T.prototype;r=Za(y,function(){if(Object.getPrototypeOf(this)!==H)throw new O("Use 'new' to construct "+n);if(void 0===x.S)throw new O(n+" has no accessible constructor");var P=x.S[arguments.length];if(void 0=== +P)throw new O("Tried to invoke ctor of "+n+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(x.S).toString()+") parameters instead!");return P.apply(this,arguments)});var H=Object.create(p,{constructor:{value:r}});r.prototype=H;var x=new pb(n,r,H,u,w,g,h,l);w=new V(n,x,!0,!1);p=new V(n+"*",x,!1,!1);var Z=new V(n+" const*",x,!1,!0);mb[a]={pointerType:p,ga:Z};Cb(y,r);return[w,p,Z]})},m:function(a,b,c,d,f,g){assert(0x&&R("argTypes array size mismatch! Must at least get return value and 'this' types!");var Z=null!==r[1]&&null!==p,P=!1;for(p=1;p>>h}}var m=-1!=b.indexOf("unsigned");S(a,{name:b,fromWireType:g,toWireType:function(l,n){if("number"!==typeof n&&"boolean"!==typeof n)throw new TypeError('Cannot convert "'+U(n)+'" to '+this.name);if(nf)throw new TypeError('Passing a number "'+U(n)+'" from JS side to C/C++ side to an argument of type "'+b+'", which is outside the valid range ['+d+", "+f+"]!");return m?n>>>0:n|0},argPackAdvance:8,readValueFromPointer:Mb(b,k,0!==d),R:null})},a:function(a,b,c){function d(g){g>>=2;var k=I;return new f(G, +k[g+1],k[g])}var f=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][b];c=L(c);S(a,{name:c,fromWireType:d,argPackAdvance:8,readValueFromPointer:d},{la:!0})},g:function(a,b){b=L(b);var c="std::string"===b;S(a,{name:b,fromWireType:function(d){var f=I[d>>2];if(c)for(var g=d+4,k=0;k<=f;++k){var h=d+4+k;if(k==f||0==D[h]){g=g?ra(D,g,h-g):"";if(void 0===m)var m=g;else m+=String.fromCharCode(0),m+=g;g=h+1}}else{m=Array(f);for(k=0;k=t&&(t=65536+((t&1023)<<10)|f.charCodeAt(++n)&1023);127>=t?++l:l=2047>=t?l+2:65535>=t?l+3:l+4}return l}:function(){return f.length})(),h=Qb(4+k+1);I[h>> +2]=k;if(c&&g)sa(f,h+4,k+1);else if(g)for(g=0;g>2], +n=k(),t,u=m+4,y=0;y<=l;++y){var r=m+4+y*b;if(y==l||0==n[r>>h])u=d(u,r-u),void 0===t?t=u:(t+=String.fromCharCode(0),t+=u),u=r+b}X(m);return t},toWireType:function(m,l){"string"!==typeof l&&R("Cannot pass non-string to C++ string type "+c);var n=g(l),t=Qb(4+n+b);I[t>>2]=n>>h;f(l,t+4,n+b);null!==m&&m.push(X,t);return t},argPackAdvance:8,readValueFromPointer:xb,R:function(m){X(m)}})},k:function(a,b){b=L(b);S(a,{sa:!0,name:b,argPackAdvance:0,fromWireType:function(){},toWireType:function(){}})},e:function(){A()}, +q:function(a,b,c){D.copyWithin(a,b,b+c)},c:function(a){a>>>=0;var b=D.length;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);d=Math.max(16777216,a,d);0>>16);Ea(C.buffer);var f=1;break a}catch(g){}f=void 0}if(f)return!0}return!1},h:function(a,b,c,d){for(var f=0,g=0;g>2],h=F[b+(8*g+4)>>2],m=0;m>2]=f;return 0},memory:C,p:function(){},table:oa}; +(function(){function a(f){e.asm=f.exports;J--;e.monitorRunDependencies&&e.monitorRunDependencies(J);0==J&&(null!==Ma&&(clearInterval(Ma),Ma=null),Na&&(f=Na,Na=null,f()))}function b(f){a(f.instance)}function c(f){return Sa().then(function(g){return WebAssembly.instantiate(g,d)}).then(f,function(g){B("failed to asynchronously prepare wasm: "+g);A(g)})}var d={a:Rb};J++;e.monitorRunDependencies&&e.monitorRunDependencies(J);if(e.instantiateWasm)try{return e.instantiateWasm(d,a)}catch(f){return B("Module.instantiateWasm callback failed with error: "+ +f),!1}(function(){if(na||"function"!==typeof WebAssembly.instantiateStreaming||Pa()||Oa("file://")||"function"!==typeof fetch)return c(b);fetch(K,{credentials:"same-origin"}).then(function(f){return WebAssembly.instantiateStreaming(f,d).then(b,function(g){B("wasm streaming compile failed: "+g);B("falling back to ArrayBuffer instantiation");return c(b)})})})();return{}})(); +var Ta=e.___wasm_call_ctors=function(){return(Ta=e.___wasm_call_ctors=e.asm.t).apply(null,arguments)},Qb=e._malloc=function(){return(Qb=e._malloc=e.asm.u).apply(null,arguments)},X=e._free=function(){return(X=e._free=e.asm.v).apply(null,arguments)},Fb=e.___getTypeName=function(){return(Fb=e.___getTypeName=e.asm.w).apply(null,arguments)};e.___embind_register_native_and_builtin_types=function(){return(e.___embind_register_native_and_builtin_types=e.asm.x).apply(null,arguments)}; +e.dynCall_ii=function(){return(e.dynCall_ii=e.asm.y).apply(null,arguments)};e.dynCall_vi=function(){return(e.dynCall_vi=e.asm.z).apply(null,arguments)};e.dynCall_dii=function(){return(e.dynCall_dii=e.asm.A).apply(null,arguments)};e.dynCall_iiiii=function(){return(e.dynCall_iiiii=e.asm.B).apply(null,arguments)};e.dynCall_iiii=function(){return(e.dynCall_iiii=e.asm.C).apply(null,arguments)};e.dynCall_diii=function(){return(e.dynCall_diii=e.asm.D).apply(null,arguments)}; +e.dynCall_viiiiii=function(){return(e.dynCall_viiiiii=e.asm.E).apply(null,arguments)};e.dynCall_viiiii=function(){return(e.dynCall_viiiii=e.asm.F).apply(null,arguments)};e.dynCall_viiii=function(){return(e.dynCall_viiii=e.asm.G).apply(null,arguments)};e.dynCall_jiji=function(){return(e.dynCall_jiji=e.asm.H).apply(null,arguments)};var Sb;Na=function Tb(){Sb||Ub();Sb||(Na=Tb)}; +function Ub(){function a(){if(!Sb&&(Sb=!0,e.calledRun=!0,!pa)){Ga(Ia);Ga(Ja);ba(e);if(e.onRuntimeInitialized)e.onRuntimeInitialized();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();Ka.unshift(b)}Ga(Ka)}}if(!(0?_pLWCsgReQB=^27B!NKKck;>*2s`463lLWGSOWn8kq3$j3JMk~ zsO_Mlv?z|>VAF0Wwstpuqa*D$PPyU-g~O* z)TvXaPMve=)brzajZ>c(HLPXTQqCCT&l|nx@FY*-#pW1Eyv!uM0iu$zT{TXFg&K{r zfp3^&ZP4vOs@t$(15kYgQakn8p!?(FzwyQ!QO)MCUE4?W(CCE5=0xa|Ozt{5FX<89 zfR3PS+{JTw3vXd2-g8+H?|ERbh0kXJycaMZ-V1f>B4z--j)n1V)inu?zgX8VVa2Fl z%0hTAV?FU+u5nf{4!Di^@m@)o24AJ_<0Z*n=3n`@+_Jdk_gkFdTgsRj0@em?<)Yp`w~_rU)BWRg{H7!Jy>_ zsX#EKIpyGwh5b1>l_vOL%!fZey}JIYvm%j@YjV>x^Rt7@GEK1SGYlJp20}&#{*oEI z(B}_93*?C(zG~Qk30b_I-D&XEY#3j|O8E8cJ;UJ@>~S6%$C>1I)qnA?_~-n8^MB)y@uq3_^Q9F(;XmfD z^Va}1RW}{uuke@oQC{&XuXvUp;VRypb|D;B!K;o=JMBi^L4t-KzsF+RiyI!tCH9PSuP#C2-8 zRmT^oMV8Z4Q*E$p&TPjNH7<92qQ>E<8e%X9m7FIXhN2aBm{_bqATcqh2qTo(b^us1 zm{4b|>3IjKU(A{i0fJ*BT;`ba^@D1bFII4nC&m{!mSa{M88JT2ipysXay)8}@3oSr zcp_$@E2@D4R++;iTs{koXAi2i{x$rd`pVx7A|8@FevmsR(Bw-%dFh~fIFLV*hNAZI z5mP>gYMKC5X&}pXe5rOC8`WNaLVS+;PcH+9vA}pV9@AusY{zh{Zj6dxA=s!5_QiW< z@UFkZv@djnonl9ia7SolDMoOak))ZEoD9hw-X7y^OGHH@DGyU`h;$k$wbUssR)y24sq8s<0NAiqeXE|heeo8xH1WG*!KMfx02;d z#uG840xL(DrreOg*Tv$ReLxf%!NLvFvT@aoElNpSwSU{OM(E3=!-eY`a}h@g%+`;<-Ax%m)b#8 zh#}75+p<@4)iZnIwUros(?+a@Jj*9xt!&5);un>qu$v4b;-@|(c0N9Jj7f(S0o-6| z#3S6ci%~DR!-`!72ACKY!D5hFKaf#;H5=@^hzR9nffsu|>p!l|KMk^7tcT0pai2!+*(qgBv>xbzBTc_5cadHE~*J zR|^3Puj^AH77vqr!HC$$wQ5|%hSKoF`&4@vmPrOhj~EN54j3n@|GumTT+KjC%91KU`_|T2) zu(q=qnKoJSqlK;fDb=fJJs5bT=x)3R7jNTF9e$L|?(Kb;!si$m&csgrR?+h!9KIu5Dc zWranDIBia=E#f!gG#E*inol26v&shWBWhP!p8Eus^(4-KEuT38?f_$nlj9N$X=0Tv$GR*r*7{RR_|600TM-I#&;t!x5|si z;4^hZW@uSC{;r6O_d4+Rf|-qV1JxgU-CUXqXwt!qDY1Xk#sU`M{_2|`kdhh_Q)5k9 zOszG;1|Q-z2F#;?UBW79I7ktW_BasL1s3t!L+XQ?#QB`jkln+qS+z$l#1(6g`O_iR zfZm^`ObK%WP*rV80G@A328`%ZUhKM1Q-tAzV5cXv&uEt&6xfm&bs$NyCM_|wAl3K! zymmgT#(Au6tUFRj0>t(K-5^@QrJ3e(O5fwfGyv(2LuMQ5VbK7VH$Z*AquN^QC>S^h zED<emC>&35rq zHEZA<$rG7!i!D!O$WJqc$!ymPodiUL&>{sHJAe4aISx9A`>+d`oeCVhCFY>OGh=4iqM6wgjbga(smX(zj8l$MgKMl346XVNEpq}C_tJq0vBp&F zavfx3B*c`|j1Ip%cqJDU;E81vx)6sYwpuZ?nLnYPA9@e3RMUo)@!o3rumgDK4}X+j zuU;HJ81UD_ZvlM$h`8}~v3h>QWqggw8rje2C{yu~yXf=o$biIE? z!C+;>+JzQ+o2*p=4XE%tVH^SoDddDTl9NU{#(;GA5DU||tnxz2=h&>QdHySJf{;ZKz5ql!i* z6vEfvTyRRZU7BRt^*|_qrdrV)O%mliH>j&6*8}CbA+KnpieXKex&S%q;)npQQpiy^ z!z+5oQ8%J_?nKV?iXP=C)|6%>)5zi+eljNvtk?x3TWbVgjOB={+$h1;i?Lk5c?7c; zWBKALHGe`cV;5K3C$#V!_1g)hyhueRRt5^dnjw0r;S+oDo~mVHt$#O0W}p-)pycGKyI6KjYc~$DX$cVq6}>c z>~{?#l;k&JL18UIWGz75n%vB1sVS3d(QWPIYk8jfU~&!bdH0l+gZz{2#14 z4V-mEm7T3|u+jC&!VptzoCCZhh|5t)j@ses*wlWr`(Yh)oi;1nuI{vgq^KAgMnrzo zOY0w|`8L+YlR@8e5V?4OgNz|V+UPh0!qn_l*G{WdXQvkNTvar!IGnI^kv@QOE>m|+ zE4|9&QyV4>Aog>+nHh11!wX@~r^-cX%!3i%JFrhdnOxOIaTiiBq?;MguY5vAg`f&S z6ettAZCfdj)m>?|5<5DJ{2p836_y{QJ1Jhid!}P;~+>D9yi%+8^htL=5Kw zGB}h_KnWQdujGT_t6*5F_e1hmA(<&phlHuz>7)4*hi6Y8#NlLiU)&q-V;AQeC%ED> z@{H4Y>g$WEj6M0Pa7LAJEMLhPRo1C|X{h2E6~@j2wQELI^0@*D<$-R%v3Z``egXN* z_sZpSSt2ZtSIVPV$kQMy79sH;T>OfQlU)3Qi_f^|;Nsu8_>_xJxcHchkC40z$^%09 z<+H`|FnvERl9qf=2xK;jq#-{eXn!HSDfZ@fO9GbINPGYIT!`bn^E9=83oP{T?jediC!lj~0rFSZ=}Mrh z5tlVqO^-3L3AVr+n%cJ`{H->&a_l`W3gJJw$W@PAHXs-DoeWZKO$*sK8dH6K*{Hs` z-mC;1pFD#J6j9iqC&a`b;CP|rhWH(aT@wj$i@N0UrtCa7fLcqtG!x&bdgAic{5PuX zio(k8W|B#wmfpSwZC_A}s%x)k&OypW7GOMlV9W3kMe4aLZcg^W=miOES^|h?4d9L5 zer;P)!f9;xe-&@s|IIxw!YyOk6`pWXZkbSFdUOv=0*+owus|aP$Z-cmE=&NtGWjJy z5eG+Vb99`Nfu8h(kbcB74seU`tDU0+v0{M)Rc2D9M-`Ro4_A(yl>^R}#~VLAdHc&A zX9e09YmP9k#~B9nb#g~EGT^ny`y1r+#qae>k_m=-oHHf0b7o#c0oE3MU|6Y#4ny>8 z5LD1?y4pf8gP=mmTQci}jw^?$0jnGgbqol z7^WhUrl5$T+IiKmoZC3rMxWz@U>c8ZdMPe$Qy*QmE=nv$FY3#3#~WM9q;eJ@B+{XCT->RK zjxR$>^osH8)x&cNc&&P2PW8yyF$$E#-M|&qa8wiv*|j=k!g&wDT@1MyhYZ6Uy!B}n zFW4xdR7uM~-cMcJ@`Q1wm-@ElKK{Sd?zxqGwt8Xi5DfJ7+)FbXu?=FT04;L3MI|IpVb7 zg8JknNSADkT!M6}7mniU0bbmmfg`vVQjs%4a+tO`**q#ZaPeXy0T9gq${WCTi4?IQ zu3hvM9@_fjsYgGG0qh~?G00>E7vAdW-k=O&>)sR)SHu3$0;!7^W>w=rHieD~B zsLvKkUZu(xRWGa6S6?Qwgd-Tm7(4a(`by+_Ii11~v=j4MGc3BDT8)ITcB?L|Ds&o) ztrwYTUxe5kmqubaI>7m6XOUSn#bsb$$IL!8XHgl?QkxbvH3()?=nCl(rk~ka=@K~4 z4nu%mnW)(Javn??aXoO14xTw`&(hlB9DR}K1nH^=CoIbe5ro}<_D`19Rc#_R3~`DN zH?jX*zwP)b55O@1u0T@|Q{OInwl`g8dCXYiQrlJr_apeGxdmYc&S_On>rj5Ny0Y~~ zygz82UewttF3GZqOHU-0$XD^i4S%co{X`pRj9+||4_Ce=1pCnHXKvk9|ANR$ft0TY+BcXiN@>5+Fpr4IVxt@TYr9YcKEMqQ~nW)Ng} zL}<$rI+oUODK7~_kt8IhPYmAi!hzq~+1=?4XS0^R$@bu|77}JqmFy^QE%0L_R zE4d13F4@7_R>Hc{Am_-yJNINzXzOuDv-MbD@?*%cNwcZlxR#FDMB^h0BpDM2u*qrh znVt-uOHYkRnZ!FH%Ktn1ij*L_iS?vQ#PzJtuVs3Ci!O4bFn%yB0^1Fef~TZ}cn~GT zRZRB6%`EmIUBl9bgmuxzNG~#G(lZ-}V5(`N4dTFf^YL^?0EwbpfEB{p;40Pi(Wyh< zjQZ?GSQ(i_#s({j74ha?(1sf|gHkaFL_G!ENwd}KsHIcTCfRsfqUL@pK~`URSU0?8^5O^{Rc@6Om37pkJzLmzVW@gnJei8V$RrQ>dhqm_URTNq|@_ z{gt$MO07upe3jF7amh4_c}w&UBw&cVtKVs;@G-gHQJdQeBV(}&VinCjC|0QhZ4+Cm zrj9Xv(x%$u5IGdwvz3ND(PITia%?V$M34(wj`c^ngVX>@L27_%i`RMyJt_-eIwWsPr&=4)$5R%e`)ncNNVm` z^KZcx1hJ8Xs8Z{$uV}2*x}q0Vw9xsK{>lU~T+Q?w8)~@k*?#c`ktF+nh`;>Q8 z$Mq%Qr*lyyPvpvgs$W|cyh|6)BQqg8<%LlS3;WDLfB&7FCaXZo4D-2;hDJ1-Y2N|W|igsf*Xu1^<*qogegC{!15jQcHkFBr9jUr~F`707h_4D zVey2RWcvHm5B0lgG1tT?9yz|zu7h?Q6j`ppT>dN>WkaX-zmP)2W)PCN|fKNBZQ zL;u*qvAi4(JN*jM+-ma;h5RD*zzuUk6z(DfK=50?X(aD?IKJUU9*q(i(o`G}BUpaS zwWrG3Sjb1J8-iQnaorDlFr|zR~_u@Wa<@3 zvGvpB|0`P~{x(}96tQ)sW^2U%ge{_19Zs`lzp6gExu^#n8?YsCnl~wt8=!O9mRcVj z!}8RSEu~{LjMh1B@_zmm=eO$}y)=EvCxpyLQ_m&aHX0G1aQbwOIw`|5y z1SeYLD)MmL#MQKj9!}mejmHXHKdryV2s8lgh=uhR={$U+>h!H^s>=ZTkO!e3tsx7k zJ7CF7a8JllP$B;kRd?Ptw>THUQ$0n@^m7d>t`n)S&^F!LoVl%EQsPYElP8cOkveba zlfw{~>zRSD*utT40V;awMjZ4h^?4yI|97xVvW{lz@}QF@Q5X8)38BL);Ha&h+}h8~ z5jU$(w&sU(Xfa4LbJSnA_H$6pyBH#dSJ(sPl1XVL(Wq%+-Sz!l_Qv zDbPIpW?T7p=~NRRLG^CMnO5C zzh6KVNpF1OR-6GfOvxLnBW1y3Q6>(LA5Q=&v14}(YS>1))kT*)(N-M->7yZO6B==s z1qYi-`e8^qK%XYmThzeq12eDoET#CGG`~o-Z@;OGGAXce*bSJ2-a?lChQKQ2F>-e- z^+D}k52?*N3ULYaz>a}@n|gakX%fWJqmub0Za|dshS~u#`)bdzqyiB-$U*`aILMkf z$RbY1<|TUMXT|NHMX`I=iPpr4*2Ia{i%skXJ|yjH5O4vR)G2+U?M}uMOV`m>{b<*u z{6BGhAs&MRgUr0l1w-bd;_ik;i}kc%F48|=1%TfXk||?4F0kzpBoDbiD39YzDSsSB zs{1v9^lMX49t$Ja7a<({XeKPb7sl5oGQ=;rJsK_&1i$4fZsmr!KHP)8I&^n_azUrO zD29yFxM=~?FWnrT`fVO=#r1YLFEikrn;C$U{4*wjh0&=1S{I!Q(8;0`Z%_p3<(2^J zWD$Pb^@eIv{puPdRUupS;TxE9I=|GhP5*dF=a&F``K43a)WdLX4U%fmp*-*`v-8m!rKtZsz$mAncuM6U@P$swrYQTQd?WDPBTcrW9Lp{Aa zFNv#NQc&tnm%{o?L?$hLDU4O|QQS>hNc+^=vfhxOS3rq#okunuzur`YNInwMM`}N$ zvmN0sy3`VadnE0GT~UqqlqAn1ORP|`g*c`>s~(daOSiH0bf}SbkhZHk$P!{`!fKr6 z7Q`EC*X}-w6tAA2uATl*LZ)kdI?91hlq?$tp&Reojoy=+7j>9Ubt5a7=7gGx@0~i0 z82+v}vn-Ntg^*0q?r2|B8tySEhK1X2I!UN^bfK+e5;I~Z}Y^aWf* zZ0G4lnmxK)xRDab>Bg}S^_g>k)g5W@F7YzOCIk8VU|JzkXql-2?x^GG)@~zowsK@g zb=TAg>ihT2NY=r0Qbn`1zw>K9i|^Qx8h#uS}P65RUkPhgHnL?=I*n zNQa}{i@28nhn=mN=o0qqWx7KaIVk}QDG0g{$(XmPhYlkISN@yrtAlvoEc=|FI@Z@nWJrG1x#)V+K(8Q zx2_u7x^N+z-@2;3W!bz109soaW0P|jtFRawgr@`W3;5FC>-cU#d2*`EQMX zO5?dq)&9@`aVFCa{&>fMtA0N$9%l$O4j*}Fps6|jQ2qAdazF9OZ1vT{CHBImCdQ~- zZL5YyV!CO%*R&+vwANO4rJDBXrf_Sz>A3pz5s%(!uhXh@OF@R}_ozoNo}q_oNjF`G zlgp#AIvRCn24hqE*DqMQYTnA$73~X_4P4W*1RRmvUqT!GrR6>;n`#Rp=hl|0=KXcL zrTx5?67}f*THW&IIW3>=zti}vr&{({W$1wtn`bb2phP|RSYhaWlrow8tVF$x(p{xC z7fe1-syZHvmAq4GXZFCzJ$ld^e<3DsF0;9f^LLpld%Q4o6eZAlqfE)id;2yy_P(HM zdwf`4v%vo&gbp?ynh{NVx=^n?o>$b4rXZ?_y-Yl3P~L>6S*Wkjyg${P)vfs%)U^v$ zb|BV7gkD9FdM(Xn>_iGK0Q@0f`Wpq9KztZ6jxH>UCl^m1o_uxdfnFh^&d1jf zNh&>87hwo1G zrMmg4x){F154C@THfleI?ttN-yS#N-`+}9T+n3Lsy>!9Sxde6%axOYpTDW@Iy!O`R z%eo_h6~?Z^U>JuL-~p&7T!`-)Jj6gdF{7%!-#d8@&Hmk4=o)wIGBy_-^>kiC&v_~M z1mNpZ@W+5#Qt&Cjt5WbcfZJ0ru|cMW#F7Cx!B|ok3Q$;*YN!CbGzHfKUYLSM0iK_N zn*r0`Nlb;NS%e2PJJ+=sa8EoXc<66G@CmOJPj|dB>fxZ$#Y1v=2IZ4#+!MW%s9?vj zMAR*YC*7?aa6Rb`V-0v-(GWXLF#gV@zKr=#yxsVlzf2y(L!;AP>b*l6NR{yB(FVf-@u?0*9S)q?~8 delta 13562 zcmb7L3t&~nnVvc4K6CC(=H~q%$vGzpc|Zuy7zvO&1Oy4lqo`OPJmqnDLqJ5}ralny z1&mZti&k9%p;m0P(yB<+y0~jyXl<8m)n!}O#n!c~wJqJc%YOfydy|0dwtK@lXJ-C? zX8!r-pZ|3ZXFf3A|A|q{=B{1N8DsnzqjnBY@+59-j*-O8Owyg{8c*)5wRcW080bSI zVR_F@bNp0K@=bFBn>TMp2^|3ST6b<6x$}ds<^(hf;TXwHe3Nkp&ruV3=>(I{M$=&I_78mEcg4lKj7yK zS3kxwjF4$E&Uk1{!r5X$6=SOO|!!iinU_QU!2pF7&O*6={Szca|A&inzKYIC@ z$&8r64KRptBgm=2&-Kq|R+U8pys$9H%#37)$+;Qy#|jMF&Ns4soJ;mM zoR4MCaNf$E=6oD`iu3X8n>^gindFxJZT=fRcFNcJvg+6P5&kNF1*NfLzsFzV-{mjx z>hJUFXZa!C&8wf|&-3p@__z2Q{24Y& z{$%wwSJyI|*+!$`!-F>(RO2Gyq8PH7j3jJs8_UEJ^^~ukFHpyQ_PG8v28(fK*{104 zaN95X+Z;{0uVr(dv>B?txXr|3T?7&nLyIwPiDd;bgAA!DzRK`Sw9FJQ^YLnge_DPg z4dVK)i~`#>5)QLX`DUkj%VKp308h9+bVV~z z^b&ZK%NKz0LZ^B$u%36Sfx(Fw#6yzDI=O9vTKNi4Ug=aH1`C>LDuPdln({E3X*JZO z3t5)!Pr+$!G<*FC@i6tDRt^f?-~<4V>S2n(VcXY-&?%uJkg+H;)!3Z5zDM`$ z*`qph&hRR=Be#rKbw8Jz%TakVZ&r+8d-m}7Q{xzm4;wbDySqOBZEl?B>RiE42QuRg zCkip(l_Y`?u_rh-kP3Ub`Y^N2sjv;%u_Xb7Xke^5f!w}9Y&(EI}u&S3kon; zJ!8@)j$xGsXnveqYHL%ocko`1pbljhPI`=nFvK{_ zwVlp-t*rsSLCIWm(V9!(8Ic{>i4b4MqM;GjQ zHZ7%>aLla5U@W_gz%%_fKuln>d`C$dy$;c%S6_X{t-3@1o40h8$ou%3`>VgV=V9H-B%9gtgW zrW|{$Np0t{3EFYAS(ru)`R+Kk5JwrfXNikxV(U-I- z=}TPdNO^PHK~g0^*r5x=m4^=Uu}SQlybpzrCp+--QFYrvZbu*)a@A^ivg@Z^{edYq3@O^D zM6vAx?u7hgAD4qMd?aYeL){=9Wk^KwifF(#oB&8uQRlMMWJEqDo8}bpZk2FGM$v(+ z0WIc}ed>8<5ZX^Ujkp)ML-{^6$t~jt)e^THE%&%h(ez{nO{U&;E71O#+cX^GkP7w2 z@d(0*U7Ri~L;BVL3Y{ST`~3Oy!8VvEbib)$gpvp3SC~kUfDp)9kcJ zRmsmW1j#hE!)xv_3GzJ%3HBV668sC0LIo%{XsdR};3)_{R^XizKu|tSO~iWOkj4v3 zn^Yc|LHAtKO^m(O|bFTk2g;)ig z6S$lgJ0}aPJ?F&0(C7>l;+-Anbxy9R>HN#qJWtuR-z-a6^t3fMB~Ej@>q}enf3Ce9 z44PL*Y};0sX4|*xnnrZ-S_7(8U>(>sT@I0nM?FLu`4XG@MVBfWkft zsMw|wwYln*0pGY3d92+Hq{+Kw;D;#%jFuPjRiw;P!aGdA?2H348jxFZ*q7S;go9|3I5{XvH};1`-OVLc0!Fvo`zMFAz7D zSct?d3vDTn-|Cn4+G(mDZyqA1-Wicqcz?MVafxx}s^5)p`B0VLSYAE>8|C1zKt~bv zW|k$cU{+X9A@*?f>XcHoy0O|gS*{*!tTjrk?!aYhxH{HY=3-wXSRb4S15SkDxg3#% zXzO8x+SW7?LUE#LH?L5OE-&Y`>h8-sac>y;G+(EFGI9jU;pV$gey}-iyjHAEG+)iz zRrRO_<9L~xHEJh4elx18;Vtfj?Vt>;9v?Mrf2|pxh9{T4_40UG!pV|`6QLtd5IZJ* zsNNjiGU#|2X_uhv5UZhAxD$~ls73y`44u%{< zyshpX)65<9w`0cf^(xXb2IaPv0fp-U%}BTzHlGxw-SN}1!=gex&|(ASxfX}J>O{*@ ztYUP0LyH5HEIT49z^K7Cw*}GD;ae*JKtsUJkc`SUM%74m8tEtlQupWaKL*r~=2aX2 z&D9^~Rpn1|$xn7UNks@@3zo~peQL=3a`@TP=Wpb%D>*SYIneP-2AMR-eIMxffM!5z zq})ppb16h1#pe@w2on5MVuBGW?0ebGLph(y>}9t=w5a#4 ztmfCL|GIK6kEz*{%6Ng=GN~$<2f_?dsk$ar^J4YmNp)2_xSJs=eR1%sqs7kN?c~@Q zpxp7%hF~8MGl^p5v=#75b$Od(W{VrtjctQ+bDc~(==yEnM7^t!Ws$9(Xd8=Rf7y0} zMw65CdA*u7xgWZ&n>>-eZ_XZcL*i77)X&n5P`tu$7Q~ zL$q0l^1R%E1Hsh(15{g0kD@f7STG{gg*;mcUSK9J{uW9~>l_uD+K@GfSVWz*7UJr) zsU^sB{bFiK%_3{i1p{&MFbAd~Va}m`Y$`(O>{ef&S{KTL*#m!<@0wQTQiv*+Q@Dh& zDS_e9t<@B@JjvCDX*1QP8O?lO_u(1CIdsv#e`P>Xt&S|Y4tL0tVyPhXm>M#(z&Mqs zCe7^c+mcYunf#g(3?k|ua56%TB@r;A@eWZupbLIX_VaZdj zd^S^Z{4tRs-sj>MT>PAif8ydK7yrn`&$#$07w>WL6E1$tDh>dbvOx!9D#l!~r zqnNlw9OvR6kfF#1&dF@x{3#nakLCd9l^o!FkOQ1|x%d&cex^=cT?py_)75c4L5;k| z&L!jFhQ$E5BxhK{4nYwPP%Exkl`8>gG$v|S1-D}?AqJ_>t{I%X6u`;QTV(ri^69AH z{NzGSQqF^-J)8?Dstp<(5ZTbUfMg}?Op;kr8D2-~qtSzezPJY+m_fqylYUa)ymmy@ z43`PShaO#od>(;fL;?`|&S9%U# z%CLikFQ@W|O`b9}ph$40Fvd&QP0T64xhVt2Z{<4NIFn~)}afy zqj!L4^}I9@Yi$qwHs1Qo=eu8qf(I)qJ?^CxJfXrQ=pI-YEQV%rp+*Xl2?&B;{Q7>w zV=$b#cGTNCXinJHp3y?sx?qAD^?rK2(Ws_h-&{o$tcs?m>*8a*XA!OPFGQ0F9E><=TF}{tXzl1j4lu5v?Uu-aN`}?Z`WAG0u&{u2 z0l-UIYIJIXj1r!jaKji)?QdIJ<9qVQc+^HT+J$7Ot{X}#Vzx!Y5f>ubc2PA$GbLSB zzrLX<=Puqv)7yUVr}fp2SK{I>HR8rwbBWY!$M5wgyGdLA`i)KePW9&-TT{bpaAkTt ztcZB7`G?um+?z)6GivWmS2d^h4W<(VrS}ahg>6W)z}uBxnl&noQayXpj4yA}CB(!4 z-?hDmcRN1Hu??W6P!k7(<`L(yg6vy-PQ5xiJHY=<-8!dS<?2{kqw4p{v*~35ek(w~KL5wCSbvX4AnU!X>b*@`P#y_Z8$8BVjaI%rM z2Q*jxU~U=CdjvH)?@=437OOow_ve#l6zjB}SSXDtzPPr`lop()Gd4KWu#)5VNaY2&IqQT*Yrvr*CeA=UB3EW+tg-*Oa^+5wwV_%?n$iyEu*z z$g#}?e3rKtw($8Xyr{XQ#LBYd!3>Ive$3=Y859@E-{|^Jd+HBb1pisOK1LHI<4Z-O zx?@q*&>w{f{1%f>>Fz|c7gnXb1+l=h?_}Mvkp5!6`uU<^{1KJ8xB{-h(8Ys?TnYXX zKjg9m1tXd-l!&k_ysqAP@M|t9JsL~~O@EY~aC5hw=C|%5FFLg}{+C(AL zzNf!YDTA#L6RCh+LnxSquPRd0g=8)^2Jct^8;q*~{cKA0HeR#@NS^Tgb=?`WKz-}Z zK08d?Wzcr1aH5qDS5p!-BWm>92QwkrNCvM%cIfcU<$Mc7znokFf~ z1SAXmh&U>`yoO(;8kcXz{e|VzihGd7v@8pIs7E0qU!=-b+}7`Z2m9j6Sy8HHw#U@3 zR^YU#s+F(u%haz{UV(evsz%)Bu4=Bm4Ah1a@U#P0YFSz4nO`Cm)}(j%scPlg0=`P! zy|xPXXV<#Z`@k$~2=-I2@4`;xEMg=VFwJ>X@ULGi$gJI*he#-?$)&h2rtV%^R}#}N z!R*ik#FL0|ARAPIW&!-2rS+q>fZ2xlkY8>>pqzjO_I}3GlM`Fg`}ZY&^)Tf7(HV$45)+ew&YioIEHqiQpkN!3u7T> z#KAXU4$L(0CK&<*mU?|_sIOOq2}~CU_m1d|k5HL94F+fN0On+3GK%Prk{%H%08eNr zu*0yPiP9~(N=IEP*>2mnCe+tdUjz$w=xZ1O+ zvbBb+iLHfQ%qC};Z;97#?EZ2?8uXTf@SCOdr@m2&N}o^omEZ>{#%$HHz0OZgY_3|dy)0GQ zxxFY=dTx7us`Pi;NAjc!+*^)&^}Sz%QwE10QCu#(a3qICcK7%0oyy%jN=)hC3Nt`Q z0S=3=pJ62FOw3q!|N5GKDEkp1(zg@HcCjfl{ZYzbD3Xx1YFAs7lKz0yL4B&v#b_DjaZFJW=zxoBd5Nl_5+YX~hh zxGskDh*Y$+#DpM!8KOh;Y`7j1bX4jB4K813p;2h+Oq!1E{2v+rs7wN)pO6vAiI4ISxB|F>2>zqHhPT{J zBGo%CWgfO_mqZ)mv{>{_d0e)^b^^6JhRn2wY+FMhxhI2MeSVoirlAaSQ3O8MqHC7LvX>UgzrtL1Xn>|&NOkT z8$>kbPJd5<*CKlZMvmv9!ZiCxRfwe^isK%_b`AztUE0?|{pqOPP!S(q_QVKq%?vUWlB$6n50ZHrBX#7h+!uInzTn*SPtA z85!w6Sj|3o$^V65gf$`iB3dssdyMe@3M#V+?-B&&GWvlCk5ggN4q^2l_v9z()RSll zBq(tNU&J}FeWaQwqeln5076~>6z!oFcr0gUU$gO6?)si^);ke}P%-+GE;=54!dVmH zED|!_s}~(Si)}byl%$#78`zo%Y)u5VJ}G28aIK!ww6{iDRI;#|e(=e%{OyMz9 zkEl|=f2fUrs^soGexJH_cguh;eN_l7sD2%~>(7WRYc%FU>sj^1?!qJm<&+Dd2?)tZ zy<6~b7xb)|9P~J05;dew=#w;?<4p%>;$oJz1{a0+_Jtun(0)rRNX7J|Z)_da>(tQk zw|Y}UD0``)lW(aPzTQwjT2c#ALnq(DfE@T)DohJ5?ogp6wDShld49$N)I<#IznPe~JwxkU= zqk_1XR4YCuByj7Ik8@;e-G+x=rI&?dY-l`s%SgMZ`{6C)Ed83%fFnc^4|OIpMiY7u zByJhfc-T1o+R(HE+UDq4;QwKFpoYRaM1@P79+*7CeUH>8FB*#Gr_>6ekuKEpkc-u4 zJ~BFKk3|pN>HIg+g6YW! zw0+N2Q;Fa&vq1CBJ6+9G!vq?$`cZOT`mnwy*t&waeD{O>16faZShoCruZF)mV!Ur7z`K0HrWm9T@O}a+LDga}JU5wxz1l}CL zHPNQBw;J^vi!?M7UGNqkME7*aBEL=0I}93t?4@?ey&l=>i^sON{t;i-k&}g(ML+b> z+KrFflYBFsK^hJ>#4Py6k+L~@Z{T-<9?F_g{{HR9KQsOlUsil$wDD)IzQE%PuA29b zHvWsN{d*5yo6lrNNc!cDki0vDM2I0G;sbp4abLeef>@9E*DqPSV97$ZUT(M(Z6I(F^IbUUUB-4cYc3$m|s4^hJ;f8h=#u;*oL=tTs-RsI3R8rrg`l;t?hv z?q}uc&iWSi#=#w+9|9wj$rHe!fqZ(jaHbv;cYw|VLoj)7sXBMSZF#-a$^`u^JDcwK zg_-_p3JBv0N<16h$hAdmTXvzH9H?LW< za*f8%1)T7Sjx@fFHW~-`LzmsWLd6djji)(>pqM)IP7}reo?!mSyG_!s{pnl{^rTgWfOqex*O;rE+tpUmPXbGV< z4cEL>`398dr^<^_UYshoqdYfN?m&5Ms(c^H?Wyu3DAQr1F`vPeNRdB59I}^@+p+*HxuO2GV*bymw_f$fU6K!5ia_T0xt-!7*}7s64db@byz7b zTKYub(U?~a89aOTeAV)8H~SE=k+BwBuQ9o`$|_b5e!Fy3mF16{hkx0^HACe4`5xzFPP*`efky*Yp1aMo6v-